From 4888824a96e019e7f7f04e486cd6197972d42acf Mon Sep 17 00:00:00 2001 From: "n.savitchev" Date: Wed, 13 Nov 2024 11:46:46 +0300 Subject: [PATCH] sync on 2024/11/13, rev 74a089e04b4efe3b67b0d61cff4b7b6d10974174 --- DagorEngine.rev.txt | 2 +- .../dagor-ecs/_images/schemeful_events_01.png | Bin 0 -> 135846 bytes .../api-references/dagor-ecs/dagor_ecs.md | 26 +- .../source/api-references/dagor-ecs/index.rst | 2 +- .../dagor-ecs/schemeful_events.md | 391 + .../daScript/daslib/das_source_formatter.das | 58 +- .../daScript/include/daScript/ast/ast.h | 6 +- .../include/daScript/ast/ast_typedecl.h | 3 +- .../include/daScript/misc/memory_model.h | 15 +- .../daScript/include/daScript/misc/platform.h | 4 + .../daScript/simulate/aot_builtin_debugger.h | 2 + .../daScript/include/daScript/simulate/cast.h | 3 +- .../include/daScript/simulate/simulate.h | 1 - .../daScript/simulate/simulate_nodes.h | 2 - .../daScript/src/ast/ast_allocate_stack.cpp | 1 + .../daScript/src/ast/ast_infer_type.cpp | 92 +- .../daScript/src/ast/ast_lint.cpp | 5 +- .../daScript/src/ast/ast_parse.cpp | 24 +- .../daScript/src/ast/ast_print.cpp | 74 +- .../daScript/src/ast/ast_simulate.cpp | 48 +- .../daScript/src/ast/ast_typedecl.cpp | 2 + .../daScript/src/builtin/builtin.das | 16 +- .../src/builtin/module_builtin_ast_flags.cpp | 5 +- .../builtin/module_builtin_ast_serialize.cpp | 2 +- .../src/builtin/module_builtin_debugger.cpp | 15 + .../src/builtin/module_builtin_rtti.cpp | 1 + .../daScript/src/misc/memory_model.cpp | 56 +- .../daScript/src/parser/ds2_lexer.cpp | 1719 ++-- .../daScript/src/parser/ds2_lexer.lpp | 1 - .../daScript/src/parser/ds2_parser.cpp | 6740 +++++++------- .../daScript/src/parser/ds2_parser.ypp | 162 +- .../daScript/src/parser/ds_parser.cpp | 8111 +++++++++-------- .../daScript/src/parser/ds_parser.ypp | 156 +- .../daScript/src/parser/parser_impl.cpp | 4 + .../daScript/src/parser/parser_impl.h | 1 + prog/1stPartyLibs/matching/types.h | 2 - .../ImGuiColorTextEdit/TextEditor.cpp | 10 +- .../SnapdragonSuperResolution.h | 4 + prog/_jBuild/android/clang-link.jam | 9 + prog/_jBuild/android/make_assets_index.py | 40 + prog/_jBuild/jBuild.jam | 49 +- .../modfx/modfx_bboard_render.hlsl | 14 +- .../commonFxGame/modfx/modfx_velocity.hlsli | 12 +- .../commonFxGame/modfx_bboard_render.dshl | 13 +- prog/daNetGame-das-aot/jamfile | 2 +- prog/daNetGame-das-aot/stub.cpp | 4 + prog/daNetGame/dasModules/matchingTypes.cpp | 1 - prog/daNetGame/game/bindApp.cpp | 3 + prog/daNetGame/game/gameLauncherES.cpp.inl | 1 + prog/daNetGame/game/playerES.cpp.inl | 4 +- prog/daNetGame/jamfile | 2 + prog/daNetGame/main/app.cpp | 33 +- prog/daNetGame/main/gameLoad.cpp | 7 +- prog/daNetGame/main/levelES.cpp.inl | 13 +- prog/daNetGame/main/main.cpp | 7 +- prog/daNetGame/main/main.h | 2 + prog/daNetGame/main/watchdogES.cpp.inl | 54 +- prog/daNetGame/net/dedicated.h | 2 +- .../net/dedicated/maindedES.cpp.gen.es.cpp | 10 +- .../daNetGame/net/dedicated/maindedES.cpp.inl | 18 +- prog/daNetGame/net/dedicated/matching.cpp | 84 +- prog/daNetGame/net/dedicated/matching.h | 1 - prog/daNetGame/net/dedicated/netded.cpp | 23 +- .../daNetGame/net/dedicated/stub/dedstubs.cpp | 2 +- prog/daNetGame/net/net.cpp | 9 +- prog/daNetGame/render/XeSuperSampling.cpp | 52 +- prog/daNetGame/render/XeSuperSampling.h | 2 +- .../render/deepLearningSuperSampling.cpp | 64 +- .../render/deepLearningSuperSampling.h | 2 +- .../render/fidelityFXSuperResolution.cpp | 61 +- .../render/fidelityFXSuperResolution.h | 2 +- prog/daNetGame/render/renderAnimCharIcon.cpp | 3 + prog/daNetGame/render/screencap.cpp | 7 +- prog/daNetGame/render/screencap.h | 2 +- .../render/temporalSuperResolution.cpp | 84 +- .../render/temporalSuperResolution.h | 2 +- prog/daNetGame/render/world/bvh.h | 7 +- .../render/world/bvhES.cpp.gen.es.cpp | 6 +- prog/daNetGame/render/world/bvhES.cpp.inl | 119 +- .../world/destructablesRenderES.cpp.inl | 2 +- .../render/world/dynModelRenderer.cpp | 24 +- .../world/frameGraphNodes/frameGraphNodes.h | 6 +- .../world/frameGraphNodes/gbufferNodes.cpp | 10 +- .../world/frameGraphNodes/postFxNodes.cpp | 40 +- .../prepareForPostfxNoAANode.cpp | 8 +- .../render/world/private_worldRenderer.h | 3 +- prog/daNetGame/render/world/worldRenderer.cpp | 41 +- .../scripts/das/remote/jsonrpc_args.das | 2 +- .../scripts/das/remote/jsonrpc_boost.das | 18 +- .../scripts/das/remote/jsonrpc_handler.das | 2 +- prog/daNetGame/scripts/das/remote/server.das | 2 +- .../scripts/das/remote/server_agent.das | 4 +- prog/daNetGame/scripts/stubs/app | 1 + prog/daNetGame/scripts/stubs/appsFlyer | 2 + prog/daNetGame/setup.jam | 2 +- .../shaders/_build/common_assumes.blk | 2 +- .../_build/common_compatibility_assumes.blk | 5 +- .../shaders/_build/common_inc_dirs.blk | 1 + prog/daNetGame/shaders/_build/raytracing.blk | 1 + prog/daNetGame/shaders/_build/shadersList.blk | 1 + .../shaders/_build/shadersListCommon.blk | 1 + .../shaders/_build/shadersListForward.blk | 1 + .../_build/shadersListMobileDeferred.blk | 1 + .../shaders/_build/shadersListOculus.blk | 1 + .../shaders/_build/shaders_dx12xs.blk | 1 + .../shaders/_build/shaders_tools11.blk | 1 + .../animchar_additional_data_types.hlsli | 3 + .../daNetGame/shaders/clipmap_common_inc.dshl | 8 +- prog/daNetGame/shaders/combine_shadows.dshl | 2 +- .../shaders/combine_shadows_common.dshl | 2 +- .../shaders/deferred_light_common.dshl | 12 +- .../shaders/deferred_shadow_common.dshl | 29 +- .../shaders/deferred_shadow_simple.dshl | 3 +- prog/daNetGame/shaders/distortion_postfx.dshl | 129 + prog/daNetGame/shaders/gbuffer.dshl | 18 +- prog/daNetGame/shaders/gbuffer_forward.dshl | 16 +- prog/daNetGame/shaders/gbuffer_thin.dshl | 10 +- prog/daNetGame/shaders/icon_render.dshl | 2 +- .../shaders/optional_puddle_access.dshl | 9 +- prog/daNetGame/shaders/postfx.dshl | 138 +- prog/daNetGame/shaders/postfx_common.dshl | 2 +- prog/daNetGame/shaders/prefab_clipmap.dshl | 1 - prog/daNetGame/shaders/projective_wounds.dshl | 9 + prog/daNetGame/shaders/rendinst_clipmap.dshl | 13 +- .../shaders/rendinst_translucent.dshl | 258 + .../shaders/resolve_thin_g_buffer.dshl | 5 +- prog/daNetGame/shaders/rt/rt_lighting.dshl | 2 + prog/daNetGame/shaders/shader_global.dshl | 6 +- prog/daNetGame/shaders/skinning_inc2.dshl | 48 +- prog/daNetGame/shaders/ssr_common.dshl | 9 +- prog/daNetGame/shaders/tex2DCatmullRom.hlsl | 13 + prog/daNetGame/shaders/use_tiled_lights.dshl | 2 +- prog/daNetGame/shaders/water_3d_ssr.dshl | 13 +- prog/daNetGame/ui/overlayES.cpp.inl | 8 +- prog/daNetGame/ui/uiVideoMode.cpp | 9 +- .../adaptation/render/adaptation_manager.h | 4 +- .../render/adaptation_managerES.cpp.inl | 23 +- .../render/bloodPuddlesES.cpp.gen.es.cpp | 18 +- .../private/render/bloodPuddlesES.cpp.inl | 11 +- .../private/shaders/blood_puddles.dshl | 97 +- .../daGdp/debug/globalManagerDebugES.cpp.inl | 4 +- .../debug/placers/heightmapDebugES.cpp.inl | 8 +- .../daGdp/render/dynShadowsES.cpp.inl | 6 +- .../daGdp/render/globalManagerES.cpp.inl | 14 +- .../daGdp/render/objects/riexES.cpp.inl | 13 +- .../daGdp/render/placers/heightmapES.cpp.inl | 10 +- .../dascript_base/memory_profiler.das | 2 +- .../imgui/anim_graph_common.das | 26 +- .../ecs_inspector_common_types_debug.das | 2 +- .../imgui/daEditor/ecs_inspectors_common.das | 2 +- .../imgui_daeditor/imgui/ecs_anim_graph.das | 2 +- .../render/local_tone_mapping.das | 4 +- .../local_tone_mapping/shaders/apply.dshl | 2 +- .../shaders/downsample.dshl | 89 +- .../local_tone_mapping/shaders/upsample.dshl | 25 + .../animation/load_animation_data_base.cpp | 6 +- .../render/node_collapser_common.das | 5 +- .../puddles_manager/shaders/puddles.dshl | 33 +- .../renderer/templates/blood.template.blk | 10 + .../renderer/templates/bvh.template.blk | 1 + .../templates/render_settings.template.blk | 1 + .../daNetGameLibs/scope/render/aimDofNode.cpp | 1 - .../scope/render/scopeAimRenderES.cpp.inl | 1 + .../render/scopeFullDeferredES.cpp.gen.es.cpp | 12 +- .../scope/render/scopeFullDeferredES.cpp.inl | 15 +- .../scope/render/scopeFullDeferredNodes.cpp | 94 +- .../scope/render/scopeFullDeferredNodes.h | 1 + .../scope/shaders/scope_lens.dshl | 35 +- .../templates/scope_renderer.template.blk | 1 + .../es/sound_field_debug.das | 2 +- .../sound_utils/es/managed_sound_control.das | 12 +- .../sound/sound_utils/es/sound_control.das | 6 +- .../modules/managed_sound_control_common.das | 17 +- .../templates/sound_utils.template.blk | 6 +- prog/dagorInclude/3d/dag_amdFsr.h | 2 + prog/dagorInclude/3d/dag_multidrawContext.h | 59 +- prog/dagorInclude/3d/dag_multidrawInfo.h | 46 + prog/dagorInclude/3d/dag_nvFeatures.h | 3 + prog/dagorInclude/3d/dag_render.h | 1 - prog/dagorInclude/anim/dag_animStateHolder.h | 2 +- .../animChar/dag_animCharacter2.h | 5 + prog/dagorInclude/drv/3d/dag_commands.h | 13 +- prog/dagorInclude/drv/3d/dag_decl.h | 1 + .../dxil/compiled_shader_header.h | 24 + prog/dagorInclude/generic/dag_expected.h | 6 +- prog/dagorInclude/gui/dag_imgui.h | 1 + prog/dagorInclude/gui/dag_stdGuiRender.h | 4 +- prog/dagorInclude/shaders/dag_dynSceneRes.h | 17 + prog/dagorInclude/shaders/dag_shaders.h | 1 + prog/dagorInclude/startup/dag_winMain.inc.cpp | 4 + prog/dagorInclude/util/dag_delayedAction.h | 5 +- prog/engine/anim/animGraph.cpp | 2 +- prog/engine/animChar/animCharBase.cpp | 5 + prog/engine/animChar/animCharacter2.cpp | 5 + prog/engine/baseUtil/delayedActions.cpp | 21 +- prog/engine/drv/drv3d_DX11/drvmain.cpp | 43 - prog/engine/drv/drv3d_DX11/init.cpp | 24 - .../drv/drv3d_DX12/amdFsrD3D12_windows.cpp | 42 +- prog/engine/drv/drv3d_DX12/bindless.cpp | 3 + prog/engine/drv/drv3d_DX12/bindless.h | 11 +- prog/engine/drv/drv3d_DX12/bitfield.h | 1 + prog/engine/drv/drv3d_DX12/buffer.h | 6 +- prog/engine/drv/drv3d_DX12/byte_units.h | 1 + prog/engine/drv/drv3d_DX12/command_list.h | 1085 +-- .../drv/drv3d_DX12/command_stream_set.h | 72 + .../drv/drv3d_DX12/const_register_type.h | 6 +- prog/engine/drv/drv3d_DX12/constants.h | 2 +- .../drv/drv3d_DX12/d3d12_d3d_translation.h | 4 +- .../engine/drv/drv3d_DX12/d3d12_debug_names.h | 4 +- .../drv/drv3d_DX12/d3d12_error_handling.h | 53 +- prog/engine/drv/drv3d_DX12/d3d12_utils.h | 4 +- prog/engine/drv/drv3d_DX12/debug/call_stack.h | 2 +- .../drv3d_DX12/debug/call_stack_full_stack.h | 8 +- .../debug/call_stack_return_address.h | 4 +- .../drv3d_DX12/debug/command_list_logger.h | 695 ++ .../drv3d_DX12/debug/command_list_storage.h | 3 +- .../drv/drv3d_DX12/debug/command_list_trace.h | 10 +- .../debug/command_list_trace_recorder.h | 3 +- .../drv/drv3d_DX12/debug/configuration.h | 3 +- .../drv3d_DX12/debug/device_context_state.h | 1 + .../debug/device_context_state_null.h | 67 +- .../debug/device_context_state_pc.h | 17 +- .../drv/drv3d_DX12/debug/device_state.h | 1 + .../drv/drv3d_DX12/debug/device_state_null.h | 1 + .../drv/drv3d_DX12/debug/device_state_pc.cpp | 9 +- .../drv/drv3d_DX12/debug/device_state_pc.h | 24 +- .../drv3d_DX12/debug/event_marker_tracker.h | 3 +- .../frame_command_logger.cpp} | 56 +- .../drv3d_DX12/debug/frame_command_logger.h | 109 + .../drv/drv3d_DX12/debug/global_state.cpp | 3 +- .../drv/drv3d_DX12/debug/global_state.h | 7 +- .../drv/drv3d_DX12/debug/gpu_capture.cpp | 11 +- .../engine/drv/drv3d_DX12/debug/gpu_capture.h | 21 +- .../drv/drv3d_DX12/debug/gpu_postmortem.h | 3 +- .../debug/gpu_postmortem_ags_trace.cpp | 1 + .../debug/gpu_postmortem_ags_trace.h | 42 +- .../debug/gpu_postmortem_dagor_trace.cpp | 5 +- .../debug/gpu_postmortem_dagor_trace.h | 9 +- .../debug/gpu_postmortem_microsoft_dred.cpp | 8 +- .../debug/gpu_postmortem_microsoft_dred.h | 14 +- .../debug/gpu_postmortem_null_trace.h | 6 +- .../debug/gpu_postmortem_nvidia_aftermath.cpp | 5 +- .../debug/gpu_postmortem_nvidia_aftermath.h | 16 +- .../debug/pipeline_resource_reporter.cpp | 3 +- prog/engine/drv/drv3d_DX12/derived_span.h | 1 + prog/engine/drv/drv3d_DX12/descriptor_heap.h | 14 +- prog/engine/drv/drv3d_DX12/device.cpp | 150 +- prog/engine/drv/drv3d_DX12/device.h | 38 +- .../drv3d_DX12/device_caps_and_shader_model.h | 3 +- prog/engine/drv/drv3d_DX12/device_context.cpp | 365 +- prog/engine/drv/drv3d_DX12/device_context.h | 1155 +-- .../drv/drv3d_DX12/device_context_cmd.h | 78 + .../drv/drv3d_DX12/device_features_config.h | 49 + .../drv/drv3d_DX12/device_memory_class.h | 3 +- prog/engine/drv/drv3d_DX12/device_queue.cpp | 2 +- prog/engine/drv/drv3d_DX12/device_queue.h | 10 +- prog/engine/drv/drv3d_DX12/driver_mutex.h | 2 +- prog/engine/drv/drv3d_DX12/driver_win.h | 3 +- prog/engine/drv/drv3d_DX12/dx12.cpp | 51 +- prog/engine/drv/drv3d_DX12/dynamic_array.h | 3 +- prog/engine/drv/drv3d_DX12/events_pool.h | 6 +- prog/engine/drv/drv3d_DX12/extents.h | 8 +- prog/engine/drv/drv3d_DX12/extra_data_array.h | 17 + .../engine/drv/drv3d_DX12/extra_data_arrays.h | 33 + prog/engine/drv/drv3d_DX12/format_store.cpp | 6 +- prog/engine/drv/drv3d_DX12/format_store.h | 8 +- prog/engine/drv/drv3d_DX12/format_traits.h | 3 +- prog/engine/drv/drv3d_DX12/frame_buffer.h | 318 + prog/engine/drv/drv3d_DX12/frontend_state.h | 16 +- prog/engine/drv/drv3d_DX12/fsr2_wrapper.cpp | 6 +- prog/engine/drv/drv3d_DX12/fsr2_wrapper.h | 3 +- .../drv/drv3d_DX12/fsr2_wrapper_stub.cpp | 2 +- prog/engine/drv/drv3d_DX12/fsr_args.h | 1 + prog/engine/drv/drv3d_DX12/gpu_engine_state.h | 171 + .../host_device_shared_memory_region.h | 6 +- .../drv3d_DX12/image_global_subresource_id.h | 6 +- prog/engine/drv/drv3d_DX12/image_view_state.h | 4 +- prog/engine/drv/drv3d_DX12/info_types.h | 123 + prog/engine/drv/drv3d_DX12/jamfile | 10 +- prog/engine/drv/drv3d_DX12/pipeline.cpp | 206 +- prog/engine/drv/drv3d_DX12/pipeline.h | 69 +- .../drv/drv3d_DX12/pipeline/blk_cache.cpp | 4 +- .../drv/drv3d_DX12/pipeline/blk_cache.h | 7 +- prog/engine/drv/drv3d_DX12/pipeline_cache.cpp | 9 +- prog/engine/drv/drv3d_DX12/pipeline_cache.h | 125 +- prog/engine/drv/drv3d_DX12/platform.h | 12 +- prog/engine/drv/drv3d_DX12/platform_pc.cpp | 2 + prog/engine/drv/drv3d_DX12/query_manager.h | 5 +- prog/engine/drv/drv3d_DX12/render_state.h | 21 +- .../drv/drv3d_DX12/render_target_mask_util.h | 3 + .../resource_manager/basic_buffer.h | 14 +- .../resource_manager/basic_components.h | 37 +- .../resource_manager/buffer_components.cpp | 24 +- .../resource_manager/buffer_components.h | 20 +- .../resource_manager/descriptor_components.h | 32 +- .../resource_manager/esram_components.h | 8 +- .../resource_manager/heap_components.cpp | 4 +- .../resource_manager/heap_components.h | 26 +- .../host_shared_components.cpp | 38 +- .../resource_manager/host_shared_components.h | 28 +- .../drv/drv3d_DX12/resource_manager/image.h | 36 +- .../resource_manager/object_components.h | 29 +- .../raytrace_acceleration_structure.h | 11 +- .../resource_manager/rtx_components.cpp | 10 +- .../resource_manager/rtx_components.h | 36 +- prog/engine/drv/drv3d_DX12/resource_memory.h | 6 +- .../drv/drv3d_DX12/resource_memory_heap.cpp | 7 +- .../drv/drv3d_DX12/resource_memory_heap.h | 6 +- .../drv/drv3d_DX12/resource_state_tracker.h | 22 +- .../drv/drv3d_DX12/resource_update_buffer.cpp | 7 +- .../drv3d_DX12/resource_usage_debugger.cpp | 10 +- prog/engine/drv/drv3d_DX12/ring_pipes.h | 263 + prog/engine/drv/drv3d_DX12/sampler_state.h | 6 +- prog/engine/drv/drv3d_DX12/shader.cpp | 6 +- prog/engine/drv/drv3d_DX12/shader.h | 30 +- .../drv/drv3d_DX12/shader_byte_code_id.h | 5 +- prog/engine/drv/drv3d_DX12/shader_library.cpp | 8 +- prog/engine/drv/drv3d_DX12/shader_library.h | 14 +- .../engine/drv/drv3d_DX12/shader_program_id.h | 4 +- .../drv/drv3d_DX12/stateful_command_buffer.h | 10 +- prog/engine/drv/drv3d_DX12/swapchain.cpp | 4 + prog/engine/drv/drv3d_DX12/swapchain.h | 25 +- prog/engine/drv/drv3d_DX12/tagged_handle.h | 4 + prog/engine/drv/drv3d_DX12/tagged_handles.h | 1 + prog/engine/drv/drv3d_DX12/texture.cpp | 16 +- prog/engine/drv/drv3d_DX12/texture.h | 16 +- prog/engine/drv/drv3d_DX12/util.h | 2 +- prog/engine/drv/drv3d_DX12/variant_vector.h | 10 +- .../engine/drv/drv3d_DX12/versioned_com_ptr.h | 1 + prog/engine/drv/drv3d_DX12/xess_wrapper.cpp | 63 +- prog/engine/drv/drv3d_DX12/xess_wrapper.h | 21 + .../drv/drv3d_DX12/xess_wrapper_stub.cpp | 4 + prog/engine/drv/drv3d_Metal/d3d_shaders.mm | 4 +- prog/engine/drv/drv3d_Metal/render.h | 26 +- prog/engine/drv/drv3d_Metal/render.mm | 33 +- .../engine/drv/drv3d_commonCode/drv_utils.cpp | 6 + prog/engine/drv/drv3d_commonCode/drv_utils.h | 1 + prog/engine/drv/drv3d_commonCode/gpuConfig.h | 4 +- .../drv3d_commonCode/streamline_adapter.cpp | 19 + .../drv/drv3d_commonCode/streamline_adapter.h | 1 + .../streamline_adapter_stub.cpp | 5 + prog/engine/drv/drv3d_pc_multi/init.cpp | 2 +- prog/engine/drv/drv3d_vulkan/buffer_ref.h | 10 +- prog/engine/drv/drv3d_vulkan/d3d/init.cpp | 3 - .../drv/drv3d_vulkan/device_context_cmd.inc | 13 +- .../engine/drv/drv3d_vulkan/driver_config.cpp | 6 +- .../drv3d_vulkan/predicted_latency_waiter.cpp | 15 +- prog/engine/drv/drv3d_vulkan/temp_buffers.cpp | 6 +- prog/engine/imgui/imguiImpl.cpp | 89 + prog/engine/lib3d/setGamma.cpp | 6 - prog/engine/lib3d/texMgrData.h | 2 + .../osApiWrappers/macosx/macAsyncRead.cpp | 1 - prog/engine/shaders/dynSceneRes.cpp | 1 + prog/engine/shaders/scriptSMat.cpp | 9 + prog/engine/shaders/shadersBinaryData.h | 2 + prog/engine/shaders/shadersBinaryDataLoad.cpp | 2 + prog/engine/workCycle/idleCycle.cpp | 8 +- prog/gameLibs/bvh/bvh.cpp | 21 +- prog/gameLibs/bvh/bvh_add_instance.h | 49 +- prog/gameLibs/bvh/bvh_context.h | 3 + prog/gameLibs/bvh/bvh_debug.cpp | 19 +- prog/gameLibs/bvh/bvh_dyn.cpp | 108 +- prog/gameLibs/bvh/bvh_grass.cpp | 2 + prog/gameLibs/bvh/bvh_ri.cpp | 1 + prog/gameLibs/bvh/shaders/bvh.dshl | 69 +- prog/gameLibs/bvh/stub/bvh_stub.cpp | 4 +- prog/gameLibs/bvh/stub/bvh_stub_dyn.cpp | 2 +- .../daECS/core/entityManagerDebug.cpp | 6 +- prog/gameLibs/daGI2/treesAboveDepth.cpp | 33 +- prog/gameLibs/daRg/guiScene.cpp | 1 + prog/gameLibs/daRg/yuvRenderer.cpp | 12 +- prog/gameLibs/daRg/yuvRenderer.h | 7 +- .../shaders/skies2/prepareAltScattering.dshl | 8 +- prog/gameLibs/das/daBfg/daBfg.das | 6 +- prog/gameLibs/das/daBfg/resource_slot.das | 4 +- prog/gameLibs/das/ecs/safe.das | 8 +- prog/gameLibs/dasModules/generic/animchar.cpp | 35 + .../dasModules/pathFinder/pathFinder.cpp | 13 - prog/gameLibs/dxil/shader_header_compiler.cpp | 452 +- .../ecs/debug/ecsDebug.cpp.gen.es.cpp | 73 +- prog/gameLibs/ecs/debug/ecsDebug.cpp.inl | 47 +- .../ecs/game/generic/keyTrackAnimES.cpp.inl | 14 +- .../ecs/phys/animCharFastPhysES.cpp.inl | 6 +- .../ecs/rendInst/rendinstES.cpp.gen.es.cpp | 31 + prog/gameLibs/ecs/rendInst/rendinstES.cpp.inl | 16 + prog/gameLibs/ecs/terraform/terraform.cpp | 4 +- .../rendinst/rendinstCollisionUserInfo.cpp | 2 +- .../rendinst/rendinstContactResultWrapper.cpp | 2 +- .../phys/destrRender/destructablesRender.cpp | 4 +- .../destrRenderStub/destructablesStub.cpp | 2 +- .../gamePhys/phys/destructableObject.cpp | 42 +- prog/gameLibs/gamePhys/phys/rendinstDestr.cpp | 114 +- .../gamePhys/phys/walker/humanPhys.cpp | 13 +- prog/gameLibs/gpuObjects/gpuObjects.cpp | 21 + .../gpuObjects/volumePlacerES.cpp.inl | 7 +- prog/gameLibs/hudprim/hudPrimitives.cpp | 40 +- prog/gameLibs/pathFinder/customNav.cpp | 146 +- prog/gameLibs/pathFinder/pathFinder.cpp | 4 +- .../pathFinder/tileCache/rebuildNavMesh.cpp | 7 - prog/gameLibs/pathFinder/tileCacheCommon.cpp | 21 +- prog/gameLibs/publicInclude/bvh/bvh.h | 6 +- .../publicInclude/bvh/bvh_connection.h | 1 + .../publicInclude/daECS/net/netEvents.h | 2 +- .../publicInclude/daGI2/treesAboveDepth.h | 2 +- .../publicInclude/dasModules/aotPathFinder.h | 26 - .../ecs/core/utility/ecsBlkUtils.h | 1 + .../publicInclude/ecs/terraform/terraform.h | 3 +- .../gamePhys/phys/destructableObject.h | 1 + .../gamePhys/phys/destructableRendObject.h | 2 +- .../gamePhys/phys/rendinstDestr.h | 10 +- .../publicInclude/hudprim/dag_hudPrimitives.h | 30 +- .../publicInclude/pathFinder/customNav.h | 27 + .../publicInclude/pathFinder/pathFinder.h | 4 + .../publicInclude/rendInst/constants.h | 3 +- .../rendInst/rendInstCollision.h | 3 + .../publicInclude/rendInst/rendInstDebris.h | 8 +- .../publicInclude/rendInst/rendInstDebug.h | 15 + .../publicInclude/rendInst/treeDestr.h | 11 +- .../publicInclude/render/bigLightsShadows.h | 2 +- .../publicInclude/render/cascadeShadows.h | 2 +- prog/gameLibs/publicInclude/render/denoiser.h | 1 + .../publicInclude/render/dynmodelRenderer.h | 11 +- .../publicInclude/render/mobile_ssao.h | 9 +- prog/gameLibs/publicInclude/render/rtsm.h | 2 +- .../volumetricLights/volumetricLights.h | 3 - prog/gameLibs/publicInclude/render/whiteTex.h | 2 + .../publicInclude/terraform/terraform.h | 3 +- .../terraform/terraformComponent.h | 5 +- .../quirrel/bindQuirrelEx/dagorSystem.cpp | 13 +- .../rendInst/debug/rendinstRulerDebug.cpp | 53 + prog/gameLibs/rendInst/jamfile | 1 + prog/gameLibs/rendInst/rendInstGen.cpp | 2 +- .../rendInst/rendInstGenCollision.cpp | 47 +- prog/gameLibs/rendInst/rendInstGenDebris.cpp | 84 +- .../rendInst/render/extra/riExtraRendererT.h | 8 +- prog/gameLibs/rendInst/riGen/riGenData.h | 3 +- prog/gameLibs/rendInst/treeDestr.cpp | 19 +- prog/gameLibs/render/bigLightsShadows.cpp | 28 +- prog/gameLibs/render/cascadeShadows.cpp | 44 +- prog/gameLibs/render/denoiser/denoiser.cpp | 93 +- .../dynmodelRenderer/dynmodelRenderer.cpp | 19 +- prog/gameLibs/render/mobile_ssao.cpp | 54 +- .../objectMotionBlur/objectMotionBlur.cpp | 64 +- prog/gameLibs/render/randomGrass.cpp | 4 +- prog/gameLibs/render/rtao/rtao.cpp | 20 +- prog/gameLibs/render/rtao/shaders/rtao.dshl | 8 + prog/gameLibs/render/rtr/rtr.cpp | 10 + prog/gameLibs/render/rtr/shaders/rtr.dshl | 4 +- prog/gameLibs/render/rtsm/rtsm.cpp | 10 +- prog/gameLibs/render/rtsm/rtsm_stub.cpp | 2 +- prog/gameLibs/render/rtsm/shaders/rtsm.dshl | 19 + .../render/rtsm/shaders/rtsm_use.dshl | 4 + .../shaderCacheWarmup/shaderCacheWarmup.cpp | 60 + .../shaders/adaptation/adaptation_cs.dshl | 8 + .../adaptation/exposure/AdaptExposureCS.hlsl | 12 +- .../render/shaders/antialiasing_fxaa.dshl | 4 + .../clustered/cull_out_of_frustum.dshl | 55 +- .../shaders/contrast_adaptive_sharpening.dshl | 7 + prog/gameLibs/render/shaders/csm.dshl | 15 +- .../gameLibs/render/shaders/debugGbuffer.dshl | 4 +- .../render/shaders/downsampleDepth.dshl | 2 +- .../shaders/draw_indirect_buffer_layout.dshl | 0 .../gameLibs/render/shaders/flow_map_inc.dshl | 2 +- .../shaders/giHelpers/trees_above_clear.dshl | 38 + .../render/shaders/hardware_defines.dshl | 97 +- .../render/shaders/hero_matrix_inc.dshl | 12 +- .../render/shaders/pn_triangulation.dshl | 38 +- .../shaders/rt_texture_outputs.inc.hlsli | 1 + .../gameLibs/render/shaders/smootherstep.hlsl | 40 + prog/gameLibs/render/shaders/ssao_inc.dshl | 4 +- .../render/shaders/ssao_reprojection.dshl | 56 +- prog/gameLibs/render/shaders/ssr_base.dshl | 2 +- prog/gameLibs/render/shaders/ssr_common.hlsl | 4 + prog/gameLibs/render/shaders/ssr_compute.dshl | 2 + prog/gameLibs/render/shaders/ssr_ps.dshl | 9 +- prog/gameLibs/render/shaders/tex_view.dshl | 6 +- prog/gameLibs/render/shaders/tsr.dshl | 31 +- prog/gameLibs/render/shaders/tsr.inc.dshl | 1 + .../render/shaders/upscale_sampling.dshl | 4 + .../render/shaders/water_ripples.dshl | 9 +- .../render/shaders/water_ssr_common.hlsl | 13 +- .../render/texcompressors/bcCompressor.cpp | 1 + .../volumetricLights/volumetricLights.cpp | 24 +- prog/gameLibs/render/whiteTex.cpp | 9 +- .../webui/plugins/editorCurves/curveEditor.js | 33 +- prog/samples/commonShaders/ssr_common.dshl | 11 +- prog/scripts/sq/std/string.nut | 25 +- prog/scripts/sq/stubs/dagor.system | 1 + prog/scripts/sq/stubs/ecs | 16 + prog/scripts/sq/stubs/matching.errors | 1 - .../AssetViewer/Entity/colorDlgAppMat.cpp | 2 +- .../animTree/controllers/ctrlChildsDialog.cpp | 11 +- .../animTree/controllers/ctrlChildsDialog.h | 1 - prog/tools/AssetViewer/av_environment.cpp | 1 + .../scripts/animation/anim_tree_av.das | 2 +- prog/tools/ShaderCompiler2/DebugLevel.h | 4 +- prog/tools/ShaderCompiler2/assemblyShader.cpp | 455 +- prog/tools/ShaderCompiler2/assemblyShader.h | 16 +- prog/tools/ShaderCompiler2/codeBlocks.cpp | 62 +- prog/tools/ShaderCompiler2/codeBlocks.h | 2 +- prog/tools/ShaderCompiler2/cppStcode.cpp | 39 +- prog/tools/ShaderCompiler2/cppStcode.h | 17 +- .../ShaderCompiler2/cppStcodePlatformInfo.h | 12 + .../ShaderCompiler2/dx12/asmShaderDXIL.cpp | 7 + .../ShaderCompiler2/dx12/asmShaderDXIL.h | 4 +- prog/tools/ShaderCompiler2/gatherVar.cpp | 123 +- prog/tools/ShaderCompiler2/gatherVar.h | 7 +- prog/tools/ShaderCompiler2/globalConfig.cpp | 14 + prog/tools/ShaderCompiler2/globalConfig.h | 150 + .../hlsl2spirv/asmShaderSpirV.cpp | 24 +- .../hlsl2spirv/asmShaderSpirV.h | 3 +- .../ShaderCompiler2/hlslCompiler/spirv.cpp | 10 +- prog/tools/ShaderCompiler2/jamfile-common | 3 + prog/tools/ShaderCompiler2/jamfile-hlsl2spirv | 2 +- prog/tools/ShaderCompiler2/linkShaders.cpp | 91 +- prog/tools/ShaderCompiler2/linkShaders.h | 2 - prog/tools/ShaderCompiler2/main.cpp | 487 +- prog/tools/ShaderCompiler2/makeShBinDump.cpp | 21 +- prog/tools/ShaderCompiler2/namedConst.cpp | 83 +- prog/tools/ShaderCompiler2/namedConst.h | 3 +- .../ShaderCompiler2/predefines_dx11.hlsl | 3 +- .../ShaderCompiler2/predefines_dx12.hlsl | 2 - .../ShaderCompiler2/predefines_dx12x.hlsl | 1 - .../ShaderCompiler2/predefines_dx12xs.hlsl | 4 +- .../ShaderCompiler2/predefines_metal.hlsl | 3 +- .../ShaderCompiler2/predefines_spirv.hlsl | 1 - prog/tools/ShaderCompiler2/processes.cpp | 186 + prog/tools/ShaderCompiler2/processes.h | 2 +- prog/tools/ShaderCompiler2/processes_impl.h | 60 + prog/tools/ShaderCompiler2/processes_unix.cpp | 265 +- prog/tools/ShaderCompiler2/processes_win.cpp | 269 +- prog/tools/ShaderCompiler2/shCompiler.cpp | 21 +- prog/tools/ShaderCompiler2/shCompiler.h | 4 - prog/tools/ShaderCompiler2/shHardwareOpt.h | 1 + prog/tools/ShaderCompiler2/shLog.cpp | 9 +- prog/tools/ShaderCompiler2/shSemCode.cpp | 7 +- .../ShaderCompiler2/shadervarGenerator.cpp | 36 +- .../ShaderCompiler2/shadervarGenerator.h | 2 +- prog/tools/ShaderCompiler2/shlexterm.cpp | 31 +- prog/tools/ShaderCompiler2/shsem.cpp | 60 +- prog/tools/ShaderCompiler2/shsem.h | 9 +- prog/tools/ShaderCompiler2/winmain_con.cpp | 2 +- .../ec_ViewportWindowStatSettingsDialog.cpp | 16 +- .../libTools/EditorCore/ec_outlinerModel.h | 2 +- .../propPanel/commonWindow/colorDialog.cpp | 4 +- .../propPanel/commonWindow/dialogWindow.cpp | 29 +- .../propPanel/control/panelWindow.cpp | 2 + .../shaderResBuilder/rendInstResSrc.cpp | 2 +- .../assetExp/exporters/exp_rendInst.cpp | 2 +- .../daEditorX/de_ProjectSettings.cpp | 2 +- .../sceneTools/daEditorX/de_startdlg.cpp | 1 + prog/tools/shaderInfo/jamfile | 1 + prog/tools/shaderInfo/shaderInfo.cpp | 104 +- .../ec_ViewportWindowStatSettingsDialog.h | 1 - .../propPanel/commonWindow/colorDialog.h | 3 +- .../propPanel/control/panelWindow.h | 1 + samples/skiesSample/prog/test_app.cpp | 125 +- samples/testGI/prog/test_app.cpp | 160 +- 558 files changed, 18872 insertions(+), 14437 deletions(-) create mode 100644 _docs/source/api-references/dagor-ecs/_images/schemeful_events_01.png create mode 100644 _docs/source/api-references/dagor-ecs/schemeful_events.md create mode 100644 prog/_jBuild/android/make_assets_index.py create mode 100644 prog/daNetGame/shaders/distortion_postfx.dshl create mode 100644 prog/daNetGame/shaders/rendinst_translucent.dshl create mode 100644 prog/dagorInclude/3d/dag_multidrawInfo.h create mode 100644 prog/engine/drv/drv3d_DX12/command_stream_set.h create mode 100644 prog/engine/drv/drv3d_DX12/debug/command_list_logger.h rename prog/engine/drv/drv3d_DX12/{device_context_cmd_log.cpp => debug/frame_command_logger.cpp} (96%) create mode 100644 prog/engine/drv/drv3d_DX12/debug/frame_command_logger.h create mode 100644 prog/engine/drv/drv3d_DX12/device_context_cmd.h create mode 100644 prog/engine/drv/drv3d_DX12/device_features_config.h create mode 100644 prog/engine/drv/drv3d_DX12/extra_data_array.h create mode 100644 prog/engine/drv/drv3d_DX12/extra_data_arrays.h create mode 100644 prog/engine/drv/drv3d_DX12/frame_buffer.h create mode 100644 prog/engine/drv/drv3d_DX12/gpu_engine_state.h create mode 100644 prog/engine/drv/drv3d_DX12/info_types.h create mode 100644 prog/engine/drv/drv3d_DX12/ring_pipes.h create mode 100644 prog/gameLibs/publicInclude/rendInst/rendInstDebug.h create mode 100644 prog/gameLibs/rendInst/debug/rendinstRulerDebug.cpp rename prog/{daNetGame => gameLibs/render}/shaders/draw_indirect_buffer_layout.dshl (100%) create mode 100644 prog/gameLibs/render/shaders/giHelpers/trees_above_clear.dshl create mode 100644 prog/tools/ShaderCompiler2/cppStcodePlatformInfo.h create mode 100644 prog/tools/ShaderCompiler2/globalConfig.cpp create mode 100644 prog/tools/ShaderCompiler2/globalConfig.h create mode 100644 prog/tools/ShaderCompiler2/processes.cpp create mode 100644 prog/tools/ShaderCompiler2/processes_impl.h diff --git a/DagorEngine.rev.txt b/DagorEngine.rev.txt index b391297f2..be3c3f415 100644 --- a/DagorEngine.rev.txt +++ b/DagorEngine.rev.txt @@ -1 +1 @@ -3d88ac71b14c53f13993848988e2531e13355879 +74a089e04b4efe3b67b0d61cff4b7b6d10974174 diff --git a/_docs/source/api-references/dagor-ecs/_images/schemeful_events_01.png b/_docs/source/api-references/dagor-ecs/_images/schemeful_events_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c678b8edbf55a758623bc4d623aa31e5b3853e GIT binary patch literal 135846 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ⓈM%tK3 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�KV-L| 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.das` (e.g., `events_cuisine_royale.das`). The event +declaration consists of an annotation and a description of the event structure. +The annotation specifies whether the event is `unicast` or `broadcast`, and +network routing, if needed, which is covered below. + +**Example:** `events_.das` + +``` +[event(unicast)] +struct CmdCreateMapPoint + x: float + z: float +``` + +```{note} +All events in the file `events_.das` are loaded before Quirrel, +enabling them to be accessed within it. Therefore, events declared for Quirrel +should be placed in this file. Although not mandatory for other events, it is +recommended for consistency. +``` + +## Creating an Event + +- **daScript:** An event is created like any regular instance structure, e.g., + `[[RqUseAbility ability_type=ability_type]]`. +- **Quirrel:** Here, strict validation ensures no typographical errors or + extraneous fields are included, `RqUseAbility({ability_type="ultimate"})`. + +## Subscribing to an Event + +- **daScript:** Use `on_event=RqUseAbility`, or explicitly set the type of the + first argument in the system (e.g., `evt: RqUseAbility...`). +- **Quirrel:** Use `local {OnAbilityCanceled} = require("dasevents")... + ::ecs.register_es("ability_canceling_es", { [OnAbilityCanceled] = @( evt, eid, + comp) ::dlog(evt.ability_type)`. +- **C++:** Events can be listened to by subscribing to the event name, e.g., + `ECS_ON_EVENT(eastl::integral_constant)`. + +## Sending Events (Server-to-Server, Client-to-Client) + +- **daScript:** Use the standard `sendEvent`, `broadcastEvent`. +- **Quirrel:** Similarly, use `::ecs.g_entity_mgr.sendEvent`, + `::ecs.g_entity_mgr.broadcastEvent`. + +## Sending Events Over the Network + +When declaring an event, specify the routing to determine its network path, +e.g., `[event(unicast, routing=ROUTING_SERVER_TO_CLIENT)]`, +`ROUTING_CLIENT_TO_SERVER`, or `ROUTING_CLIENT_CONTROLLED_ENTITY_TO_SERVER`. + +- **daScript:** Use `require net ... send_net_event(eid, evt)` or + `broadcast_net_event(evt)`. +- **Quirrel:** Use `local {CmdBlinkMarker, sendNetEvent, broadcastNetEvent} = + require("dasevents") ... sendNetEvent(eid, CmdBlinkMarker()) ... + broadcastNetEvent(CmdBlinkMarker(...))`. + +## Network Protocol Version + +All declared network events contribute to the protocol version. If the server +and client versions do not match, the client will disconnect from the session. +For script events (`[event]`), you can control this behavior by excluding +certain events from protocol calculations. In cases of a mismatch, this may +result in either an on-screen error or no notification. + +- `event(... net_liable=strict ...)` – The event participates in protocol + versioning; any mismatch triggers a disconnect (default behavior). +- `event(... net_liable=logerr ...)` – The event does not affect protocol + versioning; a log error is recorded if a mismatch occurs. +- `event(... net_liable=ignore ...)` – The event does not affect protocol + versioning; a log warning (`logwarn`) is recorded if a mismatch occurs. + +C++ events follow a similar logic but use the `NET_PROTO_VERSION` constant and +the count of network C++ events, without exceptions. + +## Event Version + +An explicit version can be assigned to an event. By default, all events are set +to version `0`. When working with `BitStream`, the version is required and will +assist in adapting the protocol if the stream content changes significantly. + +**Example:** `code.das` + +``` +[event(broadcast, version=1)] +struct TestEvent {} +``` + +## Sending Containers (Offline and Online) + +Dynamic arrays/containers can be sent along with events. Currently, the +supported types are `ecs::Object`, `ecs::IntList`, `ecs::FloatList`, +`ecs::Point3List`, and `ecs::Point4List`. + +Here's an example of sending such an event from daScript: + +**Example:** `code.das` + +``` +[event(broadcast)] +struct TestEvent + str : string + i : int + obj : ecs::Object const? + +... + using() <| $(var obj : Object) + obj |> set("foo", 1) + broadcastEvent([[TestEvent str="test event", i = 42, obj=ecs_addr(obj)]]) +``` + +```{important} +1. All container types in an event are stored as pointers. +2. When sending a container in an event, use the helper function + `ecs_addr(container)`. +``` + +Sending events from Quirrel follows a similar process: + +**Example:** `code.nut` + +```nut +let {CompObject} = require("ecs") +let {TestEvent, broadcastNetEvent} = require("dasevents") +... +let obj = CompObject() +obj["foo"] = 1 +broadcastNetEvent(TestEvent({str="test event", i=42, obj=obj})) +``` + +```{important} +- Any `ecs::Object` within an event will automatically include a field called + `fromconnid`, which stores the sender's connection ID (on the client side, + this is always `0`, indicating the server; on the server side, it holds the + actual connection number). +- If the container contents undergo substantial changes, it is advisable to + specify an event version (e.g., `[event(... version=1)]`). This will ensure + that clients or servers with outdated versions will no longer support the + event. +``` + +## Sending BitStream + +Similar to containers, a raw data stream (`BitStream`) can also be sent in an +event. When sending a `BitStream`, specifying an event version is mandatory. + +## Reflection + +Events possess an exact schema, accessible at runtime and retrievable from any +script or C++ code. + +- **C++:** All event structure information is stored in `ecs::EventsDB`, which + provides various methods such as `getEventScheme`, `hasEventScheme`, + `getFieldsCount` (for argument count), `getFieldOffset` (for field offset), + `getFieldName` (for field name), `findFieldIndex` (for field index), and + `getEventFieldValue` (for direct access to parameter values). + +- **daScript:** All of functions for C++ are also available in the `ecs` module + for daScript (e.g., `events_db_getFieldsCount`). For example, the **Events + DB** window in *ImGui* uses this API, see + `/prog/scripts/game/es/imgui/ecs_events_db.das`. + +- **Quirrel:** A detailed event printout is available when calling `::log(evt)`, + which outputs all event fields. An API with reflection support is also + provided, as demonstrated below: + +**Example:** `describe_event.nut` + +```nut +local function describeEvent(evt) { + if (evt == null) { + ::dlog("null event") + return + } + + local eventType = evt.getType() + local eventId = ::ecs.g_entity_mgr.getEventsDB().findEvent(eventType) + + local hasScheme = ::ecs.g_entity_mgr.getEventsDB().hasEventScheme(eventId) + if (!hasScheme) { + ::dlog($"event without scheme #{eventType}") + return + } + local fieldsCount = ::ecs.g_entity_mgr.getEventsDB().getFieldsCount(eventId) + ::dlog($"Event {eventType} fields count #{fieldsCount}") + + for (local i = 0; i < fieldsCount; i++) + { + local name = ::ecs.g_entity_mgr.getEventsDB().getFieldName(eventId, i) + local type = ::ecs.g_entity_mgr.getEventsDB().getFieldType(eventId, i) + local offset = ::ecs.g_entity_mgr.getEventsDB().getFieldOffset(eventId, i) + local value = ::ecs.g_entity_mgr.getEventsDB().getEventFieldValue(evt, eventId, i) + ::dlog($"field #{i} {name} <{type}> offset={offset} = '{value}'") + } +} +``` + +## C++ Event (cpp_event) + +In addition to dynamic events, it is possible to declare C++ events, for which +C++ code and SQ bindings will be generated. In Quirrel, handling these events is +identical to working with standard events, as is the case in daScript. + +When declaring a C++ event, the `with_scheme` argument is required. This is +necessary because some events cannot be converted into schemeful events due to +restrictions (fields must be basic ECS types or compatible containers only). + +**Example:** `events_.das` + +``` +[cpp_event(unicast, with_scheme)] +struct EventOnPlayerDash + from: float3 + to: float3 +``` + +The utility `/scripts/genDasevents.bat` will generate a `.h` and `.cpp` +file for this event (currently located at `prog/game/dasEvents.h/cpp`). + +## Quirrel Stubs / C++ Code Generation + +To generate the Quirrel stubs and C++ code automatically, run the batch file +`/scripts/genDasevents.bat`. If the batch file does not work, build the +daScript compiler manually once by running `jam -sPlatform=win64 +-sCheckedContainers=yes` in `/prog/aot`. + +## Filters + +You can manage the list of recipients for server-side das-events using filters. +This is helpful for targeting specific groups, such as only the player or the +player's team. When sending an event, specify the filter as an additional +argument. For instance, `send_net_event(eid, [[EnableSpectator]], +target_entity_conn(eid))`. The following filters are currently supported: + +- `broadcast` (default) – Sends to all recipients. + - equivalent in C++: `&net::broadcast_rcptf`. +- `target_entity_conn` – Sends the event only to the player (the `eid` receiving + the event must be the player's hero or player `eid`). + - equivalent in C++: `&rcptf::entity_ctrl_conn`. +- `entity_team` – Sends the event to the player's hero and team. + - equivalent in C++: `&rcptf::entity_team`. +- `possessed_and_spectated` – Sends the event to the player and any spectators + watching them. + - equivalent in C++: `&rcptf::possessed_and_spectated`. +- `possessed_and_spectated_player` – Similar to `possessed_and_spectated` but + targets the player instead of the hero. + - equivalent in C++: `&rcptf::possessed_and_spectated_player`. + +In daScript, a filter is a function returning an `array`, +which is referred to as a "filter" for consistency with C++ terminology. + +## Filters in Squirrel + +In Squirrel, as in daScript, event-sending methods have an optional parameter +where you can pass an array of connection IDs (i.e., an array of `int`). Below +is an example filter implemented in Squirrel: + +**Example:** `sq_filter.nut` + +```nut +local filtered_by_team_query = ecs.SqQuery("filtered_by_team_query", {comps_ro=[["team", ecs.TYPE_INT], ["connid",ecs.TYPE_INT]], comps_rq=["player"], comps_no=["playerIsBot"]}) + +local function filter_connids_by_team(team){ + local connids = [] + filtered_by_team_query.perform(function(eid, comp){ + connids.append(comp["connid"]) + },"and(ne(connid,{0}), eq(team,{1}))".subst(INVALID_CONNECTION_ID, team)) + return connids +} +``` + +And here is an example of sending an event using this filter: + +**Example:** `sq_send_event.nut` + +```nut +sendNetEvent(eid, RequestNextRespawnEntity({memberEid=eid}), filter_connids_by_team(target_team)) +``` + +## Filters in cpp_event + +When annotating a `cpp_event` with the `filter=` parameter and one of the +filters listed above, the code generation process will produce C++ code that +includes the specified filter as described above in parentheses. + +## Event Delivery Reliability + +By default, all events are sent with a reliability level of `RELIABLE_ORDERED`. +This can be modified using the `reliability` argument. Available reliability +levels include: + +- `UNRELIABLE` +- `UNRELIABLE_SEQUENCED` +- `RELIABLE_ORDERED` +- `RELIABLE_UNORDERED` + +## Enums + +If you need an enumerated type available in both scripts, there's no need to +write it in C++ and bind it separately for each language. The `genDasevents.bat` +utility now supports generating Squirrel code with enums directly from daScript. + +**Follow these steps:** + +1. Define the enum in daScript where needed (preferably in a separate file for + easy parsing during code generation). +2. Explicitly mark the enum with the `[export_enum]` annotation. +3. Add the file path to `genDasevents.bat` with the `--module + scripts/file_with_enum.das` argument. +4. Run `genDasevents.bat`. +5. Constructors for all enums will be available in + `/sq_globals/dasenums.nut`. + +## Utilities + +- `ecs.dump_events` – This console command prints all events, their schemas, and + schema hashes. If there are mismatches between client and server events, this + command can be run on both to compare outputs (the log will already contain + all necessary information for analysis). +- Additionally, there's an in-game window with detailed event information: open + the **ImGui menu** (`F2`) ▸ **Window** ▸ **ECS** ▸ **Events db**. + +Events db + +
+ +## FAQ + +###### I have a C++ network event and want to move its declaration to daScript while keeping the event in C++. (Example: `ECS_REGISTER_NET_EVENT(EventUserMarkDisabled, net::Er::Unicast, net::ROUTING_SERVER_TO_CLIENT, (&rcptf::entity_ctrl_conn));` + +Define the event in daScript with the `[cpp_event(unicast, with_scheme, +routing=ROUTING_SERVER_TO_CLIENT, filter=direct_connection)]` annotation, then +run `genDasevents.bat`. This will generate stubs, and the event will appear or +update in the `.h` and `.cpp` files. (`cpp_event + with_scheme` activates code +generation). + +--- + +###### I have a C++ network event and want to move it entirely to scripts (no need for it in C++). + +Follow the same steps as above, but use `[event(unicast, +routing=ROUTING_SERVER_TO_CLIENT)]`. Replace all `sendEvent` calls with +`send_net_event/sendNetEvent`, passing a filter function call like +`target_entity_conn(eid)` as the final argument. Running `genDasevents.bat` will +still be necessary to generate the stubs. + +--- + +###### I have a script-based event and need to migrate it to C++. + +Simply change the event annotation from `event` to `cpp_event`. Then, replace +all `send_net_event` calls with standard `sendEvent` calls. Run +`genDasevents.bat` to generate the stubs and C++ code. + +--- + +###### I added an event, but I see the following error in Squirrel: `[E] daRg: the index 'CmdHeroSpeech' does not exist`. + +Make sure the event is registered in the system before Quirrel loads. Each game +has an initialization script (e.g., `_init.das`). Load the script +containing the event in this initialization script to resolve the error. + +--- + +###### `genDasevents.bat` shows compilation errors and won't run. + +Rebuild the compiler. + +```{seealso} +For more information, see [daScript plugin for +VSCode](https://marketplace.visualstudio.com/items?itemName=profelis.dascript-plugin). +``` + + diff --git a/prog/1stPartyLibs/daScript/daslib/das_source_formatter.das b/prog/1stPartyLibs/daScript/daslib/das_source_formatter.das index f1d2b1b77..83f5e2d1f 100644 --- a/prog/1stPartyLibs/daScript/daslib/das_source_formatter.das +++ b/prog/1stPartyLibs/daScript/daslib/das_source_formatter.das @@ -24,6 +24,8 @@ let dont_need_space_around <- [[auto "("; ")"; "["; "]"; "\{"; "\}"; let type_after_keyword <- [[auto "generator"; "cast"; "upcast"; "smart_ptr"; "match_type"; "type"; "reinterpret"; "variant"; "variant_index"; "function"; "has_field"; "default"; + "array"; "fixed_array"; "table"; "iterator"; "tuple"; "struct_get_annotation_argument"; + "struct_has_annotation_argument"; "class" ]] enum TokenType @@ -502,7 +504,9 @@ def mark_token_context(var ctx: FormatterCtx) // type in angle brackets for i in range(0, length(ctx.tokens) - 3) if ctx.tokens[i].tokenType == TokenType KEYWORD_OR_IDENTIFIER - if (type_after_keyword |> find_index(ctx.tokens[i].str) >= 0) + if (type_after_keyword |> find_index(ctx.tokens[i].str) >= 0 || + ((ctx |> eq(i, "new") || ctx |> eq(i, "struct")) && ctx |> eq(i + 1, "<")) + ) ctx |> mark_tokens_as_type_inside_angle(i + 1) // type macros $t(identifier) @@ -644,14 +648,10 @@ def fmt_function_arguments(var ctx: FormatterCtx) i++ -def fmt_remove_space_before_generator_args(var ctx: FormatterCtx) - // generator () -> generator() - for i in range(0, length(ctx.tokens) - 3) - if ctx |> eq(i, "generator") && ctx |> eq(i + 1, "<") - var beginParams = i + 1 - var endParams = ctx |> find_pair_angle(i + 1) - if ctx |> eq(endParams + 1, "(") - ctx |> remove_space_before(endParams + 1) +def fmt_remove_space_before_args(var ctx: FormatterCtx) + for i in range(1, length(ctx.tokens) - 1) + if ctx |> eq(i, "(") && !ctx.tokens[i].isInType && ctx.tokens[i - 1].isInType + ctx |> remove_space_before(i) def debug_print_tokens(ctx: FormatterCtx) @@ -706,7 +706,6 @@ def need_spaces_around(ctx: FormatterCtx; index: int): bool assume next = ctx.tokens[index + 1] if t.str == "@" && next.tokenType == TokenType KEYWORD_OR_IDENTIFIER return false - return true @@ -746,6 +745,10 @@ let tokens_before_unary <- [[auto "("; "["; "?["; "\{"; "auto"; "int"; "float"; def is_unary(ctx: FormatterCtx; index: int): bool if ctx |> eq(index, "!") || ctx |> eq(index, "~") return true + + if ctx |> eq(index, "*") && index > 0 && ctx.tokens[index - 1].isInType + return true + if ctx |> eq(index, "+") || ctx |> eq(index, "-") || ctx |> eq(index, "*") if (tokens_before_unary |> find_index(ctx.tokens[index - 1].str) >= 0) || ctx |> new_line_before(index) return true @@ -820,6 +823,8 @@ def fmt_function_call_param_paren_call(var ctx: FormatterCtx) def fmt_spaces_around_operators(var ctx: FormatterCtx) for i in range(1, length(ctx.tokens) - 1) if !empty(ctx.tokens[i].str) + if is_unary(ctx, i) && !new_line_before(ctx, i) + ctx |> remove_space_before(i + 1) if ctx |> need_space_only_before(i) && !is_unary(ctx, i) ctx |> add_space_before(i) elif ctx |> need_spaces_around(i) && !is_unary(ctx, i) @@ -867,6 +872,27 @@ def fmt_remove_space_before_as(var ctx: FormatterCtx) ctx |> remove_space_before(i) +def fmt_remove_space_before_end_of_object(var ctx: FormatterCtx) + // HACK: [[array__remove_this_space__]] + for i in range(1, length(ctx.tokens) - 2) + if !new_line_before(ctx, i) && ctx |> eq(i, "]") && ctx |> eq(i + 1, "]") && (!ctx |> eq(i - 1, "]")) + ctx |> remove_space_before(i) + + +def fmt_remove_space_before_object_type(var ctx: FormatterCtx) + // HACK: [[__remove_this_space__array]] + for i in range(2, length(ctx.tokens) - 1) + if !new_line_before(ctx, i) && ctx |> eq(i - 2, "[") && ctx |> eq(i - 1, "[") && ctx.tokens[i].tokenType == TokenType KEYWORD_OR_IDENTIFIER + ctx |> remove_space_before(i) + + +def fmt_remove_space_before_array_of_type(var ctx: FormatterCtx) + // HACK: array__remove_this_space__[16] + for i in range(1, length(ctx.tokens) - 2) + if !new_line_before(ctx, i) && ctx |> eq(i - 1, ">") && ctx.tokens[i - 1].isInType && ctx |> eq(i, "[") + ctx |> remove_space_before(i) + + let type_specifiers = [[string "?"; "&"; "#"]] def fmt_glue_type_specifiers(var ctx: FormatterCtx) @@ -917,7 +943,17 @@ def do_format(var ctx: FormatterCtx) ctx |> fmt_space_after_paren() ctx |> fmt_space_after_square_brackets() ctx |> fmt_function_arguments() - ctx |> fmt_remove_space_before_generator_args() + ctx |> fmt_remove_space_before_args() + ctx |> fmt_remove_space_before_end_of_object() + ctx |> fmt_remove_space_before_object_type() + ctx |> fmt_remove_space_before_array_of_type() + + let top = length(ctx.tokens) - 1 + for it in range(16) + let i = top - it + if i < 0 || !empty(ctx.tokens[i].str) + break + ctx.tokens[i].spaces = 0 def public format_source_string(file_data: string const& implicit): string diff --git a/prog/1stPartyLibs/daScript/include/daScript/ast/ast.h b/prog/1stPartyLibs/daScript/include/daScript/ast/ast.h index bec3a30aa..267840e85 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/ast/ast.h +++ b/prog/1stPartyLibs/daScript/include/daScript/ast/ast.h @@ -219,6 +219,7 @@ namespace das bool privateField : 1; bool sealed : 1; bool implemented : 1; + bool classMethod : 1; }; uint32_t flags = 0; }; @@ -933,6 +934,7 @@ namespace das bool captureString : 1; bool callCaptureString : 1; bool hasStringBuilder : 1; + bool recursive : 1; // this one is detected by the updateKeepAlive during the simulate, if enabled }; uint32_t moreFlags = 0; }; @@ -1417,7 +1419,8 @@ namespace das bool rtti = false; // create extended RTTI // language bool version_2_syntax = false; // use syntax version 2 - bool gen2_make_syntax = false; // only new make syntax is allowed (no [[...]] or [{...}]) + bool gen2_make_syntax = false; // only new make syntax is allowed (no [[...]] or [{...}]) + bool relaxed_assign = true; // allow = to <- substitution, in certain expressions bool no_unsafe = false; bool local_ref_is_unsafe = true; // var a & = ... unsafe. should be bool no_global_variables = false; @@ -1560,6 +1563,7 @@ namespace das void allocateStack(TextWriter & logs, bool permanent, bool everything); void deriveAliases(TextWriter & logs, bool permanent, bool everything); void updateSemanticHash(); + void updateKeepAliveFlags(); bool simulate ( Context & context, TextWriter & logs, StackAllocator * sharedStack = nullptr ); uint64_t getInitSemanticHashWithDep( uint64_t initHash ); void error ( const string & str, const string & extra, const string & fixme, const LineInfo & at, CompilationError cerr = CompilationError::unspecified ); diff --git a/prog/1stPartyLibs/daScript/include/daScript/ast/ast_typedecl.h b/prog/1stPartyLibs/daScript/include/daScript/ast/ast_typedecl.h index 502c136d7..6dd101a0f 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/ast/ast_typedecl.h +++ b/prog/1stPartyLibs/daScript/include/daScript/ast/ast_typedecl.h @@ -2,6 +2,7 @@ #include "daScript/ast/ast_typefactory.h" #include "daScript/misc/free_list.h" +#include // ULLONG_MAX namespace das { @@ -318,7 +319,7 @@ namespace das { template<> struct ToBasicType { enum { type = Type::tDouble }; }; template<> struct ToBasicType { enum { type = Type::tUInt16 }; }; #endif -#if defined(__linux__) || defined(_TARGET_C1) || defined(_TARGET_C2) +#if !defined(_MSC_VER) && !defined(__APPLE__) && defined(ULLONG_MAX) && ULLONG_MAX == 0xffffffffffffffffULL template<> struct ToBasicType { enum { type = Type::tInt64 }; }; template<> struct ToBasicType { enum { type = Type::tUInt64 }; }; #endif diff --git a/prog/1stPartyLibs/daScript/include/daScript/misc/memory_model.h b/prog/1stPartyLibs/daScript/include/daScript/misc/memory_model.h index c107a0b4f..27ba478ba 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/misc/memory_model.h +++ b/prog/1stPartyLibs/daScript/include/daScript/misc/memory_model.h @@ -271,20 +271,25 @@ namespace das { bool free ( char * ptr, uint32_t size ); char * reallocate ( char * ptr, uint32_t size, uint32_t nsize ); __forceinline int depth() const { return shoe.depth(); } - __forceinline bool isOwnPtr( char * ptr, uint32_t size ) const { #if !DAS_TRACK_ALLOCATIONS + __forceinline bool isOwnPtr( char * ptr, uint32_t size ) const { if ( size<=DAS_MAX_SHOE_ALLOCATION ) return shoe.isOwnPtr(ptr,size); -#endif return (bigStuff.find(ptr)!=bigStuff.end()); } __forceinline bool isAllocatedPtr( char * ptr, uint32_t size ) const { -#if !DAS_TRACK_ALLOCATIONS if ( size<=DAS_MAX_SHOE_ALLOCATION ) return shoe.isAllocatedPtr(ptr,size); -#endif return (bigStuff.find(ptr)!=bigStuff.end()); } +#else + __forceinline bool isOwnPtr( char * ptr, uint32_t ) const { + return (bigStuff.find(ptr)!=bigStuff.end()); + } + __forceinline bool isAllocatedPtr( char * ptr, uint32_t ) const { + return (bigStuff.find(ptr)!=bigStuff.end()); + } +#endif uint32_t bytesAllocated() const { return totalAllocated; } uint32_t maxBytesAllocated() const { return maxAllocated; } uint64_t totalAlignedMemoryAllocated() const; @@ -300,7 +305,7 @@ namespace das { #endif #if DAS_TRACK_ALLOCATIONS das_hash_map bigStuffId; - das_hash_map bigStuffAt; + das_hash_map bigStuffAt; das_hash_map bigStuffComment; __forceinline void mark_location ( void * ptr, const LineInfo * at ) { bigStuffAt[ptr] = at; } __forceinline void mark_comment ( void * ptr, const char * what ) { bigStuffComment[ptr] = what; } diff --git a/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h b/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h index 8f70b2f5c..80f162ce3 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h +++ b/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h @@ -349,6 +349,10 @@ inline size_t das_aligned_memsize(void * ptr){ #define DAS_SANITIZER 0 #endif +#ifndef DAS_TRACK_INSANE_POINTERS +#define DAS_TRACK_INSANE_POINTERS 0 +#endif + // when enabled, TypeDecl, Expression, Variable, Structure, Enumeration and Function // will be filled with 0xcd when deleted #ifndef DAS_MACRO_SANITIZER diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/aot_builtin_debugger.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/aot_builtin_debugger.h index 117656a7e..3befe676a 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/aot_builtin_debugger.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/aot_builtin_debugger.h @@ -36,4 +36,6 @@ namespace das { bool clear_hw_breakpoint ( int32_t bpi ); void break_on_free ( Context & ctx, void * ptr, uint32_t size ); + + void track_insane_pointer ( void * ptr, Context * ctx ); } diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h index a5951e1bf..4df305b2b 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h @@ -3,6 +3,7 @@ #include "daScript/misc/vectypes.h" #include "daScript/misc/arraytype.h" #include "daScript/misc/rangetype.h" +#include // ULLONG_MAX namespace das { @@ -275,7 +276,7 @@ namespace das static __forceinline vec4f from ( uint64_t x ) { return v_cast_vec4f(v_ldui_half(&x)); } }; -#if defined(__linux__) || defined __HAIKU__ || defined(_TARGET_C1) || defined(_TARGET_C2) +#if !defined(_MSC_VER) && !defined(__APPLE__) && defined(ULLONG_MAX) && ULLONG_MAX == 0xffffffffffffffffULL template <> struct cast { static __forceinline long long int to ( vec4f x ) { return v_extract_xi64(v_cast_vec4i(x)); } diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h index 44441af80..f147ab256 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h @@ -1048,7 +1048,6 @@ __forceinline void profileNode ( SimNode * node ) { auto RE = context.abiResult(); context.stopFlags = 0; for ( uint32_t i=0, is=totalFinal; i!=is; ++i ) { - DAS_KEEPALIVE_LOOP(&context); finalList[i]->eval(context); } context.stopFlags = SF; diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate_nodes.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate_nodes.h index 4bd7360a8..2e9f573d1 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate_nodes.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate_nodes.h @@ -2458,7 +2458,6 @@ SIM_NODE_AT_VECTOR(Float, float) virtual SimNode * visit ( SimVisitor & vis ) override; DAS_EVAL_ABI virtual vec4f eval ( Context & context ) override { DAS_PROFILE_NODE - DAS_KEEPALIVE_LOOP(&context); context.stopFlags |= EvalFlags::jumpToLabel; context.gotoLabel = label; return v_zero(); @@ -2472,7 +2471,6 @@ SIM_NODE_AT_VECTOR(Float, float) virtual SimNode * visit ( SimVisitor & vis ) override; DAS_EVAL_ABI virtual vec4f eval ( Context & context ) override { DAS_PROFILE_NODE - DAS_KEEPALIVE_LOOP(&context); context.gotoLabel = subexpr->evalInt(context); context.stopFlags |= EvalFlags::jumpToLabel; return v_zero(); diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_allocate_stack.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_allocate_stack.cpp index 7ab38f245..a264421be 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_allocate_stack.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_allocate_stack.cpp @@ -804,6 +804,7 @@ namespace das { } } auto elet = static_pointer_cast(expr->clone()); + elet->alwaysSafe = true; elet->variables = std::move(expr->variables); for ( auto & evar : elet->variables ) { evar->init = nullptr; diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_infer_type.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_infer_type.cpp index 4c7046e41..345b684e4 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_infer_type.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_infer_type.cpp @@ -57,6 +57,7 @@ namespace das { noUnsafeUninitializedStructs = prog->options.getBoolOption("no_unsafe_uninitialized_structures", prog->policies.no_unsafe_uninitialized_structures); strictProperties = prog->options.getBoolOption("strict_properties", prog->policies.strict_properties); alwaysExportInitializer = prog->options.getBoolOption("always_export_initializer", false); + relaxedAssign = prog->options.getBoolOption("relaxed_assign", prog->policies.relaxed_assign); } bool finished() const { return !needRestart; } bool verbose = true; @@ -96,6 +97,7 @@ namespace das { bool noUnsafeUninitializedStructs = false; bool strictProperties = false; bool alwaysExportInitializer = false; + bool relaxedAssign = false; public: vector extraFunctions; protected: @@ -149,7 +151,7 @@ namespace das { return verbose ? fun->describe() : ""; } protected: - void verifyType ( const TypeDeclPtr & decl, bool allowExplicit = false ) const { + void verifyType ( const TypeDeclPtr & decl, bool allowExplicit = false, bool classMethod = false ) const { // TODO: enable and cleanup if ( decl->isExplicit && !allowExplicit ) { /* @@ -283,7 +285,7 @@ namespace das { verifyType(resultType); } for ( auto & argType : decl->argTypes ) { - if ( argType->ref && argType->isRefType() ) { + if ( !classMethod && (argType->ref && argType->isRefType()) ) { error("can't pass a boxed type by a reference: '" + describeType(argType) + "'", "", "", argType->at,CompilationError::invalid_argument_type); } @@ -1865,6 +1867,10 @@ namespace das { } else if ( !decl.type->canCopy() && !decl.moveSemantics ) { error("field " + decl.name + " can't be copied, use <- instead; " + describeType(decl.type), "", "", decl.init->at, CompilationError::invalid_initialization_type ); + if ( canRelaxAssign(decl.init.get()) ) { + reportAstChanged(); + decl.moveSemantics = true; + } } else if ( !decl.init->type->canCopy() && !decl.init->type->canMove() ) { error("field " + decl.name + "can't be initialized at all; " + describeType(decl.init->type), "", "", decl.at,CompilationError::invalid_initialization_type); @@ -1901,7 +1907,7 @@ namespace das { decl.offset = int(fieldOffset); fieldOffset += decl.type->getSizeOf64(); } - verifyType(decl.type); + verifyType(decl.type, false, decl.classMethod); } FunctionPtr getOrCreateDummy ( Module * mod ) { auto dummy = make_smart(); @@ -2007,6 +2013,10 @@ namespace das { } else if ( !(var->init_via_move || var->init_via_clone) && !var->init->type->canCopy() ) { error("global variable '" + var->name + "' can't be copied", "", "", var->at, CompilationError::cant_copy); + if ( canRelaxAssign(var->init.get()) ) { + reportAstChanged(); + var->init_via_move = true; + } } else if ( var->init_via_move && !var->init->type->canMove() ) { error("global variable '" + var->name + "' can't be moved", "", "", var->at, CompilationError::cant_move); @@ -2636,8 +2646,9 @@ namespace das { + describeType(dvT), "", "", expr->at, CompilationError::cant_dereference); } else { - expr->type = make_smart(*dvT); - expr->type->constant |= expr->subexpr->type->constant; + expr->type = make_smart(*seT->firstType); + expr->type->constant |= expr->subexpr->type->constant | dvT->constant; + expr->type->ref = dvT->ref; // only ref if default value is ref propagateTempType(expr->subexpr->type, expr->type); // t?# ?? def = #t propagateAlwaysSafe(expr->subexpr); } @@ -3084,13 +3095,14 @@ namespace das { } if ( allOtherInferred ) { // we build _::{field.name} ( field, arg1, arg2, ... ) - auto newCall = make_smart(expr->at, "__::" + eField->name); + auto callName = "_::" + eField->name; + auto newCall = make_smart(expr->at, callName); newCall->arguments.push_back(eField->value->clone()); for ( size_t i=2; i!=expr->arguments.size(); ++i ) { newCall->arguments.push_back(expr->arguments[i]->clone()); } auto fcall = inferFunctionCall(newCall.get(), InferCallError::tryOperator); // we infer it - if ( fcall != nullptr ) { + if ( fcall != nullptr || newCall->name != callName ) { reportAstChanged(); return newCall; } @@ -6041,6 +6053,10 @@ namespace das { if ( !expr->left->type->canCopy() ) { error("this type can't be copied"+copyErrorInfo(expr), "", "use move (<-) or clone (:=) instead", expr->at, CompilationError::cant_copy); + if ( canRelaxAssign(expr->right.get()) ) { + reportAstChanged(); + return make_smart(expr->at, expr->left->clone(), expr->right->clone()); + } } expr->type = make_smart(); // we return nothing return Visitor::visit(expr); @@ -6327,6 +6343,10 @@ namespace das { if ( block->moveOnReturn && !expr->moveSemantics ) { error("this type can't be copied; " + describeType(block->type),"","use return <- instead", expr->at, CompilationError::invalid_return_semantics ); + if ( canRelaxAssign(expr->subexpr.get()) ) { + reportAstChanged(); + expr->moveSemantics = true; + } } if ( block->returnType && block->returnType->ref && !safeExpression(expr) ) { error("returning reference requires unsafe", "", "", @@ -6358,6 +6378,10 @@ namespace das { if ( func->moveOnReturn && !expr->moveSemantics ) { error("this type can't be copied; " + describeType(func->result),"","use return <- instead", expr->at, CompilationError::invalid_return_semantics ); + if ( canRelaxAssign(expr->subexpr.get()) ) { + reportAstChanged(); + expr->moveSemantics = true; + } } if ( func->result->ref && !safeExpression(expr) ) { error("returning reference requires unsafe", "", "", @@ -7007,6 +7031,18 @@ namespace das { c2m->arguments.push_back(var->init); return c2m; } + bool canRelaxAssign ( Expression * init ) const { + if ( !relaxedAssign ) return false; + if ( !init->type || !init->type->canMove() ) return false; // only if it can be moved + if ( init->rtti_isMakeLocal() ) return true; // a = [[...]] is always ok to transform to a <- [[...]] + if ( init->rtti_isCallFunc() ) { + auto call = static_cast(init); + if ( call->func && call->func->result && !call->func->result->ref ) { + return true; // a = f() is ok to transform to a <- f(), if its not a function which returns reference + } + } + return false; + } virtual ExpressionPtr visitLetInit ( ExprLet * expr, const VariablePtr & var, Expression * init ) override { local.push_back(var); if ( !var->init->type ) { @@ -7042,7 +7078,6 @@ namespace das { error("local variable " + var->name + " initialization type mismatch. const matters, " + describeType(var->type) + " = " + describeType(var->init->type), "", "", var->at, CompilationError::invalid_initialization_type); - } else if ( !var->type->ref && var->type->isGoodBlockType() ) { if ( !var->init->rtti_isMakeBlock() ) { error("local variable " + var->name + " can only be initialized with make block expression", "", "", @@ -7064,6 +7099,10 @@ namespace das { && var->init->type->canMove() && !(var->init_via_move || var->init_via_clone) ) { error("local variable " + var->name + " can only be move-initialized","","use <- for that", var->at, CompilationError::invalid_initialization_type); + if ( canRelaxAssign(var->init.get()) ) { + reportAstChanged(); + var->init_via_move = true; + } } else if ( var->init_via_move && var->init->type->isConst() ) { error("local variable " + var->name + " can't init (move) from a constant value. " + describeType(var->init->type), "", "", var->at, CompilationError::cant_move); @@ -8160,13 +8199,19 @@ namespace das { if ( !expr->func ) { auto aliasT = findAlias(expr->name); if ( aliasT && aliasT->isTuple() ) { - auto mkt = make_smart(expr->at); - mkt->type = make_smart(*aliasT); - for ( auto & arg : expr->arguments ) { - mkt->values.push_back(arg->clone()); - } reportAstChanged(); - return mkt; + if ( expr->arguments.size() ) { + auto mkt = make_smart(expr->at); + mkt->recordType = make_smart(*aliasT); + for ( auto & arg : expr->arguments ) { + mkt->values.push_back(arg->clone()); + } + return mkt; + } else { + auto mks = make_smart(expr->at); + mks->makeType = make_smart(*aliasT); + return mks; + } } } if ( func && !expr->func && func->isClassMethod && func->arguments.size()>=1 ) { @@ -8298,6 +8343,10 @@ namespace das { if (!fieldType->canCopy() && !decl->moveSemantics) { error("field " + decl->name + " can't be copied; " + describeType(fieldType),"","use <- instead", decl->at, CompilationError::invalid_type); + if ( canRelaxAssign(decl->value.get()) ) { + reportAstChanged(); + decl->moveSemantics = true; + } } else if (decl->moveSemantics && decl->value->type->isConst()) { error("can't move from a constant value " + describeType(decl->value->type), "", "", decl->value->at, CompilationError::cant_move); @@ -8408,6 +8457,10 @@ namespace das { if( !field->type->canCopy() && !decl->moveSemantics ) { error("field " + decl->name + " can't be copied; " + describeType(field->type),"","use <- instead", decl->at, CompilationError::invalid_type ); + if ( canRelaxAssign(decl->value.get()) ) { + reportAstChanged(); + decl->moveSemantics = true; + } } else if (decl->moveSemantics && decl->value->type->isConst()) { error("can't move from a constant value " + describeType(decl->value->type), "", "", decl->value->at, CompilationError::cant_move); @@ -8453,6 +8506,10 @@ namespace das { if( !fldt->canCopy() && !decl->moveSemantics ) { error("field " + decl->name + " can't be copied; " + describeType(fldt),"","use <- instead", decl->at, CompilationError::invalid_type ); + if ( canRelaxAssign(decl->value.get()) ) { + reportAstChanged(); + decl->moveSemantics = true; + } } else if (decl->moveSemantics && decl->value->type->isConst()) { error("can't move from a constant value " + describeType(decl->value->type), "", "", decl->value->at, CompilationError::cant_move); @@ -9091,7 +9148,7 @@ namespace das { error("unknown value type", "", "", expr->at, CompilationError::invalid_type); return Visitor::visit(expr); - } else if ( !expr->recordType->isSameType(*(eval->type),RefMatters::no,ConstMatters::no,TemporaryMatters::no,AllowSubstitute::no) ) { + } else if ( !expr->recordType->isSameType(*(eval->type),RefMatters::no,ConstMatters::no,TemporaryMatters::no,AllowSubstitute::yes) ) { error("incompatible value type. expecting " + describeType(expr->recordType) + " vs " + describeType(eval->type), "", "", eval->at, CompilationError::invalid_type); return Visitor::visit(expr); @@ -9103,6 +9160,11 @@ namespace das { mkt->recordType = make_smart(*expr->recordType); mkt->makeType.reset(); } + if ( !expr->recordType->isSameType(*(eval->type),RefMatters::no,ConstMatters::no,TemporaryMatters::no,AllowSubstitute::no) ) { // disable substitue + // we need a cast + auto cast = make_smart(expr->at, resExpr, make_smart(*expr->recordType)); + resExpr = cast; + } return resExpr; } } diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_lint.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_lint.cpp index b4cbbb967..bc35ae514 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_lint.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_lint.cpp @@ -816,6 +816,7 @@ namespace das { "print_c_style", Type::tBool, "print_func_use", Type::tBool, "gen2_make_syntax", Type::tBool, + "relaxed_assign", Type::tBool, // rtti "rtti", Type::tBool, // optimization @@ -838,7 +839,9 @@ namespace das { "skip_lock_checks", Type::tBool, "skip_module_lock_checks", Type::tBool, // pinvoke - "threadlock_context", Type::tBool + "threadlock_context", Type::tBool, + // version_2_syntax + "gen2", Type::tBool, }; void verifyOptions() { diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_parse.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_parse.cpp index 42f3dc3ab..29d5d1ba6 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_parse.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_parse.cpp @@ -410,8 +410,15 @@ namespace das { continue; } } - if (text[i] == '#' && i + 5 < length && text[i + 1] == 'g' && text[i + 2] == 'e' && text[i + 3] == 'n' && text[i + 4] == '2' && text[i + 5] == '#') { - return true; + // check for options\s*gen2 + if (text[i] == 'o' && i + 7 < length && text[i + 1] == 'p' && text[i + 2] == 't' && text[i + 3] == 'i' && text[i + 4] == 'o' && text[i + 5] == 'n' && text[i + 6] == 's' && isspace(text[i + 7]) ) { + i += 7; + while (i < length && isspace(text[i])) { + ++i; + } + if (i + 4 < length && text[i] == 'g' && text[i + 1] == 'e' && text[i + 2] == 'n' && text[i + 3] == '2') { + return true; + } } } return false; @@ -461,6 +468,7 @@ namespace das { uint32_t len = 0; fi->getSourceAndLength(src,len); bool gen2 = policies.version_2_syntax || detectGen2Syntax(src, len); + program->policies.version_2_syntax = gen2; if ( gen2 ) { das2_yylex_init_extra(&parserState, &scanner); } else { @@ -479,6 +487,12 @@ namespace das { das_yybegin(src, len, scanner); } } + libGroup.foreach([&](Module * mod){ + if ( mod->commentReader ) { + parserState.g_CommentReaders.push_back(mod->commentReader.get()); + } + return true; + },"*"); if ( gen2 ) { err = das2_yyparse(scanner); das2_yylex_destroy(scanner); @@ -486,12 +500,6 @@ namespace das { err = das_yyparse(scanner); das_yylex_destroy(scanner); } - libGroup.foreach([&](Module * mod){ - if ( mod->commentReader ) { - parserState.g_CommentReaders.push_back(mod->commentReader.get()); - } - return true; - },"*"); } else { program->error(fileName + " not found", "","",LineInfo()); program->isCompiling = false; diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_print.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_print.cpp index 9adca8306..476bb6ec2 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_print.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_print.cpp @@ -82,6 +82,7 @@ namespace das { printCStyle = program->options.getBoolOption("print_c_style"); printAliases= program->options.getBoolOption("log_aliasing"); printFuncUse= program->options.getBoolOption("print_func_use"); + gen2 = program->policies.version_2_syntax; } } string str() const { return ss.str(); }; @@ -90,6 +91,7 @@ namespace das { bool printCStyle = false; bool printAliases = false; bool printFuncUse = false; + bool gen2 = false; protected: void newLine () { auto nlPos = ss.tellp(); @@ -1140,13 +1142,39 @@ namespace das { // make structure virtual void preVisit ( ExprMakeStruct * expr ) override { Visitor::preVisit(expr); - ss << "[["; - if ( expr->type ) { - ss << expr->type->describe(); - if ( expr->useInitializer ) { - ss << "()"; + if ( gen2 ) { + if ( expr->structs.empty() ) { + ss << "default<"; + if ( expr->type ) { + ss << expr->type->describe(); + } else { + ss << "/* undefined */"; + } + ss << ">"; + if ( !expr->useInitializer && !expr->constructor ) { + ss << " uninitialized"; + } + } else { + ss << "struct<"; + if ( expr->type ) { + ss << expr->type->describe(); + } else { + ss << "/* undefined */"; + } + ss << ">("; + if ( !expr->useInitializer && !expr->constructor ) { + ss << "uninitialized "; + } + } + } else { + ss << "[["; + if ( expr->type ) { + ss << expr->type->describe(); + if ( expr->useInitializer || expr->constructor ) { + ss << "()"; + } + ss << " "; } - ss << " "; } } virtual void preVisitMakeStructureField ( ExprMakeStruct * expr, int index, MakeFieldDecl * decl, bool last ) override { @@ -1165,26 +1193,46 @@ namespace das { ss << " where "; } virtual ExpressionPtr visit ( ExprMakeStruct * expr ) override { - ss << "]]"; + if ( gen2 ) { + if ( !expr->structs.empty() ) { + ss << ")"; + } + } else { + ss << "]]"; + } return Visitor::visit(expr); } // make tuple virtual void preVisit ( ExprMakeTuple * expr ) override { Visitor::preVisit(expr); - ss << "[["; - if ( expr->type ) { - ss << expr->type->describe(); + if ( gen2 ) { + ss << "tuple"; + if ( expr->type ) { + ss << "<" << expr->type->describe() << ">"; + } else { + ss << ""; + } + ss << "("; } else { - ss << "/* undefined */"; + ss << "[["; + if ( expr->type ) { + ss << expr->type->describe(); + } else { + ss << "/* undefined */"; + } + ss << " "; } - ss << " "; } virtual ExpressionPtr visitMakeTupleIndex ( ExprMakeTuple * expr, int index, Expression * init, bool lastField ) override { if ( !lastField ) ss << ","; return Visitor::visitMakeTupleIndex(expr, index, init, lastField); } virtual ExpressionPtr visit ( ExprMakeTuple * expr ) override { - ss << "]]"; + if ( gen2 ) { + ss << ")"; + } else { + ss << "]]"; + } return Visitor::visit(expr); } // make array diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_simulate.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_simulate.cpp index 196f83f56..f581e524f 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_simulate.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_simulate.cpp @@ -1087,11 +1087,18 @@ namespace das // goto SimNode * ExprGoto::simulate (Context & context) const { + SimNode * result = nullptr; if ( subexpr ) { - return context.code->makeNode(at, subexpr->simulate(context)); + result = context.code->makeNode(at, subexpr->simulate(context)); } else { - return context.code->makeNode(at,label); + result = context.code->makeNode(at,label); } +#if DAS_ENABLE_KEEPALIVE + if ( context.thisProgram->policies.keep_alive ) { + result = context.code->makeNode(at,result); + } +#endif + return result; } // r2v @@ -3055,7 +3062,7 @@ namespace das if ( !doesNotNeedSp && stackTop ) { pCall->cmresEval = context.code->makeNode(at,stackTop); } - if ( func->builtIn ) { + if ( func->builtIn || !func->recursive ) { // TODO: we need to determine, if we need keep-alive for the func // basic function which is not recursive in any shape or form may not need one return pCall; // we don't need keep-alive for the built-in functions @@ -3161,6 +3168,31 @@ namespace das extern "C" int64_t ref_time_ticks (); extern "C" int get_time_usec (int64_t reft); + bool isRecursive ( Function * fun, das_hash_set & visited ) { + if ( visited.find(fun) != visited.end() ) { + return true; + } + visited.insert(fun); + for ( auto call : fun->useFunctions ) { + if ( isRecursive(call, visited) ) { + return true; + } + } + return false; + } + + void Program::updateKeepAliveFlags() { + if ( !policies.keep_alive ) return; + for ( auto mod : library.modules ) { + mod->functions.foreach([&](FunctionPtr & fn){ + if ( fn->builtIn ) return; + if ( !fn->used ) return; + das_hash_set visited; + fn->recursive = isRecursive(fn.get(), visited); + }); + } + } + void Program::updateSemanticHash() { thisModule->structures.foreach([&](StructurePtr & ps){ HashBuilder hb; @@ -3168,7 +3200,7 @@ namespace das das_set adep; ps->ownSemanticHash = ps->getOwnSemanticHash(hb,dep,adep); }); - } + } bool Program::simulate ( Context & context, TextWriter & logs, StackAllocator * sharedStack ) { auto time0 = ref_time_ticks(); @@ -3178,6 +3210,9 @@ namespace das return false; } #endif + if ( policies.keep_alive ) { + updateKeepAliveFlags(); + } isSimulating = true; context.failed = true; astTypeInfo.clear(); // this is to be filled via typeinfo(ast_typedecl and such) @@ -3278,11 +3313,6 @@ namespace das } auto mangledName = pfun->getMangledName(); auto MNH = hash_blockz64((uint8_t *)mangledName.c_str()); - if ( MNH==0 ) { - error("Internalc compiler errors. Mangled name hash is zero. Function " + pfun->name, - "\tMangled name " + mangledName + " hash is " + to_string(MNH), "", - pfun->at); - } fnByMnh[MNH] = pfun.get(); auto & gfun = context.functions[pfun->index]; gfun.name = context.code->allocateName(pfun->name); diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_typedecl.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_typedecl.cpp index 9a2d5a7d6..97b43a3f3 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_typedecl.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_typedecl.cpp @@ -181,6 +181,7 @@ namespace das TT->constant = false; TT->temporary = false; TT->ref = false; + TT->explicitConst = false; aliases[decl->alias] = TT; } } else if ( pass->baseType==Type::autoinfer ) { @@ -191,6 +192,7 @@ namespace das TT->constant = false; TT->temporary = false; TT->ref = false; + TT->explicitConst = false; aliases[pass->alias] = TT; } } else { diff --git a/prog/1stPartyLibs/daScript/src/builtin/builtin.das b/prog/1stPartyLibs/daScript/src/builtin/builtin.das index f26f3836b..546598f14 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/builtin.das +++ b/prog/1stPartyLibs/daScript/src/builtin/builtin.das @@ -742,7 +742,21 @@ def to_array_move(var a:auto(TT)[]) : array return <- arr [skip_lock_check] -def to_array_move(var a:auto(TT)) : array +def to_array_move(a:auto(TT) ==const) : array + unsafe + var arr : array + static_if typeinfo(is_smart_ptr a) + concept_assert(false,"can't create array from smart pointer by value. did you mean [\{Type[1] value\}] instead of [\{Type value\}]") + static_if typeinfo(can_copy a) + arr |> push(a) + static_elif typeinfo(can_move a) + concept_assert(false,"can't move from constant value") + else + concept_assert(false,"this array can't be copied or moved") + return <- arr + +[skip_lock_check] +def to_array_move(var a:auto(TT) ==const) : array unsafe var arr : array static_if typeinfo(is_smart_ptr a) diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_flags.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_flags.cpp index 69c3f9e85..102ebd01b 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_flags.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_flags.cpp @@ -165,7 +165,7 @@ namespace das { ft->alias = "FieldDeclarationFlags"; ft->argNames = { "moveSemantics", "parentType", "capturedConstant", "generated", "capturedRef", "doNotDelete", "privateField", "_sealed", - "implemented" }; + "implemented", "classMethod" }; return ft; } @@ -199,7 +199,8 @@ namespace das { "macroFunction", "needStringCast", "aotHashDeppendsOnArguments", "lateInit", "requestJit", "unsafeOutsideOfFor", "skipLockCheck", "safeImplicit", "deprecated", "aliasCMRES", "neverAliasCMRES", "addressTaken", "propertyFunction", "pinvoke", "jitOnly", "isStaticClassMethod", "requestNoJit", - "jitContextAndLineInfo", "nodiscard", "captureString", "callCaptureString", "hasStringBuilder" + "jitContextAndLineInfo", "nodiscard", "captureString", "callCaptureString", "hasStringBuilder", + "recursive" }; return ft; } diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp index b2925aa72..4cea251c5 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp @@ -2195,7 +2195,7 @@ namespace das { } uint32_t AstSerializer::getVersion () { - static constexpr uint32_t currentVersion = 48; + static constexpr uint32_t currentVersion = 50; return currentVersion; } diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_debugger.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_debugger.cpp index f3d7ac3c8..c80e5cea2 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_debugger.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_debugger.cpp @@ -1201,6 +1201,18 @@ namespace debugapi { ctx.heap->breakOnFree(ptr,size); } +#if DAS_TRACK_INSANE_POINTER + void das_track_insane_pointer ( void * ptr ); +#endif + + void track_insane_pointer ( void * ptr, Context * ctx ) { +#if DAS_TRACK_INSANE_POINTER + das_track_insane_pointer(ptr); +#else + ctx->throw_error("insane pointer tracking is disabled, recompile with DAS_TRACK_INSANE_POINTER=1 && DAS_TRACK_ALLOCATIONS=1"); +#endif + } + class Module_Debugger : public Module { public: Module_Debugger() : Module("debugapi") { @@ -1452,6 +1464,9 @@ namespace debugapi { addExtern(*this, lib, "break_on_free", SideEffects::modifyArgumentAndAccessExternal, "break_on_free") ->args({"context","ptr","size"})->unsafeOperation = true; + addExtern(*this, lib, "track_insane_pointer", + SideEffects::modifyArgumentAndAccessExternal, "track_insane_pointer") + ->args({"ptr","context"})->unsafeOperation = true; // add builtin module compileBuiltinModule("debugger.das",debugger_das,sizeof(debugger_das)); // lets make sure its all aot ready diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_rtti.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_rtti.cpp index 1faab4341..0661fb7f0 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_rtti.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_rtti.cpp @@ -719,6 +719,7 @@ namespace das { // language addField("version_2_syntax"); addField("gen2_make_syntax"); + addField("relaxed_assign"); addField("no_unsafe"); addField("local_ref_is_unsafe"); addField("no_global_variables"); diff --git a/prog/1stPartyLibs/daScript/src/misc/memory_model.cpp b/prog/1stPartyLibs/daScript/src/misc/memory_model.cpp index 07c7b9980..791a06a2f 100644 --- a/prog/1stPartyLibs/daScript/src/misc/memory_model.cpp +++ b/prog/1stPartyLibs/daScript/src/misc/memory_model.cpp @@ -14,6 +14,50 @@ namespace das { } #endif +#if DAS_TRACK_INSANE_POINTERS + + void * das_insane_pointer = nullptr; + das_hash_map g_insane_pointers; // pointer -> who allocated it + mutex g_insane_mutex; + + void das_track_insane_pointer ( void * ptr ) { + lock_guard lock(g_insane_mutex); + das_insane_pointer = ptr; + } + + void inscribeInsanePointer ( void * ptr, void * who ) { + lock_guard lock(g_insane_mutex); + if ( ptr == das_insane_pointer ) { + os_debug_break(); + } + auto it = g_insane_pointers.find(ptr); + if ( it == g_insane_pointers.end() ) { + g_insane_pointers[ptr] = who; + } else { + DAS_FATAL_ERROR("insane pointer %p, already allocated by %p (and not by %p)", ptr, it->second, who); + } + } + + void freeInsanePointer ( void * ptr ) { + lock_guard lock(g_insane_mutex); + auto it = g_insane_pointers.find(ptr); + if ( it != g_insane_pointers.end() ) { + g_insane_pointers.erase(it); + } else { + DAS_FATAL_ERROR("freeing insane pointer %p, which was not allocated", ptr); + } + } + + #define INSCRIBE_INSANE_POINTER(ptr,model) inscribeInsanePointer(ptr,model) + #define FREE_INSANE_POINTER(ptr) freeInsanePointer(ptr) + +#else + + #define INSCRIBE_INSANE_POINTER(ptr,model) + #define FREE_INSANE_POINTER(ptr) + +#endif + MemoryModel::MemoryModel () { alignMask = 15; totalAllocated = 0; @@ -23,11 +67,13 @@ namespace das { MemoryModel::~MemoryModel() { shoe.clear(); for ( auto & itb : bigStuff ) { + FREE_INSANE_POINTER(itb.first); das_aligned_free16(itb.first); } bigStuff.clear(); #if DAS_SANITIZER for ( auto & itb : deletedBigStuff ) { + FREE_INSANE_POINTER(itb.first); das_aligned_free16(itb.first); } deletedBigStuff.clear(); @@ -66,6 +112,7 @@ namespace das { char * ptr = (char *) das_aligned_alloc16(size); bigStuff[ptr] = size; #if DAS_TRACK_ALLOCATIONS + INSCRIBE_INSANE_POINTER(ptr, this); if ( g_tracker==g_breakpoint ) os_debug_break(); bigStuffId[ptr] = g_tracker ++; #endif @@ -109,8 +156,10 @@ namespace das { if ( itb!=bigStuff.end() ) { DAS_ASSERTF(itb->second==size, "free size mismatch, %u allocated vs %u freed", itb->second, size ); #if DAS_SANITIZER + memset(ptr, 0xcd, size); deletedBigStuff[itb->first] = itb->second; #else + FREE_INSANE_POINTER(itb->first); das_aligned_free16(itb->first); #endif bigStuff.erase(itb); @@ -150,8 +199,10 @@ namespace das { void MemoryModel::reset() { for ( auto & itb : bigStuff ) { #if DAS_SANITIZER + memset(itb.first, 0xcd, itb.second); deletedBigStuff[itb.first] = itb.second; #else + FREE_INSANE_POINTER(itb.first); das_aligned_free16(itb.first); #endif } @@ -202,8 +253,11 @@ namespace das { } else { #if DAS_SANITIZER memset ( it->first, 0xcd, it->second ); -#endif + deletedBigStuff[it->first] = it->second; +#else + FREE_INSANE_POINTER(it->first); das_aligned_free16(it->first); +#endif it = bigStuff.erase(it); } } diff --git a/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.cpp b/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.cpp index d6e4805c6..0a6c2531e 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.cpp +++ b/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.cpp @@ -580,8 +580,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 235 -#define YY_END_OF_BUFFER 236 +#define YY_NUM_RULES 234 +#define YY_END_OF_BUFFER 235 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -589,83 +589,83 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[687] = +static const flex_int16_t yy_accept[682] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 22, 0, 0, 236, 235, 234, 226, 233, 234, - 131, 234, 234, 234, 234, 234, 172, 171, 234, 234, - 234, 234, 234, 234, 158, 158, 234, 234, 234, 234, - 234, 234, 130, 174, 234, 173, 234, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 176, 234, 175, - 21, 20, 19, 18, 14, 21, 15, 10, 11, 10, - 10, 10, 7, 6, 23, 22, 13, 12, 216, 0, - 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, - - 201, 205, 208, 0, 0, 3, 200, 211, 197, 0, - 0, 0, 0, 212, 198, 195, 179, 163, 4, 5, - 199, 164, 158, 0, 165, 154, 156, 0, 158, 169, - 154, 156, 177, 194, 0, 0, 0, 0, 196, 220, - 213, 181, 215, 225, 214, 218, 193, 191, 192, 130, - 0, 232, 210, 207, 130, 130, 130, 130, 88, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 28, - 130, 79, 89, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 209, 180, 206, 17, 16, 9, 8, - 23, 22, 0, 0, 187, 186, 189, 183, 190, 184, - 188, 185, 202, 152, 0, 0, 0, 0, 0, 0, - 0, 0, 231, 229, 178, 0, 163, 167, 0, 0, - 233, 0, 157, 163, 0, 164, 168, 0, 0, 166, - 155, 153, 162, 0, 0, 0, 230, 228, 227, 219, - 222, 221, 217, 204, 130, 130, 36, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 34, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - - 26, 130, 130, 130, 130, 130, 130, 110, 130, 130, - 130, 39, 130, 98, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 46, 130, 130, 130, 130, 130, 130, - 130, 42, 130, 130, 130, 130, 130, 203, 0, 0, - 145, 145, 151, 146, 149, 148, 150, 147, 0, 0, - 0, 0, 0, 163, 0, 0, 163, 167, 0, 0, - 164, 166, 170, 0, 162, 160, 161, 161, 0, 0, - 0, 0, 224, 223, 130, 91, 130, 130, 102, 130, - 130, 103, 130, 130, 66, 130, 130, 130, 130, 130, - - 130, 130, 30, 32, 45, 130, 130, 130, 130, 130, - 130, 130, 130, 51, 130, 130, 130, 130, 114, 115, - 116, 130, 111, 130, 130, 130, 0, 0, 130, 92, - 130, 130, 130, 68, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 100, 130, - 97, 117, 130, 130, 130, 130, 0, 0, 130, 104, - 130, 130, 35, 130, 0, 0, 138, 144, 144, 139, - 139, 142, 142, 141, 141, 143, 143, 140, 140, 0, - 0, 163, 161, 159, 0, 130, 75, 130, 130, 57, - 95, 130, 44, 63, 130, 130, 130, 90, 130, 130, - - 130, 101, 130, 130, 126, 130, 130, 130, 130, 130, - 112, 113, 130, 50, 130, 0, 130, 130, 130, 130, - 130, 130, 108, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 74, 61, 130, 130, 130, 122, 123, - 124, 130, 119, 130, 130, 130, 130, 0, 130, 65, - 27, 94, 0, 1, 137, 132, 135, 134, 136, 133, - 0, 0, 0, 0, 130, 37, 130, 130, 130, 130, - 99, 125, 73, 130, 130, 130, 127, 128, 129, 130, - 130, 130, 130, 130, 130, 59, 0, 38, 52, 130, - 130, 130, 130, 53, 130, 130, 130, 130, 93, 71, - - 82, 130, 87, 105, 43, 130, 130, 120, 121, 130, - 85, 67, 109, 0, 40, 130, 0, 130, 130, 25, - 130, 77, 130, 33, 130, 130, 130, 130, 24, 86, - 130, 130, 54, 130, 83, 106, 47, 130, 56, 130, - 130, 130, 48, 130, 130, 130, 62, 0, 72, 118, - 64, 81, 130, 58, 130, 80, 78, 55, 70, 130, - 130, 130, 130, 49, 96, 130, 107, 2, 130, 60, - 130, 84, 130, 29, 130, 130, 130, 130, 130, 76, - 69, 31, 130, 130, 41, 0 + 21, 21, 0, 0, 235, 234, 233, 225, 232, 233, + 130, 233, 233, 233, 233, 233, 171, 170, 233, 233, + 233, 233, 233, 233, 157, 157, 233, 233, 233, 233, + 233, 233, 129, 173, 233, 172, 233, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 175, 233, 174, + 20, 19, 18, 17, 13, 20, 14, 9, 10, 9, + 9, 9, 6, 5, 22, 21, 12, 11, 215, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 200, + + 204, 207, 0, 0, 2, 199, 210, 196, 0, 0, + 0, 0, 211, 197, 194, 178, 162, 3, 4, 198, + 163, 157, 0, 164, 153, 155, 0, 157, 168, 153, + 155, 176, 193, 0, 0, 0, 0, 195, 219, 212, + 180, 214, 224, 213, 217, 192, 190, 191, 129, 0, + 231, 209, 206, 129, 129, 129, 129, 87, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 27, 129, + 78, 88, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 208, 179, 205, 16, 15, 8, 7, 22, + 21, 0, 186, 185, 188, 182, 189, 183, 187, 184, + 201, 151, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 228, 177, 0, 162, 166, 0, 0, 232, 0, + 156, 162, 0, 163, 167, 0, 0, 165, 154, 152, + 161, 0, 0, 0, 229, 227, 226, 218, 221, 220, + 216, 203, 129, 129, 35, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 33, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 25, 129, + + 129, 129, 129, 129, 129, 109, 129, 129, 129, 38, + 129, 97, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 45, 129, 129, 129, 129, 129, 129, 129, 41, + 129, 129, 129, 129, 129, 202, 0, 144, 144, 150, + 145, 148, 147, 149, 146, 0, 0, 0, 0, 0, + 162, 0, 0, 162, 166, 0, 0, 163, 165, 169, + 0, 161, 159, 160, 160, 0, 0, 0, 0, 223, + 222, 129, 90, 129, 129, 101, 129, 129, 102, 129, + 129, 65, 129, 129, 129, 129, 129, 129, 129, 29, + + 31, 44, 129, 129, 129, 129, 129, 129, 129, 129, + 50, 129, 129, 129, 129, 113, 114, 115, 129, 110, + 129, 129, 129, 0, 0, 129, 91, 129, 129, 129, + 67, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 99, 129, 96, 116, 129, + 129, 129, 129, 0, 0, 129, 103, 129, 129, 34, + 129, 0, 137, 143, 143, 138, 138, 141, 141, 140, + 140, 142, 142, 139, 139, 0, 0, 162, 160, 158, + 0, 129, 74, 129, 129, 56, 94, 129, 43, 62, + 129, 129, 129, 89, 129, 129, 129, 100, 129, 129, + + 125, 129, 129, 129, 129, 129, 111, 112, 129, 49, + 129, 0, 129, 129, 129, 129, 129, 129, 107, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 73, + 60, 129, 129, 129, 121, 122, 123, 129, 118, 129, + 129, 129, 129, 0, 129, 64, 26, 93, 0, 136, + 131, 134, 133, 135, 132, 0, 0, 0, 0, 129, + 36, 129, 129, 129, 129, 98, 124, 72, 129, 129, + 129, 126, 127, 128, 129, 129, 129, 129, 129, 129, + 58, 0, 37, 51, 129, 129, 129, 129, 52, 129, + 129, 129, 129, 92, 70, 81, 129, 86, 104, 42, + + 129, 129, 119, 120, 129, 84, 66, 108, 0, 39, + 129, 0, 129, 129, 24, 129, 76, 129, 32, 129, + 129, 129, 129, 23, 85, 129, 129, 53, 129, 82, + 105, 46, 129, 55, 129, 129, 129, 47, 129, 129, + 129, 61, 0, 71, 117, 63, 80, 129, 57, 129, + 79, 77, 54, 69, 129, 129, 129, 129, 48, 95, + 129, 106, 1, 129, 59, 129, 83, 129, 28, 129, + 129, 129, 129, 129, 75, 68, 30, 129, 129, 40, + 0 } ; static const YY_CHAR yy_ec[256] = @@ -712,175 +712,173 @@ static const YY_CHAR yy_meta[76] = 9, 9, 1, 1, 1 } ; -static const flex_int16_t yy_base[723] = +static const flex_int16_t yy_base[718] = { 0, - 0, 0, 0, 0, 74, 80, 76, 82, 1251, 1250, - 90, 96, 1249, 1248, 1250, 1255, 1255, 1255, 1255, 1217, - 1255, 82, 102, 1216, 101, 1204, 1255, 1255, 93, 98, - 117, 106, 150, 111, 174, 48, 100, 160, 109, 83, - 102, 125, 0, 1255, 182, 1255, 134, 172, 182, 133, - 96, 147, 194, 151, 194, 94, 1185, 93, 120, 142, - 170, 210, 200, 210, 197, 175, 1189, 1255, 201, 1255, - 1255, 1255, 1255, 1255, 1255, 242, 1255, 1255, 1255, 1255, - 1224, 1228, 1255, 1255, 0, 214, 1255, 1255, 1255, 256, - 1190, 1255, 0, 0, 0, 0, 0, 0, 0, 0, - - 1255, 1209, 1255, 1228, 244, 1255, 1255, 1255, 1255, 286, - 248, 1195, 1194, 1255, 1255, 1255, 1218, 341, 1255, 283, - 1255, 381, 187, 298, 1255, 1255, 270, 0, 273, 1255, - 1183, 279, 1255, 1255, 339, 279, 1191, 252, 1255, 269, - 1255, 1255, 1255, 1255, 1255, 300, 1255, 1255, 1255, 0, - 343, 1255, 1255, 1202, 1168, 1181, 1183, 1166, 1164, 1162, - 1161, 1165, 1164, 1172, 240, 1175, 1162, 296, 1154, 273, - 1153, 1157, 1160, 310, 1156, 1152, 1155, 1154, 1147, 0, - 1150, 285, 0, 1159, 322, 1144, 1158, 1139, 1149, 287, - 1154, 1140, 1148, 1154, 1142, 323, 1153, 1152, 1151, 160, - - 1149, 285, 1135, 1134, 1135, 319, 1144, 1145, 1128, 1135, - 320, 1124, 1137, 1255, 1255, 1156, 1255, 1255, 1255, 1255, - 0, 353, 398, 1127, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 334, 1174, 1173, 1172, 1171, 1170, 1169, - 1165, 1176, 1255, 1255, 1255, 419, 1255, 1255, 1125, 392, - 1255, 393, 1255, 412, 434, 1255, 1255, 1124, 450, 429, - 1255, 1255, 371, 1157, 1160, 1171, 1255, 1255, 1255, 1141, - 1255, 1255, 1140, 1255, 1105, 1106, 0, 1121, 1101, 1106, - 1113, 1115, 1106, 1115, 1096, 1095, 1095, 322, 1111, 1106, - 1105, 1107, 1102, 1102, 1094, 333, 1087, 1103, 1098, 1101, - - 0, 1098, 1095, 1085, 1087, 1086, 1093, 461, 1078, 1089, - 1091, 449, 1072, 0, 1080, 1073, 1080, 1071, 1069, 1065, - 1074, 1077, 1069, 1069, 1061, 1060, 1068, 1061, 1060, 1057, - 360, 1064, 1069, 0, 1062, 1067, 1052, 1057, 1068, 1067, - 1054, 488, 1062, 1048, 1053, 1055, 1051, 1255, 474, 1085, - 1079, 1078, 427, 439, 463, 464, 465, 467, 1090, 494, - 1101, 508, 494, 487, 395, 532, 1255, 1255, 1050, 540, - 488, 1255, 1255, 1049, 530, 1255, 543, 545, 1086, 522, - 1097, 572, 1255, 1255, 1035, 0, 1027, 1038, 0, 1040, - 1038, 0, 1037, 1026, 0, 1027, 1025, 1034, 1022, 1022, - - 1034, 1028, 0, 0, 0, 1035, 1028, 1031, 1024, 1030, - 1014, 1013, 1014, 0, 1021, 1009, 1014, 1047, 0, 0, - 0, 1048, 0, 1024, 1013, 1019, 531, 1049, 1010, 0, - 1019, 1005, 1001, 0, 1016, 1007, 1010, 993, 994, 1003, - 994, 1005, 1004, 989, 998, 993, 1002, 999, 0, 998, - 529, 571, 993, 995, 982, 992, 585, 1025, 996, 0, - 991, 990, 0, 990, 1033, 1031, 1255, 1010, 1009, 1008, - 1007, 1006, 1005, 1004, 1003, 1002, 1001, 992, 951, 963, - 585, 567, 1255, 1255, 962, 927, 0, 896, 895, 0, - 0, 882, 0, 0, 884, 883, 888, 0, 887, 871, - - 848, 0, 838, 845, 598, 834, 841, 837, 809, 796, - 0, 0, 791, 0, 808, 834, 784, 769, 774, 777, - 760, 775, 797, 771, 770, 751, 754, 762, 761, 765, - 754, 749, 736, 0, 0, 749, 740, 766, 0, 0, - 0, 767, 0, 725, 738, 723, 730, 778, 720, 0, - 0, 0, 0, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 764, 566, 763, 599, 721, 0, 712, 717, 701, 701, - 0, 0, 0, 704, 688, 710, 0, 0, 0, 696, - 690, 685, 688, 670, 585, 0, 642, 1255, 0, 583, - 578, 591, 589, 0, 615, 575, 574, 585, 0, 0, - - 0, 574, 589, 0, 0, 473, 581, 0, 0, 577, - 0, 0, 605, 628, 1255, 564, 622, 562, 576, 0, - 574, 0, 558, 0, 553, 555, 541, 534, 0, 0, - 527, 515, 0, 526, 0, 0, 0, 510, 0, 483, - 491, 471, 0, 466, 433, 443, 0, 428, 0, 0, - 0, 0, 366, 0, 364, 0, 0, 0, 0, 333, - 326, 324, 304, 0, 0, 278, 0, 1255, 286, 0, - 259, 0, 239, 0, 195, 118, 90, 96, 56, 0, - 0, 0, 38, 37, 0, 1255, 647, 659, 671, 683, - 695, 707, 719, 726, 738, 750, 761, 772, 783, 794, - - 805, 816, 827, 838, 845, 849, 861, 873, 880, 887, - 899, 911, 923, 930, 937, 949, 961, 968, 980, 992, - 1004, 1016 + 0, 0, 0, 0, 74, 80, 76, 82, 1246, 1245, + 90, 96, 1244, 1243, 1245, 1250, 1250, 1250, 1250, 1212, + 1250, 82, 80, 1211, 79, 1199, 1250, 1250, 92, 99, + 117, 107, 141, 123, 174, 72, 112, 168, 159, 94, + 102, 140, 0, 1250, 147, 1250, 113, 172, 120, 146, + 128, 148, 161, 179, 189, 66, 1180, 178, 117, 186, + 135, 204, 198, 204, 155, 101, 1184, 1250, 219, 1250, + 1250, 1250, 1250, 1250, 1250, 228, 1250, 1250, 1250, 1250, + 1219, 1223, 1250, 1250, 0, 256, 1250, 1250, 1250, 255, + 1250, 0, 0, 0, 0, 0, 0, 0, 0, 1250, + + 1205, 1250, 1224, 245, 1250, 1250, 1250, 1250, 282, 275, + 1191, 1190, 1250, 1250, 1250, 1214, 337, 1250, 271, 1250, + 377, 197, 292, 1250, 1250, 147, 0, 285, 1250, 1179, + 284, 1250, 1250, 331, 277, 1187, 231, 1250, 268, 1250, + 1250, 1250, 1250, 1250, 289, 1250, 1250, 1250, 0, 325, + 1250, 1250, 1198, 1164, 1177, 1179, 1162, 1160, 1158, 1157, + 1161, 1160, 1168, 275, 1171, 1158, 286, 1150, 276, 1149, + 1153, 1156, 278, 1152, 1148, 1151, 1150, 1143, 0, 1146, + 281, 0, 1155, 296, 1140, 1154, 1135, 1145, 301, 1150, + 1136, 1144, 1150, 1138, 316, 1149, 1148, 1147, 225, 1145, + + 309, 1131, 1130, 1131, 312, 1140, 1141, 1124, 1131, 329, + 1120, 1133, 1250, 1250, 1152, 1250, 1250, 1250, 1250, 0, + 381, 394, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 330, 1171, 1170, 1169, 1168, 1167, 1166, 1162, 1173, + 1250, 1250, 1250, 415, 1250, 1250, 1122, 351, 1250, 388, + 1250, 374, 428, 1250, 1250, 1121, 436, 428, 1250, 1250, + 408, 1154, 1157, 1168, 1250, 1250, 1250, 1138, 1250, 1250, + 1137, 1250, 1102, 1103, 0, 1118, 1098, 1103, 1110, 1112, + 1103, 1112, 1093, 1092, 1092, 358, 1108, 1103, 1102, 1104, + 1099, 1099, 1091, 326, 1084, 1100, 1095, 1098, 0, 1095, + + 1092, 1082, 1084, 1083, 1090, 445, 1075, 1086, 1088, 472, + 1069, 0, 1077, 1070, 1077, 1068, 1066, 1062, 1071, 1074, + 1066, 1066, 1058, 1057, 1065, 1058, 1057, 1054, 240, 1061, + 1066, 0, 1059, 1064, 1049, 1054, 1065, 1064, 1051, 478, + 1059, 1045, 1050, 1052, 1048, 1250, 478, 1077, 1076, 367, + 444, 445, 447, 448, 449, 1088, 372, 1099, 505, 496, + 489, 493, 530, 1250, 1250, 1048, 538, 492, 1250, 1250, + 1047, 528, 1250, 542, 543, 1084, 512, 1095, 570, 1250, + 1250, 1033, 0, 1025, 1036, 0, 1038, 1036, 0, 1035, + 1024, 0, 1025, 1023, 1032, 1020, 1020, 1032, 1026, 0, + + 0, 0, 1033, 1026, 1029, 1022, 1028, 1012, 1011, 1012, + 0, 1019, 1007, 1012, 1045, 0, 0, 0, 1046, 0, + 1022, 1011, 1017, 574, 1047, 1008, 0, 1017, 1003, 999, + 0, 1014, 1005, 1008, 991, 992, 1001, 992, 1003, 1002, + 987, 996, 991, 1000, 997, 0, 996, 477, 580, 991, + 993, 980, 990, 607, 1023, 994, 0, 989, 988, 0, + 988, 1031, 1250, 1009, 1008, 1007, 1006, 1005, 1004, 1003, + 1002, 1001, 1000, 999, 990, 962, 594, 540, 1250, 1250, + 961, 927, 0, 921, 894, 0, 0, 881, 0, 0, + 884, 884, 887, 0, 886, 871, 885, 0, 838, 848, + + 512, 833, 840, 837, 834, 796, 0, 0, 790, 0, + 807, 851, 783, 768, 773, 776, 765, 774, 796, 770, + 769, 756, 753, 761, 760, 764, 759, 748, 735, 0, + 0, 748, 739, 771, 0, 0, 0, 766, 0, 724, + 737, 722, 735, 777, 719, 0, 0, 0, 0, 1250, + 1250, 1250, 1250, 1250, 1250, 763, 524, 762, 568, 726, + 0, 711, 716, 700, 700, 0, 0, 0, 709, 687, + 709, 0, 0, 0, 695, 689, 698, 687, 686, 659, + 0, 641, 1250, 0, 582, 577, 590, 588, 0, 614, + 574, 573, 584, 0, 0, 0, 573, 588, 0, 0, + + 359, 580, 0, 0, 576, 0, 0, 604, 627, 1250, + 563, 621, 560, 574, 0, 572, 0, 557, 0, 549, + 550, 545, 533, 0, 0, 533, 532, 0, 540, 0, + 0, 0, 527, 0, 521, 438, 527, 0, 523, 521, + 516, 0, 530, 0, 0, 0, 0, 467, 0, 466, + 0, 0, 0, 0, 433, 429, 433, 425, 0, 0, + 413, 0, 1250, 397, 0, 342, 0, 313, 0, 300, + 278, 181, 171, 82, 0, 0, 0, 64, 37, 0, + 1250, 645, 657, 669, 681, 693, 705, 717, 724, 736, + 748, 759, 770, 781, 792, 803, 814, 825, 836, 843, + + 847, 859, 871, 878, 885, 897, 909, 921, 928, 935, + 947, 959, 966, 978, 990, 1002, 1014 } ; -static const flex_int16_t yy_def[723] = +static const flex_int16_t yy_def[718] = { 0, - 687, 687, 686, 3, 688, 688, 689, 689, 690, 690, - 691, 691, 692, 692, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 693, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 35, 686, 686, 686, 686, - 686, 686, 694, 686, 686, 686, 686, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 695, 686, 686, 686, 686, 686, - 686, 686, 696, 697, 698, 699, 700, 701, 702, 703, - - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 704, - 686, 686, 35, 686, 686, 686, 686, 705, 706, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 694, - 686, 686, 686, 686, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 686, 686, 686, 686, 686, 686, 686, - 695, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 707, 708, 686, 686, 686, 686, 686, 686, 686, 704, - 686, 704, 686, 122, 686, 686, 686, 686, 686, 709, - 686, 686, 710, 686, 711, 712, 686, 686, 686, 686, - 686, 686, 686, 686, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 707, 713, - 708, 686, 686, 714, 704, 686, 686, 686, 686, 686, - 715, 686, 686, 686, 710, 686, 686, 686, 711, 716, - 712, 686, 686, 686, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 686, 686, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 686, 686, 694, 694, - 694, 694, 694, 694, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 717, - 686, 718, 686, 686, 719, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 720, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 721, 694, 694, - 694, 694, 722, 686, 686, 686, 686, 686, 686, 686, - 717, 713, 719, 716, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 720, 686, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 721, 686, 694, 722, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 686, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 686, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 0, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686 + 682, 682, 681, 3, 683, 683, 684, 684, 685, 685, + 686, 686, 687, 687, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 688, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 35, 681, 681, 681, 681, + 681, 681, 689, 681, 681, 681, 681, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 690, 681, 681, 681, 681, 681, + 681, 691, 692, 693, 694, 695, 696, 697, 698, 681, + + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 699, 681, + 681, 35, 681, 681, 681, 681, 700, 701, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 689, 681, + 681, 681, 681, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 681, 681, 681, 681, 681, 681, 681, 690, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 702, 703, + 681, 681, 681, 681, 681, 681, 681, 699, 681, 699, + 681, 121, 681, 681, 681, 681, 681, 704, 681, 681, + 705, 681, 706, 707, 681, 681, 681, 681, 681, 681, + 681, 681, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 702, 708, 703, 681, 681, + 709, 699, 681, 681, 681, 681, 681, 710, 681, 681, + 681, 705, 681, 681, 681, 706, 711, 707, 681, 681, + 681, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 681, 681, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 681, 681, 689, 689, 689, 689, 689, + 689, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 712, 681, 713, 681, 681, + 714, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 715, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 716, 689, 689, 689, 689, 717, 681, + 681, 681, 681, 681, 681, 712, 708, 714, 711, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 715, 681, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 716, 681, + 689, 717, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 681, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 681, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 0, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681 } ; -static const flex_int16_t yy_nxt[1331] = +static const flex_int16_t yy_nxt[1326] = { 0, 17, 18, 19, 18, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, @@ -890,147 +888,147 @@ static const flex_int16_t yy_nxt[1331] = 51, 52, 53, 54, 43, 55, 43, 56, 57, 58, 59, 60, 43, 61, 62, 63, 64, 65, 66, 43, 67, 43, 68, 69, 70, 72, 73, 74, 79, 80, - 75, 72, 73, 74, 79, 80, 75, 685, 686, 684, + 75, 72, 73, 74, 79, 80, 75, 680, 91, 101, 81, 86, 16, 16, 86, 82, 81, 86, 16, 16, 86, 82, 90, 90, 90, 90, 90, 90, 90, 90, - 92, 102, 106, 108, 143, 144, 76, 686, 110, 110, - 110, 110, 76, 114, 107, 119, 139, 683, 133, 109, - 120, 134, 103, 145, 146, 91, 111, 115, 116, 140, - 141, 185, 121, 147, 188, 186, 77, 168, 682, 93, - 94, 95, 77, 96, 97, 681, 169, 98, 148, 189, - 112, 135, 135, 135, 135, 153, 149, 99, 117, 100, - 118, 118, 118, 118, 118, 118, 118, 118, 154, 136, - 165, 190, 142, 151, 152, 151, 151, 191, 680, 192, - 166, 113, 122, 167, 123, 123, 123, 123, 123, 123, - - 123, 123, 178, 137, 170, 193, 171, 330, 194, 124, - 125, 179, 126, 127, 128, 222, 172, 195, 222, 129, - 155, 196, 156, 331, 130, 124, 125, 686, 157, 211, - 212, 131, 214, 215, 138, 158, 159, 161, 160, 162, - 132, 173, 163, 128, 209, 164, 180, 201, 217, 174, - 679, 175, 181, 182, 176, 234, 686, 210, 183, 184, - 177, 197, 241, 202, 198, 205, 203, 242, 199, 206, - 204, 207, 223, 208, 216, 200, 90, 90, 90, 90, - 90, 90, 90, 90, 218, 251, 235, 110, 110, 110, - 110, 264, 236, 265, 678, 268, 237, 261, 266, 270, - - 271, 285, 252, 238, 286, 111, 261, 239, 262, 240, - 677, 126, 127, 259, 217, 259, 217, 262, 260, 260, - 260, 260, 260, 260, 260, 260, 269, 262, 293, 112, - 126, 272, 273, 676, 306, 675, 262, 294, 316, 132, - 135, 135, 135, 135, 151, 152, 151, 151, 289, 307, - 308, 333, 317, 290, 222, 334, 674, 222, 136, 291, - 113, 118, 118, 118, 118, 118, 118, 118, 118, 298, - 310, 344, 323, 351, 338, 345, 246, 247, 324, 299, - 311, 673, 137, 339, 406, 325, 397, 398, 326, 672, - 407, 248, 246, 247, 251, 251, 671, 251, 249, 253, - - 352, 254, 254, 254, 254, 254, 254, 254, 254, 376, - 377, 252, 365, 138, 365, 446, 255, 256, 349, 349, - 349, 349, 349, 349, 349, 349, 447, 670, 376, 669, - 686, 257, 255, 256, 363, 668, 363, 378, 258, 364, - 364, 364, 364, 364, 364, 364, 364, 366, 367, 370, - 427, 370, 427, 427, 371, 371, 371, 371, 371, 371, - 371, 371, 368, 366, 367, 372, 468, 667, 428, 369, - 260, 260, 260, 260, 260, 260, 260, 260, 470, 373, - 666, 372, 418, 419, 420, 421, 374, 422, 423, 457, - 465, 457, 457, 469, 349, 349, 349, 349, 349, 349, - - 349, 349, 472, 474, 476, 471, 478, 458, 360, 110, - 110, 110, 110, 362, 364, 364, 364, 364, 364, 364, - 364, 364, 642, 247, 256, 643, 665, 111, 664, 473, - 475, 477, 427, 479, 427, 427, 380, 248, 257, 247, - 256, 382, 662, 459, 249, 258, 663, 481, 661, 481, - 428, 112, 482, 482, 482, 482, 482, 482, 482, 482, - 371, 371, 371, 371, 371, 371, 371, 371, 376, 377, - 483, 660, 483, 135, 135, 135, 135, 659, 658, 536, - 562, 484, 113, 484, 537, 362, 457, 376, 457, 457, - 657, 136, 538, 539, 540, 541, 378, 542, 543, 656, - - 484, 655, 484, 367, 458, 482, 482, 482, 482, 482, - 482, 482, 482, 564, 654, 137, 653, 368, 382, 367, - 577, 578, 579, 652, 369, 651, 650, 649, 648, 647, - 615, 646, 645, 644, 641, 640, 639, 638, 637, 636, - 635, 634, 633, 632, 588, 631, 138, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 85, 85, 85, 85, 85, - - 85, 85, 85, 85, 85, 85, 85, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 104, - 104, 630, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 150, 150, 150, 150, 150, 150, 150, 221, 629, - 628, 221, 221, 221, 221, 221, 221, 221, 221, 221, - 225, 225, 225, 225, 225, 627, 626, 625, 624, 623, - 225, 226, 226, 226, 226, 226, 622, 621, 620, 619, - 618, 226, 227, 227, 227, 227, 227, 564, 562, 616, - 615, 613, 227, 228, 228, 228, 228, 228, 612, 611, - 610, 609, 608, 228, 229, 229, 229, 229, 229, 607, - - 606, 605, 604, 603, 229, 230, 230, 230, 230, 230, - 602, 601, 600, 599, 598, 230, 231, 231, 231, 231, - 231, 597, 596, 595, 594, 593, 231, 232, 232, 232, - 232, 232, 592, 591, 590, 589, 588, 232, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 263, 263, 263, 129, 129, 586, 585, 584, 129, 583, - 129, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 260, 582, 260, 581, 580, - 576, 260, 375, 375, 375, 575, 375, 574, 375, 379, - - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 480, 480, 480, 480, 480, 480, 480, - 480, 480, 480, 480, 480, 364, 573, 364, 572, 571, - 570, 364, 371, 569, 371, 568, 567, 566, 371, 485, - 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, - 485, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 482, 565, 482, 564, 562, 560, 482, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, - - 587, 587, 587, 587, 614, 614, 614, 614, 614, 614, - 614, 614, 614, 614, 614, 614, 617, 617, 617, 560, - 617, 617, 617, 617, 617, 617, 617, 617, 559, 559, - 558, 558, 557, 557, 556, 556, 555, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 535, - 534, 533, 532, 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, 488, 487, 486, 382, - - 380, 373, 368, 362, 360, 467, 467, 466, 464, 463, - 462, 461, 460, 456, 455, 454, 453, 452, 451, 450, - 449, 448, 445, 444, 443, 442, 441, 440, 439, 438, - 437, 436, 435, 434, 433, 432, 431, 430, 429, 426, - 425, 424, 417, 416, 415, 414, 413, 412, 411, 410, - 409, 408, 405, 404, 403, 402, 401, 400, 399, 396, - 395, 394, 393, 392, 391, 390, 389, 388, 387, 386, - 385, 384, 383, 382, 380, 253, 257, 248, 362, 360, - 358, 357, 356, 355, 354, 353, 350, 348, 347, 346, - 343, 342, 341, 340, 337, 336, 335, 332, 329, 328, - - 327, 322, 321, 320, 319, 318, 315, 314, 313, 312, - 309, 305, 304, 303, 302, 301, 300, 297, 296, 295, - 292, 288, 287, 284, 283, 282, 281, 280, 279, 278, - 277, 276, 275, 274, 267, 130, 245, 244, 243, 234, - 233, 224, 220, 219, 213, 187, 105, 101, 89, 686, - 88, 88, 84, 84, 15, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686 + 102, 105, 681, 184, 107, 679, 76, 185, 109, 109, + 109, 109, 76, 106, 113, 142, 143, 92, 93, 94, + 108, 95, 96, 144, 145, 97, 110, 118, 114, 115, + 132, 681, 119, 133, 152, 98, 77, 99, 150, 151, + 150, 150, 77, 678, 120, 210, 211, 153, 146, 116, + 111, 117, 117, 117, 117, 117, 117, 117, 117, 134, + 134, 134, 134, 147, 259, 160, 138, 161, 189, 167, + 162, 148, 194, 163, 190, 260, 195, 135, 168, 139, + 140, 112, 121, 164, 122, 122, 122, 122, 122, 122, + + 122, 122, 208, 165, 260, 169, 166, 170, 172, 123, + 124, 136, 125, 126, 127, 209, 173, 171, 174, 128, + 154, 175, 155, 677, 129, 123, 124, 176, 156, 187, + 177, 130, 141, 191, 216, 157, 158, 681, 159, 178, + 131, 179, 137, 127, 188, 200, 676, 180, 181, 192, + 213, 214, 193, 182, 183, 196, 232, 221, 197, 204, + 221, 201, 198, 205, 202, 206, 681, 207, 203, 199, + 217, 222, 328, 249, 266, 90, 90, 90, 90, 90, + 90, 90, 90, 109, 109, 109, 109, 233, 329, 239, + 250, 263, 215, 234, 240, 443, 264, 235, 268, 269, + + 216, 110, 216, 262, 236, 267, 444, 257, 237, 257, + 238, 259, 258, 258, 258, 258, 258, 258, 258, 258, + 270, 271, 260, 125, 126, 111, 150, 151, 150, 150, + 304, 291, 134, 134, 134, 134, 283, 296, 287, 284, + 292, 260, 125, 288, 308, 305, 306, 297, 675, 289, + 135, 131, 314, 249, 309, 674, 112, 117, 117, 117, + 117, 117, 117, 117, 117, 321, 315, 336, 673, 348, + 250, 322, 244, 245, 136, 331, 337, 403, 323, 332, + 342, 324, 221, 404, 343, 221, 357, 246, 244, 245, + 249, 359, 681, 672, 247, 251, 349, 252, 252, 252, + + 252, 252, 252, 252, 252, 137, 464, 362, 637, 363, + 364, 638, 253, 254, 347, 347, 347, 347, 347, 347, + 347, 347, 394, 395, 365, 363, 364, 255, 253, 254, + 360, 366, 360, 465, 256, 361, 361, 361, 361, 361, + 361, 361, 361, 367, 671, 367, 373, 374, 368, 368, + 368, 368, 368, 368, 368, 368, 258, 258, 258, 258, + 258, 258, 258, 258, 369, 373, 415, 416, 417, 418, + 670, 419, 420, 424, 375, 424, 424, 669, 370, 454, + 369, 454, 454, 466, 468, 371, 470, 472, 474, 657, + 668, 425, 667, 658, 462, 249, 666, 455, 347, 347, + + 347, 347, 347, 347, 347, 347, 109, 109, 109, 109, + 467, 469, 362, 471, 473, 475, 361, 361, 361, 361, + 361, 361, 361, 361, 110, 245, 377, 532, 254, 665, + 664, 379, 533, 456, 572, 573, 574, 663, 557, 246, + 662, 245, 255, 359, 254, 477, 247, 477, 111, 256, + 478, 478, 478, 478, 478, 478, 478, 478, 368, 368, + 368, 368, 368, 368, 368, 368, 373, 374, 661, 479, + 479, 134, 134, 134, 134, 424, 364, 424, 424, 112, + 480, 480, 559, 660, 659, 373, 656, 379, 655, 135, + 365, 654, 364, 425, 375, 653, 652, 366, 651, 480, + + 480, 534, 535, 536, 537, 650, 538, 539, 454, 649, + 454, 454, 648, 136, 478, 478, 478, 478, 478, 478, + 478, 478, 647, 646, 645, 644, 455, 643, 642, 610, + 641, 640, 639, 636, 635, 634, 633, 632, 631, 630, + 629, 628, 627, 583, 137, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 85, 85, 85, 85, 85, 85, 85, + + 85, 85, 85, 85, 85, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 103, 103, 626, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 149, + 149, 149, 149, 149, 149, 149, 220, 625, 624, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, + 223, 223, 223, 623, 622, 621, 620, 619, 223, 224, + 224, 224, 224, 224, 618, 617, 616, 615, 614, 224, + 225, 225, 225, 225, 225, 613, 559, 557, 611, 610, + 225, 226, 226, 226, 226, 226, 608, 607, 606, 605, + 604, 226, 227, 227, 227, 227, 227, 603, 602, 601, + + 600, 599, 227, 228, 228, 228, 228, 228, 598, 597, + 596, 595, 594, 228, 229, 229, 229, 229, 229, 593, + 592, 591, 590, 589, 229, 230, 230, 230, 230, 230, + 588, 587, 586, 585, 584, 230, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 261, 261, + 261, 128, 128, 583, 581, 580, 128, 579, 128, 356, + 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 358, 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 258, 578, 258, 577, 576, 575, 258, + 372, 372, 372, 571, 372, 570, 372, 376, 376, 376, + + 376, 376, 376, 376, 376, 376, 376, 376, 376, 378, + 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, + 378, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 361, 569, 361, 568, 567, 566, 361, + 368, 565, 368, 564, 563, 562, 368, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, 481, 556, + 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 478, 561, 478, 560, 559, 557, 478, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, + + 582, 582, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 609, 612, 612, 612, 555, 612, 612, + 612, 612, 612, 612, 612, 612, 555, 554, 554, 553, + 553, 552, 552, 551, 551, 550, 550, 549, 548, 547, + 546, 545, 544, 543, 542, 541, 540, 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, + 488, 487, 486, 485, 484, 483, 482, 379, 377, 370, + + 365, 359, 357, 463, 463, 461, 460, 459, 458, 457, + 453, 452, 451, 450, 449, 448, 447, 446, 445, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, + 431, 430, 429, 428, 427, 426, 423, 422, 421, 414, + 413, 412, 411, 410, 409, 408, 407, 406, 405, 402, + 401, 400, 399, 398, 397, 396, 393, 392, 391, 390, + 389, 388, 387, 386, 385, 384, 383, 382, 381, 380, + 379, 377, 251, 255, 246, 359, 357, 355, 354, 353, + 352, 351, 350, 346, 345, 344, 341, 340, 339, 338, + 335, 334, 333, 330, 327, 326, 325, 320, 319, 318, + + 317, 316, 313, 312, 311, 310, 307, 303, 302, 301, + 300, 299, 298, 295, 294, 293, 290, 286, 285, 282, + 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, + 265, 129, 243, 242, 241, 232, 231, 219, 218, 212, + 186, 104, 100, 89, 681, 88, 88, 84, 84, 15, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681 } ; -static const flex_int16_t yy_chk[1331] = +static const flex_int16_t yy_chk[1326] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -1040,161 +1038,161 @@ static const flex_int16_t yy_chk[1331] = 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, 5, 5, 5, 7, 7, - 5, 6, 6, 6, 8, 8, 6, 684, 36, 683, + 5, 6, 6, 6, 8, 8, 6, 679, 23, 25, 7, 11, 11, 11, 11, 7, 8, 12, 12, 12, 12, 8, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 25, 29, 30, 40, 40, 5, 36, 31, 31, - 31, 31, 6, 32, 29, 34, 39, 679, 37, 30, - 34, 37, 25, 41, 41, 22, 31, 32, 32, 39, - 39, 56, 34, 42, 58, 56, 5, 51, 678, 23, - 23, 23, 6, 23, 23, 677, 51, 23, 42, 58, - 31, 38, 38, 38, 38, 47, 42, 23, 33, 23, - 33, 33, 33, 33, 33, 33, 33, 33, 47, 38, - 50, 59, 39, 45, 45, 45, 45, 59, 676, 60, - 50, 31, 35, 50, 35, 35, 35, 35, 35, 35, - - 35, 35, 54, 38, 52, 60, 52, 200, 60, 35, - 35, 54, 35, 35, 35, 86, 52, 61, 86, 35, - 48, 61, 48, 200, 35, 35, 35, 123, 48, 66, - 66, 35, 69, 69, 38, 48, 48, 49, 48, 49, - 35, 53, 49, 35, 65, 49, 55, 63, 76, 53, - 675, 53, 55, 55, 53, 105, 123, 65, 55, 55, - 53, 62, 111, 63, 62, 64, 63, 111, 62, 64, - 63, 64, 90, 64, 69, 62, 90, 90, 90, 90, - 90, 90, 90, 90, 76, 120, 105, 110, 110, 110, - 110, 129, 105, 136, 673, 138, 105, 127, 136, 140, - - 140, 165, 120, 105, 165, 110, 132, 105, 127, 105, - 671, 129, 129, 124, 76, 124, 76, 132, 124, 124, - 124, 124, 124, 124, 124, 124, 138, 127, 170, 110, - 129, 146, 146, 669, 182, 666, 132, 170, 190, 129, - 135, 135, 135, 135, 151, 151, 151, 151, 168, 182, - 182, 202, 190, 168, 222, 202, 663, 222, 135, 168, - 110, 118, 118, 118, 118, 118, 118, 118, 118, 174, - 185, 211, 196, 234, 206, 211, 118, 118, 196, 174, - 185, 662, 135, 206, 296, 196, 288, 288, 196, 661, - 296, 118, 118, 118, 250, 252, 660, 365, 118, 122, - - 234, 122, 122, 122, 122, 122, 122, 122, 122, 263, - 263, 250, 252, 135, 365, 331, 122, 122, 223, 223, - 223, 223, 223, 223, 223, 223, 331, 655, 263, 653, - 254, 122, 122, 122, 246, 648, 246, 263, 122, 246, - 246, 246, 246, 246, 246, 246, 246, 254, 254, 255, - 312, 255, 312, 312, 255, 255, 255, 255, 255, 255, - 255, 255, 254, 254, 254, 260, 353, 646, 312, 254, - 259, 259, 259, 259, 259, 259, 259, 259, 354, 260, - 645, 260, 308, 308, 308, 308, 260, 308, 308, 342, - 349, 342, 342, 353, 349, 349, 349, 349, 349, 349, - - 349, 349, 355, 356, 357, 354, 358, 342, 360, 362, - 362, 362, 362, 360, 363, 363, 363, 363, 363, 363, - 363, 363, 606, 364, 371, 606, 644, 362, 642, 355, - 356, 357, 427, 358, 427, 427, 380, 364, 371, 364, - 371, 380, 641, 342, 364, 371, 641, 366, 640, 366, - 427, 362, 366, 366, 366, 366, 366, 366, 366, 366, - 370, 370, 370, 370, 370, 370, 370, 370, 375, 375, - 377, 638, 378, 382, 382, 382, 382, 634, 632, 451, - 562, 377, 362, 378, 451, 562, 457, 375, 457, 457, - 631, 382, 452, 452, 452, 452, 375, 452, 452, 628, - - 377, 627, 378, 482, 457, 481, 481, 481, 481, 481, - 481, 481, 481, 564, 626, 382, 625, 482, 564, 482, - 505, 505, 505, 623, 482, 621, 619, 618, 617, 616, - 614, 613, 610, 607, 603, 602, 598, 597, 596, 595, - 593, 592, 591, 590, 587, 585, 382, 687, 687, 687, - 687, 687, 687, 687, 687, 687, 687, 687, 687, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 689, 689, 689, 689, 689, 689, 689, 689, 689, - 689, 689, 689, 690, 690, 690, 690, 690, 690, 690, - 690, 690, 690, 690, 690, 691, 691, 691, 691, 691, - - 691, 691, 691, 691, 691, 691, 691, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, 692, 693, - 693, 584, 693, 693, 693, 693, 693, 693, 693, 693, - 693, 694, 694, 694, 694, 694, 694, 694, 695, 583, - 582, 695, 695, 695, 695, 695, 695, 695, 695, 695, - 696, 696, 696, 696, 696, 581, 580, 576, 575, 574, - 696, 697, 697, 697, 697, 697, 570, 569, 568, 567, - 565, 697, 698, 698, 698, 698, 698, 563, 561, 549, - 548, 547, 698, 699, 699, 699, 699, 699, 546, 545, - 544, 542, 538, 699, 700, 700, 700, 700, 700, 537, - - 536, 533, 532, 531, 700, 701, 701, 701, 701, 701, - 530, 529, 528, 527, 526, 701, 702, 702, 702, 702, - 702, 525, 524, 523, 522, 521, 702, 703, 703, 703, - 703, 703, 520, 519, 518, 517, 516, 703, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 705, 705, 705, 706, 706, 515, 513, 510, 706, 509, - 706, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 707, 707, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 708, 708, 709, 508, 709, 507, 506, - 504, 709, 710, 710, 710, 503, 710, 501, 710, 711, - - 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, - 711, 712, 712, 712, 712, 712, 712, 712, 712, 712, - 712, 712, 712, 713, 713, 713, 713, 713, 713, 713, - 713, 713, 713, 713, 713, 714, 500, 714, 499, 497, - 496, 714, 715, 495, 715, 492, 489, 488, 715, 716, - 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, - 716, 717, 717, 717, 717, 717, 717, 717, 717, 717, - 717, 717, 717, 718, 486, 718, 485, 480, 479, 718, - 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, - 719, 719, 720, 720, 720, 720, 720, 720, 720, 720, - - 720, 720, 720, 720, 721, 721, 721, 721, 721, 721, - 721, 721, 721, 721, 721, 721, 722, 722, 722, 478, - 722, 722, 722, 722, 722, 722, 722, 722, 477, 476, - 475, 474, 473, 472, 471, 470, 469, 468, 466, 465, - 464, 462, 461, 459, 458, 456, 455, 454, 453, 450, - 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 433, 432, 431, 429, 428, 426, - 425, 424, 422, 418, 417, 416, 415, 413, 412, 411, - 410, 409, 408, 407, 406, 402, 401, 400, 399, 398, - 397, 396, 394, 393, 391, 390, 388, 387, 385, 381, - - 379, 374, 369, 361, 359, 352, 351, 350, 347, 346, - 345, 344, 343, 341, 340, 339, 338, 337, 336, 335, - 333, 332, 330, 329, 328, 327, 326, 325, 324, 323, - 322, 321, 320, 319, 318, 317, 316, 315, 313, 311, - 310, 309, 307, 306, 305, 304, 303, 302, 300, 299, - 298, 297, 295, 294, 293, 292, 291, 290, 289, 287, - 286, 285, 284, 283, 282, 281, 280, 279, 278, 276, - 275, 273, 270, 266, 265, 264, 258, 249, 242, 241, - 240, 239, 238, 237, 236, 235, 224, 216, 213, 212, - 210, 209, 208, 207, 205, 204, 203, 201, 199, 198, - - 197, 195, 194, 193, 192, 191, 189, 188, 187, 186, - 184, 181, 179, 178, 177, 176, 175, 173, 172, 171, - 169, 167, 166, 164, 163, 162, 161, 160, 159, 158, - 157, 156, 155, 154, 137, 131, 117, 113, 112, 104, - 102, 91, 82, 81, 67, 57, 26, 24, 20, 15, - 14, 13, 10, 9, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686 + 25, 29, 36, 56, 30, 678, 5, 56, 31, 31, + 31, 31, 6, 29, 32, 40, 40, 23, 23, 23, + 30, 23, 23, 41, 41, 23, 31, 34, 32, 32, + 37, 36, 34, 37, 47, 23, 5, 23, 45, 45, + 45, 45, 6, 674, 34, 66, 66, 47, 42, 33, + 31, 33, 33, 33, 33, 33, 33, 33, 33, 38, + 38, 38, 38, 42, 126, 49, 39, 49, 59, 51, + 49, 42, 61, 49, 59, 126, 61, 38, 51, 39, + 39, 31, 35, 50, 35, 35, 35, 35, 35, 35, + + 35, 35, 65, 50, 126, 52, 50, 52, 53, 35, + 35, 38, 35, 35, 35, 65, 53, 52, 53, 35, + 48, 53, 48, 673, 35, 35, 35, 53, 48, 58, + 54, 35, 39, 60, 76, 48, 48, 122, 48, 54, + 35, 55, 38, 35, 58, 63, 672, 55, 55, 60, + 69, 69, 60, 55, 55, 62, 104, 86, 62, 64, + 86, 63, 62, 64, 63, 64, 122, 64, 63, 62, + 76, 90, 199, 119, 137, 90, 90, 90, 90, 90, + 90, 90, 90, 109, 109, 109, 109, 104, 199, 110, + 119, 135, 69, 104, 110, 329, 135, 104, 139, 139, + + 76, 109, 76, 128, 104, 137, 329, 123, 104, 123, + 104, 131, 123, 123, 123, 123, 123, 123, 123, 123, + 145, 145, 131, 128, 128, 109, 150, 150, 150, 150, + 181, 169, 134, 134, 134, 134, 164, 173, 167, 164, + 169, 131, 128, 167, 184, 181, 181, 173, 671, 167, + 134, 128, 189, 248, 184, 670, 109, 117, 117, 117, + 117, 117, 117, 117, 117, 195, 189, 205, 668, 232, + 248, 195, 117, 117, 134, 201, 205, 294, 195, 201, + 210, 195, 221, 294, 210, 221, 357, 117, 117, 117, + 250, 357, 252, 666, 117, 121, 232, 121, 121, 121, + + 121, 121, 121, 121, 121, 134, 350, 250, 601, 252, + 252, 601, 121, 121, 222, 222, 222, 222, 222, 222, + 222, 222, 286, 286, 252, 252, 252, 121, 121, 121, + 244, 252, 244, 350, 121, 244, 244, 244, 244, 244, + 244, 244, 244, 253, 664, 253, 261, 261, 253, 253, + 253, 253, 253, 253, 253, 253, 257, 257, 257, 257, + 257, 257, 257, 257, 258, 261, 306, 306, 306, 306, + 661, 306, 306, 310, 261, 310, 310, 658, 258, 340, + 258, 340, 340, 351, 352, 258, 353, 354, 355, 636, + 657, 310, 656, 636, 347, 362, 655, 340, 347, 347, + + 347, 347, 347, 347, 347, 347, 359, 359, 359, 359, + 351, 352, 362, 353, 354, 355, 360, 360, 360, 360, + 360, 360, 360, 360, 359, 361, 377, 448, 368, 650, + 648, 377, 448, 340, 501, 501, 501, 643, 557, 361, + 641, 361, 368, 557, 368, 363, 361, 363, 359, 368, + 363, 363, 363, 363, 363, 363, 363, 363, 367, 367, + 367, 367, 367, 367, 367, 367, 372, 372, 640, 374, + 375, 379, 379, 379, 379, 424, 478, 424, 424, 359, + 374, 375, 559, 639, 637, 372, 635, 559, 633, 379, + 478, 629, 478, 424, 372, 627, 626, 478, 623, 374, + + 375, 449, 449, 449, 449, 622, 449, 449, 454, 621, + 454, 454, 620, 379, 477, 477, 477, 477, 477, 477, + 477, 477, 618, 616, 614, 613, 454, 612, 611, 609, + 608, 605, 602, 598, 597, 593, 592, 591, 590, 588, + 587, 586, 585, 582, 379, 682, 682, 682, 682, 682, + 682, 682, 682, 682, 682, 682, 682, 683, 683, 683, + 683, 683, 683, 683, 683, 683, 683, 683, 683, 684, + 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, + 684, 685, 685, 685, 685, 685, 685, 685, 685, 685, + 685, 685, 685, 686, 686, 686, 686, 686, 686, 686, + + 686, 686, 686, 686, 686, 687, 687, 687, 687, 687, + 687, 687, 687, 687, 687, 687, 687, 688, 688, 580, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 689, + 689, 689, 689, 689, 689, 689, 690, 579, 578, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 691, 691, + 691, 691, 691, 577, 576, 575, 571, 570, 691, 692, + 692, 692, 692, 692, 569, 565, 564, 563, 562, 692, + 693, 693, 693, 693, 693, 560, 558, 556, 545, 544, + 693, 694, 694, 694, 694, 694, 543, 542, 541, 540, + 538, 694, 695, 695, 695, 695, 695, 534, 533, 532, + + 529, 528, 695, 696, 696, 696, 696, 696, 527, 526, + 525, 524, 523, 696, 697, 697, 697, 697, 697, 522, + 521, 520, 519, 518, 697, 698, 698, 698, 698, 698, + 517, 516, 515, 514, 513, 698, 699, 699, 699, 699, + 699, 699, 699, 699, 699, 699, 699, 699, 700, 700, + 700, 701, 701, 512, 511, 509, 701, 506, 701, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 703, 703, 703, 703, 703, 703, 703, 703, 703, + 703, 703, 703, 704, 505, 704, 504, 503, 502, 704, + 705, 705, 705, 500, 705, 499, 705, 706, 706, 706, + + 706, 706, 706, 706, 706, 706, 706, 706, 706, 707, + 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 707, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 709, 497, 709, 496, 495, 493, 709, + 710, 492, 710, 491, 488, 485, 710, 711, 711, 711, + 711, 711, 711, 711, 711, 711, 711, 711, 711, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 712, 713, 484, 713, 482, 481, 476, 713, 714, 714, + 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, + 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, + + 715, 715, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 717, 717, 717, 475, 717, 717, + 717, 717, 717, 717, 717, 717, 474, 473, 472, 471, + 470, 469, 468, 467, 466, 465, 464, 462, 461, 459, + 458, 456, 455, 453, 452, 451, 450, 447, 445, 444, + 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, + 433, 432, 430, 429, 428, 426, 425, 423, 422, 421, + 419, 415, 414, 413, 412, 410, 409, 408, 407, 406, + 405, 404, 403, 399, 398, 397, 396, 395, 394, 393, + 391, 390, 388, 387, 385, 384, 382, 378, 376, 371, + + 366, 358, 356, 349, 348, 345, 344, 343, 342, 341, + 339, 338, 337, 336, 335, 334, 333, 331, 330, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 311, 309, 308, 307, 305, + 304, 303, 302, 301, 300, 298, 297, 296, 295, 293, + 292, 291, 290, 289, 288, 287, 285, 284, 283, 282, + 281, 280, 279, 278, 277, 276, 274, 273, 271, 268, + 264, 263, 262, 256, 247, 240, 239, 238, 237, 236, + 235, 234, 233, 215, 212, 211, 209, 208, 207, 206, + 204, 203, 202, 200, 198, 197, 196, 194, 193, 192, + + 191, 190, 188, 187, 186, 185, 183, 180, 178, 177, + 176, 175, 174, 172, 171, 170, 168, 166, 165, 163, + 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, + 136, 130, 116, 112, 111, 103, 101, 82, 81, 67, + 57, 26, 24, 20, 15, 14, 13, 10, 9, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 681 } ; /* Table of booleans, true if rule could match eol. */ -static const flex_int32_t yy_rule_can_match_eol[236] = +static const flex_int32_t yy_rule_can_match_eol[235] = { 0, -0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, }; + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -1254,11 +1252,11 @@ void das_accept_cpp_comment ( vector & crdi, yyscan_t scanner, #define YY_EXTRA_TYPE das::DasParserState * -#line 1257 "ds2_lexer.cpp" +#line 1255 "ds2_lexer.cpp" #define YY_NO_UNISTD_H 1 /* %option debug */ -#line 1261 "ds2_lexer.cpp" +#line 1259 "ds2_lexer.cpp" #define INITIAL 0 #define normal 1 @@ -1541,7 +1539,7 @@ YY_DECL #line 71 "ds2_lexer.lpp" -#line 1544 "ds2_lexer.cpp" +#line 1542 "ds2_lexer.cpp" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1568,13 +1566,13 @@ YY_DECL 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 >= 687 ) + if ( yy_current_state >= 682 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 686 ); + while ( yy_current_state != 681 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; @@ -1607,14 +1605,9 @@ YY_DECL goto yy_find_action; case 1: +/* rule 1 can match eol */ YY_RULE_SETUP #line 73 "ds2_lexer.lpp" -{ /* skipping #gen2# text, which indicates type of syntax */ } - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -#line 74 "ds2_lexer.lpp" { string txt = yytext; int lRow, lCol; @@ -1638,14 +1631,14 @@ YY_RULE_SETUP } } YY_BREAK -case 3: +case 2: YY_RULE_SETUP -#line 96 "ds2_lexer.lpp" +#line 95 "ds2_lexer.lpp" das2_yyfatalerror(yylloc_param,yyscanner,"Unexpected */", CompilationError::unexpected_close_comment); return LEXER_ERROR; YY_BREAK -case 4: +case 3: YY_RULE_SETUP -#line 97 "ds2_lexer.lpp" +#line 96 "ds2_lexer.lpp" { BEGIN(c_comment); yyextra->das_c_style_depth = 1; @@ -1655,9 +1648,9 @@ YY_RULE_SETUP } } YY_BREAK -case 5: +case 4: YY_RULE_SETUP -#line 105 "ds2_lexer.lpp" +#line 104 "ds2_lexer.lpp" { BEGIN(cpp_comment); if ( !yyextra->g_CommentReaders.empty() ) { @@ -1666,10 +1659,10 @@ YY_RULE_SETUP } } YY_BREAK -case 6: -/* rule 6 can match eol */ +case 5: +/* rule 5 can match eol */ YY_RULE_SETUP -#line 112 "ds2_lexer.lpp" +#line 111 "ds2_lexer.lpp" { BEGIN(normal); unput('\n'); @@ -1680,12 +1673,12 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(cpp_comment): -#line 120 "ds2_lexer.lpp" +#line 119 "ds2_lexer.lpp" BEGIN(normal); YY_BREAK -case 7: +case 6: YY_RULE_SETUP -#line 121 "ds2_lexer.lpp" +#line 120 "ds2_lexer.lpp" { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(yyscanner,*yylloc_param); @@ -1693,16 +1686,16 @@ YY_RULE_SETUP } } YY_BREAK -case 8: +case 7: YY_RULE_SETUP -#line 127 "ds2_lexer.lpp" +#line 126 "ds2_lexer.lpp" { yyextra->das_c_style_depth ++; } YY_BREAK -case 9: +case 8: YY_RULE_SETUP -#line 130 "ds2_lexer.lpp" +#line 129 "ds2_lexer.lpp" { yyextra->das_c_style_depth --; if ( yyextra->das_c_style_depth==0 ) { @@ -1714,9 +1707,9 @@ YY_RULE_SETUP } } YY_BREAK -case 10: +case 9: YY_RULE_SETUP -#line 140 "ds2_lexer.lpp" +#line 139 "ds2_lexer.lpp" { /* skipping comment body */ if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(yyscanner,*yylloc_param); @@ -1724,10 +1717,10 @@ YY_RULE_SETUP } } YY_BREAK -case 11: -/* rule 11 can match eol */ +case 10: +/* rule 10 can match eol */ YY_RULE_SETUP -#line 146 "ds2_lexer.lpp" +#line 145 "ds2_lexer.lpp" { /* skipping comment eol */ if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(yyscanner,*yylloc_param); @@ -1736,50 +1729,50 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(c_comment): -#line 152 "ds2_lexer.lpp" +#line 151 "ds2_lexer.lpp" { das2_yyfatalerror(yylloc_param,yyscanner,"end of file encountered inside c-style comment", CompilationError::comment_contains_eof); BEGIN(normal); } YY_BREAK case YY_STATE_EOF(reader): -#line 156 "ds2_lexer.lpp" +#line 155 "ds2_lexer.lpp" { das2_yyfatalerror(yylloc_param,yyscanner,"reader constant exceeds file", CompilationError::string_constant_exceeds_file); BEGIN(normal); return END_OF_READ; } YY_BREAK -case 12: -/* rule 12 can match eol */ +case 11: +/* rule 11 can match eol */ YY_RULE_SETUP -#line 161 "ds2_lexer.lpp" +#line 160 "ds2_lexer.lpp" { YY2NEWLINE(yyscanner); yylval_param->ch = yytext[0]; return STRING_CHARACTER; } YY_BREAK -case 13: +case 12: YY_RULE_SETUP -#line 166 "ds2_lexer.lpp" +#line 165 "ds2_lexer.lpp" { yylval_param->ch = yytext[0]; return STRING_CHARACTER; } YY_BREAK -case 14: +case 13: YY_RULE_SETUP -#line 170 "ds2_lexer.lpp" +#line 169 "ds2_lexer.lpp" { // assert(nested_sb==0); BEGIN(normal); return END_STRING; } YY_BREAK -case 15: +case 14: YY_RULE_SETUP -#line 175 "ds2_lexer.lpp" +#line 174 "ds2_lexer.lpp" { DAS_ASSERT(yyextra->das_nested_sb==0); yyextra->das_nested_sb ++; @@ -1788,67 +1781,67 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(strb): -#line 181 "ds2_lexer.lpp" +#line 180 "ds2_lexer.lpp" { das2_yyfatalerror(yylloc_param,yyscanner,"string constant exceeds file", CompilationError::string_constant_exceeds_file); BEGIN(normal); return END_STRING; } YY_BREAK -case 16: +case 15: YY_RULE_SETUP -#line 186 "ds2_lexer.lpp" +#line 185 "ds2_lexer.lpp" { return STRING_CHARACTER_ESC; } YY_BREAK -case 17: +case 16: YY_RULE_SETUP -#line 189 "ds2_lexer.lpp" +#line 188 "ds2_lexer.lpp" { yylval_param->ch = yytext[1]; return STRING_CHARACTER; } YY_BREAK -case 18: +case 17: YY_RULE_SETUP -#line 193 "ds2_lexer.lpp" +#line 192 "ds2_lexer.lpp" /* do exactly nothing */ YY_BREAK -case 19: -/* rule 19 can match eol */ +case 18: +/* rule 18 can match eol */ YY_RULE_SETUP -#line 194 "ds2_lexer.lpp" +#line 193 "ds2_lexer.lpp" { yylval_param->ch = *yytext; YY2NEWLINE(yyscanner); return STRING_CHARACTER; } YY_BREAK -case 20: +case 19: YY_RULE_SETUP -#line 199 "ds2_lexer.lpp" +#line 198 "ds2_lexer.lpp" { yylval_param->ch = *yytext; return STRING_CHARACTER; } YY_BREAK -case 21: +case 20: YY_RULE_SETUP -#line 203 "ds2_lexer.lpp" +#line 202 "ds2_lexer.lpp" { yylval_param->ch = *yytext; return STRING_CHARACTER; } YY_BREAK -case 22: +case 21: YY_RULE_SETUP -#line 207 "ds2_lexer.lpp" +#line 206 "ds2_lexer.lpp" /* eat the whitespace */ YY_BREAK -case 23: +case 22: YY_RULE_SETUP -#line 208 "ds2_lexer.lpp" +#line 207 "ds2_lexer.lpp" { /* got the include file name */ auto cfi = yyextra->g_FileAccessStack.back(); string incFileName = yyextra->g_Access->getIncludeFileName(cfi->name,yytext); @@ -1872,670 +1865,670 @@ YY_RULE_SETUP BEGIN(normal); } YY_BREAK +case 23: +YY_RULE_SETUP +#line 230 "ds2_lexer.lpp" +BEGIN(include); + YY_BREAK case 24: YY_RULE_SETUP #line 231 "ds2_lexer.lpp" -BEGIN(include); +return DAS_CAPTURE; YY_BREAK case 25: YY_RULE_SETUP #line 232 "ds2_lexer.lpp" -return DAS_CAPTURE; +return DAS_FOR; YY_BREAK case 26: YY_RULE_SETUP #line 233 "ds2_lexer.lpp" -return DAS_FOR; +return DAS_WHILE; YY_BREAK case 27: YY_RULE_SETUP #line 234 "ds2_lexer.lpp" -return DAS_WHILE; +return DAS_IF; YY_BREAK case 28: YY_RULE_SETUP #line 235 "ds2_lexer.lpp" -return DAS_IF; +return DAS_STATIC_IF; YY_BREAK case 29: YY_RULE_SETUP #line 236 "ds2_lexer.lpp" -return DAS_STATIC_IF; +return DAS_ELIF; YY_BREAK case 30: YY_RULE_SETUP #line 237 "ds2_lexer.lpp" -return DAS_ELIF; +return DAS_STATIC_ELIF; YY_BREAK case 31: YY_RULE_SETUP #line 238 "ds2_lexer.lpp" -return DAS_STATIC_ELIF; +return DAS_ELSE; YY_BREAK case 32: YY_RULE_SETUP #line 239 "ds2_lexer.lpp" -return DAS_ELSE; +return DAS_FINALLY; YY_BREAK case 33: YY_RULE_SETUP #line 240 "ds2_lexer.lpp" -return DAS_FINALLY; +return DAS_DEF; YY_BREAK case 34: YY_RULE_SETUP #line 241 "ds2_lexer.lpp" -return DAS_DEF; +return DAS_WITH; YY_BREAK case 35: YY_RULE_SETUP #line 242 "ds2_lexer.lpp" -return DAS_WITH; +return DAS_AKA; YY_BREAK case 36: YY_RULE_SETUP #line 243 "ds2_lexer.lpp" -return DAS_AKA; +return DAS_ASSUME; YY_BREAK case 37: +/* rule 37 can match eol */ YY_RULE_SETUP #line 244 "ds2_lexer.lpp" -return DAS_ASSUME; - YY_BREAK -case 38: -/* rule 38 can match eol */ -YY_RULE_SETUP -#line 245 "ds2_lexer.lpp" { // TODO: comment reader after let where? unput('\n'); das_accept_cpp_comment(yyextra->g_CommentReaders, yyscanner, *yylloc_param, yytext); return DAS_LET; } YY_BREAK -case 39: +case 38: YY_RULE_SETUP -#line 250 "ds2_lexer.lpp" +#line 249 "ds2_lexer.lpp" return DAS_LET; YY_BREAK -case 40: -/* rule 40 can match eol */ +case 39: +/* rule 39 can match eol */ YY_RULE_SETUP -#line 251 "ds2_lexer.lpp" +#line 250 "ds2_lexer.lpp" { // TODO: comment reader after var where? unput('\n'); das_accept_cpp_comment(yyextra->g_CommentReaders, yyscanner, *yylloc_param, yytext); return DAS_VAR; } YY_BREAK +case 40: +YY_RULE_SETUP +#line 255 "ds2_lexer.lpp" +return DAS_UNINITIALIZED; + YY_BREAK case 41: YY_RULE_SETUP #line 256 "ds2_lexer.lpp" -return DAS_UNINITIALIZED; +return DAS_VAR; YY_BREAK case 42: YY_RULE_SETUP #line 257 "ds2_lexer.lpp" -return DAS_VAR; +return DAS_STRUCT; YY_BREAK case 43: YY_RULE_SETUP #line 258 "ds2_lexer.lpp" -return DAS_STRUCT; +return DAS_CLASS; YY_BREAK case 44: YY_RULE_SETUP #line 259 "ds2_lexer.lpp" -return DAS_CLASS; +return DAS_ENUM; YY_BREAK case 45: YY_RULE_SETUP #line 260 "ds2_lexer.lpp" -return DAS_ENUM; +return DAS_TRY; YY_BREAK case 46: YY_RULE_SETUP #line 261 "ds2_lexer.lpp" -return DAS_TRY; +return DAS_CATCH; YY_BREAK case 47: YY_RULE_SETUP #line 262 "ds2_lexer.lpp" -return DAS_CATCH; +return DAS_TYPEDEF; YY_BREAK case 48: YY_RULE_SETUP #line 263 "ds2_lexer.lpp" -return DAS_TYPEDEF; +return DAS_TYPEDECL; YY_BREAK case 49: YY_RULE_SETUP #line 264 "ds2_lexer.lpp" -return DAS_TYPEDECL; +return DAS_LABEL; YY_BREAK case 50: YY_RULE_SETUP #line 265 "ds2_lexer.lpp" -return DAS_LABEL; +return DAS_GOTO; YY_BREAK case 51: YY_RULE_SETUP #line 266 "ds2_lexer.lpp" -return DAS_GOTO; +return DAS_MODULE; YY_BREAK case 52: YY_RULE_SETUP #line 267 "ds2_lexer.lpp" -return DAS_MODULE; +return DAS_PUBLIC; YY_BREAK case 53: YY_RULE_SETUP #line 268 "ds2_lexer.lpp" -return DAS_PUBLIC; +return DAS_OPTIONS; YY_BREAK case 54: YY_RULE_SETUP #line 269 "ds2_lexer.lpp" -return DAS_OPTIONS; +return DAS_OPERATOR; YY_BREAK case 55: YY_RULE_SETUP #line 270 "ds2_lexer.lpp" -return DAS_OPERATOR; +return DAS_REQUIRE; YY_BREAK case 56: YY_RULE_SETUP #line 271 "ds2_lexer.lpp" -return DAS_REQUIRE; +return DAS_TBLOCK; YY_BREAK case 57: YY_RULE_SETUP #line 272 "ds2_lexer.lpp" -return DAS_TBLOCK; +return DAS_TFUNCTION; YY_BREAK case 58: YY_RULE_SETUP #line 273 "ds2_lexer.lpp" -return DAS_TFUNCTION; +return DAS_TLAMBDA; YY_BREAK case 59: YY_RULE_SETUP #line 274 "ds2_lexer.lpp" -return DAS_TLAMBDA; +return DAS_GENERATOR; YY_BREAK case 60: YY_RULE_SETUP #line 275 "ds2_lexer.lpp" -return DAS_GENERATOR; +return DAS_TTUPLE; YY_BREAK case 61: YY_RULE_SETUP #line 276 "ds2_lexer.lpp" -return DAS_TTUPLE; +return DAS_TVARIANT; YY_BREAK case 62: YY_RULE_SETUP #line 277 "ds2_lexer.lpp" -return DAS_TVARIANT; +return DAS_CONST; YY_BREAK case 63: YY_RULE_SETUP #line 278 "ds2_lexer.lpp" -return DAS_CONST; +return DAS_CONTINUE; YY_BREAK case 64: YY_RULE_SETUP #line 279 "ds2_lexer.lpp" -return DAS_CONTINUE; +return DAS_WHERE; YY_BREAK case 65: YY_RULE_SETUP #line 280 "ds2_lexer.lpp" -return DAS_WHERE; +return DAS_CAST; YY_BREAK case 66: YY_RULE_SETUP #line 281 "ds2_lexer.lpp" -return DAS_CAST; +return DAS_UPCAST; YY_BREAK case 67: YY_RULE_SETUP #line 282 "ds2_lexer.lpp" -return DAS_UPCAST; +return DAS_PASS; YY_BREAK case 68: YY_RULE_SETUP #line 283 "ds2_lexer.lpp" -return DAS_PASS; +return DAS_REINTERPRET; YY_BREAK case 69: YY_RULE_SETUP #line 284 "ds2_lexer.lpp" -return DAS_REINTERPRET; +return DAS_OVERRIDE; YY_BREAK case 70: YY_RULE_SETUP #line 285 "ds2_lexer.lpp" -return DAS_OVERRIDE; +return DAS_SEALED; YY_BREAK case 71: YY_RULE_SETUP #line 286 "ds2_lexer.lpp" -return DAS_SEALED; +return DAS_ABSTRACT; YY_BREAK case 72: YY_RULE_SETUP #line 287 "ds2_lexer.lpp" -return DAS_ABSTRACT; +return DAS_EXPECT; YY_BREAK case 73: YY_RULE_SETUP #line 288 "ds2_lexer.lpp" -return DAS_EXPECT; +return DAS_TABLE; YY_BREAK case 74: YY_RULE_SETUP #line 289 "ds2_lexer.lpp" -return DAS_TABLE; +return DAS_ARRAY; YY_BREAK case 75: YY_RULE_SETUP #line 290 "ds2_lexer.lpp" -return DAS_ARRAY; +return DAS_FIXED_ARRAY; YY_BREAK case 76: YY_RULE_SETUP #line 291 "ds2_lexer.lpp" -return DAS_FIXED_ARRAY; +return DAS_DEFAULT; YY_BREAK case 77: YY_RULE_SETUP #line 292 "ds2_lexer.lpp" -return DAS_DEFAULT; +return DAS_ITERATOR; YY_BREAK case 78: YY_RULE_SETUP #line 293 "ds2_lexer.lpp" -return DAS_ITERATOR; +return DAS_IN; YY_BREAK case 79: YY_RULE_SETUP #line 294 "ds2_lexer.lpp" -return DAS_IN; +return DAS_IMPLICIT; YY_BREAK case 80: YY_RULE_SETUP #line 295 "ds2_lexer.lpp" -return DAS_IMPLICIT; +return DAS_EXPLICIT; YY_BREAK case 81: YY_RULE_SETUP #line 296 "ds2_lexer.lpp" -return DAS_EXPLICIT; +return DAS_SHARED; YY_BREAK case 82: YY_RULE_SETUP #line 297 "ds2_lexer.lpp" -return DAS_SHARED; +return DAS_PRIVATE; YY_BREAK case 83: YY_RULE_SETUP #line 298 "ds2_lexer.lpp" -return DAS_PRIVATE; +return DAS_SMART_PTR; YY_BREAK case 84: YY_RULE_SETUP #line 299 "ds2_lexer.lpp" -return DAS_SMART_PTR; +return DAS_UNSAFE; YY_BREAK case 85: YY_RULE_SETUP #line 300 "ds2_lexer.lpp" -return DAS_UNSAFE; +return DAS_INSCOPE; YY_BREAK case 86: YY_RULE_SETUP #line 301 "ds2_lexer.lpp" -return DAS_INSCOPE; +return DAS_STATIC; YY_BREAK case 87: YY_RULE_SETUP #line 302 "ds2_lexer.lpp" -return DAS_STATIC; +return DAS_AS; YY_BREAK case 88: YY_RULE_SETUP #line 303 "ds2_lexer.lpp" -return DAS_AS; +return DAS_IS; YY_BREAK case 89: YY_RULE_SETUP #line 304 "ds2_lexer.lpp" -return DAS_IS; +return DAS_DEREF; YY_BREAK case 90: YY_RULE_SETUP #line 305 "ds2_lexer.lpp" -return DAS_DEREF; +return DAS_ADDR; YY_BREAK case 91: YY_RULE_SETUP #line 306 "ds2_lexer.lpp" -return DAS_ADDR; +return DAS_NULL; YY_BREAK case 92: YY_RULE_SETUP #line 307 "ds2_lexer.lpp" -return DAS_NULL; +return DAS_RETURN; YY_BREAK case 93: YY_RULE_SETUP #line 308 "ds2_lexer.lpp" -return DAS_RETURN; +return DAS_YIELD; YY_BREAK case 94: YY_RULE_SETUP #line 309 "ds2_lexer.lpp" -return DAS_YIELD; +return DAS_BREAK; YY_BREAK case 95: YY_RULE_SETUP #line 310 "ds2_lexer.lpp" -return DAS_BREAK; +return DAS_TYPEINFO; YY_BREAK case 96: YY_RULE_SETUP #line 311 "ds2_lexer.lpp" -return DAS_TYPEINFO; +return DAS_TYPE; YY_BREAK case 97: YY_RULE_SETUP #line 312 "ds2_lexer.lpp" -return DAS_TYPE; +return DAS_NEWT; YY_BREAK case 98: YY_RULE_SETUP #line 313 "ds2_lexer.lpp" -return DAS_NEWT; +return DAS_DELETE; YY_BREAK case 99: YY_RULE_SETUP #line 314 "ds2_lexer.lpp" -return DAS_DELETE; +return DAS_TRUE; YY_BREAK case 100: YY_RULE_SETUP #line 315 "ds2_lexer.lpp" -return DAS_TRUE; +return DAS_FALSE; YY_BREAK case 101: YY_RULE_SETUP #line 316 "ds2_lexer.lpp" -return DAS_FALSE; +return DAS_TAUTO; YY_BREAK case 102: YY_RULE_SETUP #line 317 "ds2_lexer.lpp" -return DAS_TAUTO; +return DAS_TBOOL; YY_BREAK case 103: YY_RULE_SETUP #line 318 "ds2_lexer.lpp" -return DAS_TBOOL; +return DAS_TVOID; YY_BREAK case 104: YY_RULE_SETUP #line 319 "ds2_lexer.lpp" -return DAS_TVOID; +return DAS_TSTRING; YY_BREAK case 105: YY_RULE_SETUP #line 320 "ds2_lexer.lpp" -return DAS_TSTRING; +return DAS_TRANGE64; YY_BREAK case 106: YY_RULE_SETUP #line 321 "ds2_lexer.lpp" -return DAS_TRANGE64; +return DAS_TURANGE64; YY_BREAK case 107: YY_RULE_SETUP #line 322 "ds2_lexer.lpp" -return DAS_TURANGE64; +return DAS_TRANGE; YY_BREAK case 108: YY_RULE_SETUP #line 323 "ds2_lexer.lpp" -return DAS_TRANGE; +return DAS_TURANGE; YY_BREAK case 109: YY_RULE_SETUP #line 324 "ds2_lexer.lpp" -return DAS_TURANGE; +return DAS_TINT; YY_BREAK case 110: YY_RULE_SETUP #line 325 "ds2_lexer.lpp" -return DAS_TINT; +return DAS_TINT8; YY_BREAK case 111: YY_RULE_SETUP #line 326 "ds2_lexer.lpp" -return DAS_TINT8; +return DAS_TINT16; YY_BREAK case 112: YY_RULE_SETUP #line 327 "ds2_lexer.lpp" -return DAS_TINT16; +return DAS_TINT64; YY_BREAK case 113: YY_RULE_SETUP #line 328 "ds2_lexer.lpp" -return DAS_TINT64; +return DAS_TINT2; YY_BREAK case 114: YY_RULE_SETUP #line 329 "ds2_lexer.lpp" -return DAS_TINT2; +return DAS_TINT3; YY_BREAK case 115: YY_RULE_SETUP #line 330 "ds2_lexer.lpp" -return DAS_TINT3; +return DAS_TINT4; YY_BREAK case 116: YY_RULE_SETUP #line 331 "ds2_lexer.lpp" -return DAS_TINT4; +return DAS_TUINT; YY_BREAK case 117: YY_RULE_SETUP #line 332 "ds2_lexer.lpp" -return DAS_TUINT; +return DAS_TBITFIELD; YY_BREAK case 118: YY_RULE_SETUP #line 333 "ds2_lexer.lpp" -return DAS_TBITFIELD; +return DAS_TUINT8; YY_BREAK case 119: YY_RULE_SETUP #line 334 "ds2_lexer.lpp" -return DAS_TUINT8; +return DAS_TUINT16; YY_BREAK case 120: YY_RULE_SETUP #line 335 "ds2_lexer.lpp" -return DAS_TUINT16; +return DAS_TUINT64; YY_BREAK case 121: YY_RULE_SETUP #line 336 "ds2_lexer.lpp" -return DAS_TUINT64; +return DAS_TUINT2; YY_BREAK case 122: YY_RULE_SETUP #line 337 "ds2_lexer.lpp" -return DAS_TUINT2; +return DAS_TUINT3; YY_BREAK case 123: YY_RULE_SETUP #line 338 "ds2_lexer.lpp" -return DAS_TUINT3; +return DAS_TUINT4; YY_BREAK case 124: YY_RULE_SETUP #line 339 "ds2_lexer.lpp" -return DAS_TUINT4; +return DAS_TDOUBLE; YY_BREAK case 125: YY_RULE_SETUP #line 340 "ds2_lexer.lpp" -return DAS_TDOUBLE; +return DAS_TFLOAT; YY_BREAK case 126: YY_RULE_SETUP #line 341 "ds2_lexer.lpp" -return DAS_TFLOAT; +return DAS_TFLOAT2; YY_BREAK case 127: YY_RULE_SETUP #line 342 "ds2_lexer.lpp" -return DAS_TFLOAT2; +return DAS_TFLOAT3; YY_BREAK case 128: YY_RULE_SETUP #line 343 "ds2_lexer.lpp" -return DAS_TFLOAT3; +return DAS_TFLOAT4; YY_BREAK case 129: YY_RULE_SETUP #line 344 "ds2_lexer.lpp" -return DAS_TFLOAT4; - YY_BREAK -case 130: -YY_RULE_SETUP -#line 345 "ds2_lexer.lpp" { yylval_param->s = new string(yytext); return NAME; } YY_BREAK -case 131: +case 130: YY_RULE_SETUP -#line 349 "ds2_lexer.lpp" +#line 348 "ds2_lexer.lpp" { BEGIN(strb); return BEGIN_STRING; } YY_BREAK +case 131: +YY_RULE_SETUP +#line 352 "ds2_lexer.lpp" +yylval_param->ui = 8; return UNSIGNED_INT8; + YY_BREAK case 132: YY_RULE_SETUP #line 353 "ds2_lexer.lpp" -yylval_param->ui = 8; return UNSIGNED_INT8; +yylval_param->ui = 9; return UNSIGNED_INT8; YY_BREAK case 133: YY_RULE_SETUP #line 354 "ds2_lexer.lpp" -yylval_param->ui = 9; return UNSIGNED_INT8; +yylval_param->ui = 10; return UNSIGNED_INT8; YY_BREAK case 134: YY_RULE_SETUP #line 355 "ds2_lexer.lpp" -yylval_param->ui = 10; return UNSIGNED_INT8; +yylval_param->ui = 12; return UNSIGNED_INT8; YY_BREAK case 135: YY_RULE_SETUP #line 356 "ds2_lexer.lpp" -yylval_param->ui = 12; return UNSIGNED_INT8; +yylval_param->ui = 13; return UNSIGNED_INT8; YY_BREAK case 136: YY_RULE_SETUP #line 357 "ds2_lexer.lpp" -yylval_param->ui = 13; return UNSIGNED_INT8; +yylval_param->ui = '\\'; return UNSIGNED_INT8; YY_BREAK case 137: YY_RULE_SETUP #line 358 "ds2_lexer.lpp" -yylval_param->ui = '\\'; return UNSIGNED_INT8; +yylval_param->ui = uint32_t(yytext[1]); return UNSIGNED_INT8; YY_BREAK case 138: YY_RULE_SETUP -#line 359 "ds2_lexer.lpp" -yylval_param->ui = uint32_t(yytext[1]); return UNSIGNED_INT8; +#line 360 "ds2_lexer.lpp" +yylval_param->ui = 8; return UNSIGNED_INTEGER; YY_BREAK case 139: YY_RULE_SETUP #line 361 "ds2_lexer.lpp" -yylval_param->ui = 8; return UNSIGNED_INTEGER; +yylval_param->ui = 9; return UNSIGNED_INTEGER; YY_BREAK case 140: YY_RULE_SETUP #line 362 "ds2_lexer.lpp" -yylval_param->ui = 9; return UNSIGNED_INTEGER; +yylval_param->ui = 10; return UNSIGNED_INTEGER; YY_BREAK case 141: YY_RULE_SETUP #line 363 "ds2_lexer.lpp" -yylval_param->ui = 10; return UNSIGNED_INTEGER; +yylval_param->ui = 12; return UNSIGNED_INTEGER; YY_BREAK case 142: YY_RULE_SETUP #line 364 "ds2_lexer.lpp" -yylval_param->ui = 12; return UNSIGNED_INTEGER; +yylval_param->ui = 13; return UNSIGNED_INTEGER; YY_BREAK case 143: YY_RULE_SETUP #line 365 "ds2_lexer.lpp" -yylval_param->ui = 13; return UNSIGNED_INTEGER; +yylval_param->ui = '\\'; return UNSIGNED_INTEGER; YY_BREAK case 144: YY_RULE_SETUP #line 366 "ds2_lexer.lpp" -yylval_param->ui = '\\'; return UNSIGNED_INTEGER; +yylval_param->ui = uint32_t(yytext[1]); return UNSIGNED_INTEGER; YY_BREAK case 145: YY_RULE_SETUP -#line 367 "ds2_lexer.lpp" -yylval_param->ui = uint32_t(yytext[1]); return UNSIGNED_INTEGER; +#line 368 "ds2_lexer.lpp" +yylval_param->i = 8; return INTEGER; YY_BREAK case 146: YY_RULE_SETUP #line 369 "ds2_lexer.lpp" -yylval_param->i = 8; return INTEGER; +yylval_param->i = 9; return INTEGER; YY_BREAK case 147: YY_RULE_SETUP #line 370 "ds2_lexer.lpp" -yylval_param->i = 9; return INTEGER; +yylval_param->i = 10; return INTEGER; YY_BREAK case 148: YY_RULE_SETUP #line 371 "ds2_lexer.lpp" -yylval_param->i = 10; return INTEGER; +yylval_param->i = 12; return INTEGER; YY_BREAK case 149: YY_RULE_SETUP #line 372 "ds2_lexer.lpp" -yylval_param->i = 12; return INTEGER; +yylval_param->i = 13; return INTEGER; YY_BREAK case 150: YY_RULE_SETUP #line 373 "ds2_lexer.lpp" -yylval_param->i = 13; return INTEGER; +yylval_param->i = '\\'; return INTEGER; YY_BREAK case 151: YY_RULE_SETUP -#line 374 "ds2_lexer.lpp" -yylval_param->i = '\\'; return INTEGER; +#line 375 "ds2_lexer.lpp" +yylval_param->i = int32_t(yytext[1]); return INTEGER; YY_BREAK case 152: YY_RULE_SETUP #line 376 "ds2_lexer.lpp" -yylval_param->i = int32_t(yytext[1]); return INTEGER; - YY_BREAK -case 153: -YY_RULE_SETUP -#line 377 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2548,9 +2541,9 @@ YY_RULE_SETUP return UNSIGNED_LONG_INTEGER; } YY_BREAK -case 154: +case 153: YY_RULE_SETUP -#line 388 "ds2_lexer.lpp" +#line 387 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2563,9 +2556,9 @@ YY_RULE_SETUP return LONG_INTEGER; } YY_BREAK -case 155: +case 154: YY_RULE_SETUP -#line 399 "ds2_lexer.lpp" +#line 398 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2580,9 +2573,9 @@ YY_RULE_SETUP return UNSIGNED_INT8; } YY_BREAK -case 156: +case 155: YY_RULE_SETUP -#line 412 "ds2_lexer.lpp" +#line 411 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2595,9 +2588,9 @@ YY_RULE_SETUP return UNSIGNED_INTEGER; } YY_BREAK -case 157: +case 156: YY_RULE_SETUP -#line 423 "ds2_lexer.lpp" +#line 422 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2614,9 +2607,9 @@ YY_RULE_SETUP return INTEGER; } YY_BREAK -case 158: +case 157: YY_RULE_SETUP -#line 438 "ds2_lexer.lpp" +#line 437 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2629,9 +2622,9 @@ YY_RULE_SETUP return INTEGER; } YY_BREAK -case 159: +case 158: YY_RULE_SETUP -#line 449 "ds2_lexer.lpp" +#line 448 "ds2_lexer.lpp" { char temptext[128]; skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2644,9 +2637,9 @@ YY_RULE_SETUP return UNSIGNED_LONG_INTEGER; } YY_BREAK -case 160: +case 159: YY_RULE_SETUP -#line 460 "ds2_lexer.lpp" +#line 459 "ds2_lexer.lpp" { char temptext[128]; skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2659,9 +2652,9 @@ YY_RULE_SETUP return UNSIGNED_LONG_INTEGER; } YY_BREAK -case 161: +case 160: YY_RULE_SETUP -#line 471 "ds2_lexer.lpp" +#line 470 "ds2_lexer.lpp" { char temptext[128]; int templength = skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2686,9 +2679,9 @@ YY_RULE_SETUP } } YY_BREAK -case 162: +case 161: YY_RULE_SETUP -#line 494 "ds2_lexer.lpp" +#line 493 "ds2_lexer.lpp" { char temptext[128]; skip_underscode(yytext,temptext,temptext+sizeof(temptext)); @@ -2701,9 +2694,9 @@ YY_RULE_SETUP return UNSIGNED_INTEGER; } YY_BREAK -case 163: +case 162: YY_RULE_SETUP -#line 505 "ds2_lexer.lpp" +#line 504 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->fd); if ( res.ec == std::errc::result_out_of_range ) { @@ -2714,9 +2707,9 @@ YY_RULE_SETUP return FLOAT; } YY_BREAK -case 164: +case 163: YY_RULE_SETUP -#line 514 "ds2_lexer.lpp" +#line 513 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->fd); if ( res.ec == std::errc::result_out_of_range ) { @@ -2728,9 +2721,9 @@ YY_RULE_SETUP } YY_BREAK -case 165: +case 164: YY_RULE_SETUP -#line 524 "ds2_lexer.lpp" +#line 523 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->fd); if ( res.ec == std::errc::result_out_of_range ) { @@ -2741,9 +2734,9 @@ YY_RULE_SETUP return FLOAT; } YY_BREAK -case 166: +case 165: YY_RULE_SETUP -#line 533 "ds2_lexer.lpp" +#line 532 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->fd); if ( res.ec == std::errc::result_out_of_range ) { @@ -2754,9 +2747,9 @@ YY_RULE_SETUP return FLOAT; } YY_BREAK -case 167: +case 166: YY_RULE_SETUP -#line 542 "ds2_lexer.lpp" +#line 541 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->d); if ( res.ec == std::errc::result_out_of_range ) { @@ -2767,9 +2760,9 @@ YY_RULE_SETUP return DOUBLE; } YY_BREAK -case 168: +case 167: YY_RULE_SETUP -#line 551 "ds2_lexer.lpp" +#line 550 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->d); if ( res.ec == std::errc::result_out_of_range ) { @@ -2780,9 +2773,9 @@ YY_RULE_SETUP return DOUBLE; } YY_BREAK -case 169: +case 168: YY_RULE_SETUP -#line 560 "ds2_lexer.lpp" +#line 559 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->d); if ( res.ec == std::errc::result_out_of_range ) { @@ -2793,9 +2786,9 @@ YY_RULE_SETUP return DOUBLE; } YY_BREAK -case 170: +case 169: YY_RULE_SETUP -#line 569 "ds2_lexer.lpp" +#line 568 "ds2_lexer.lpp" { auto res = fast_float::from_chars(yytext, yytext+strlen(yytext), yylval_param->d); if ( res.ec == std::errc::result_out_of_range ) { @@ -2806,9 +2799,9 @@ YY_RULE_SETUP return DOUBLE; } YY_BREAK -case 171: +case 170: YY_RULE_SETUP -#line 578 "ds2_lexer.lpp" +#line 577 "ds2_lexer.lpp" { if ( !yyextra->das_nested_parentheses ) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching parentheses", CompilationError::mismatching_parentheses); @@ -2818,17 +2811,17 @@ YY_RULE_SETUP return ')'; } YY_BREAK -case 172: +case 171: YY_RULE_SETUP -#line 586 "ds2_lexer.lpp" +#line 585 "ds2_lexer.lpp" { yyextra->das_nested_parentheses ++; return '('; } YY_BREAK -case 173: +case 172: YY_RULE_SETUP -#line 590 "ds2_lexer.lpp" +#line 589 "ds2_lexer.lpp" { if ( !yyextra->das_nested_square_braces ) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching square braces", CompilationError::mismatching_parentheses); @@ -2838,17 +2831,17 @@ YY_RULE_SETUP return ']'; } YY_BREAK -case 174: +case 173: YY_RULE_SETUP -#line 598 "ds2_lexer.lpp" +#line 597 "ds2_lexer.lpp" { yyextra->das_nested_square_braces ++; return '['; } YY_BREAK -case 175: +case 174: YY_RULE_SETUP -#line 602 "ds2_lexer.lpp" +#line 601 "ds2_lexer.lpp" { if ( yyextra->das_nested_sb ) { yyextra->das_nested_sb --; @@ -2868,9 +2861,9 @@ YY_RULE_SETUP } } YY_BREAK -case 176: +case 175: YY_RULE_SETUP -#line 620 "ds2_lexer.lpp" +#line 619 "ds2_lexer.lpp" { if ( yyextra->das_nested_sb ) { yyextra->das_nested_sb ++; @@ -2880,220 +2873,220 @@ YY_RULE_SETUP return '{'; } YY_BREAK +case 176: +YY_RULE_SETUP +#line 627 "ds2_lexer.lpp" +return COLCOL; + YY_BREAK case 177: YY_RULE_SETUP #line 628 "ds2_lexer.lpp" -return COLCOL; +return MTAG_DOTDOTDOT; YY_BREAK case 178: YY_RULE_SETUP #line 629 "ds2_lexer.lpp" -return MTAG_DOTDOTDOT; +return DOTDOT; YY_BREAK case 179: YY_RULE_SETUP #line 630 "ds2_lexer.lpp" -return DOTDOT; +return RPIPE; YY_BREAK case 180: YY_RULE_SETUP #line 631 "ds2_lexer.lpp" -return RPIPE; +return LPIPE; YY_BREAK case 181: YY_RULE_SETUP #line 632 "ds2_lexer.lpp" -return LPIPE; +return MTAG_E; YY_BREAK case 182: +/* rule 182 can match eol */ YY_RULE_SETUP #line 633 "ds2_lexer.lpp" -return MTAG_E; +unput(yytext[yyleng-1]); return MTAG_E; YY_BREAK case 183: /* rule 183 can match eol */ YY_RULE_SETUP #line 634 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_E; +unput(yytext[yyleng-1]); return MTAG_I; YY_BREAK case 184: /* rule 184 can match eol */ YY_RULE_SETUP #line 635 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_I; +unput(yytext[yyleng-1]); return MTAG_V; YY_BREAK case 185: /* rule 185 can match eol */ YY_RULE_SETUP #line 636 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_V; +unput(yytext[yyleng-1]); return MTAG_B; YY_BREAK case 186: /* rule 186 can match eol */ YY_RULE_SETUP #line 637 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_B; +unput(yytext[yyleng-1]); return MTAG_A; YY_BREAK case 187: /* rule 187 can match eol */ YY_RULE_SETUP #line 638 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_A; +unput(yytext[yyleng-1]); return MTAG_T; YY_BREAK case 188: /* rule 188 can match eol */ YY_RULE_SETUP #line 639 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_T; +unput(yytext[yyleng-1]); return MTAG_C; YY_BREAK case 189: /* rule 189 can match eol */ YY_RULE_SETUP #line 640 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_C; +unput(yytext[yyleng-1]); return MTAG_F; YY_BREAK case 190: -/* rule 190 can match eol */ YY_RULE_SETUP #line 641 "ds2_lexer.lpp" -unput(yytext[yyleng-1]); return MTAG_F; +return QQ; YY_BREAK case 191: YY_RULE_SETUP #line 642 "ds2_lexer.lpp" -return QQ; - YY_BREAK -case 192: -YY_RULE_SETUP -#line 643 "ds2_lexer.lpp" { yyextra->das_nested_square_braces ++; return QBRA; } YY_BREAK +case 192: +YY_RULE_SETUP +#line 646 "ds2_lexer.lpp" +return QDOT; + YY_BREAK case 193: YY_RULE_SETUP #line 647 "ds2_lexer.lpp" -return QDOT; +return CLONEEQU; YY_BREAK case 194: YY_RULE_SETUP #line 648 "ds2_lexer.lpp" -return CLONEEQU; +return RARROW; YY_BREAK case 195: YY_RULE_SETUP #line 649 "ds2_lexer.lpp" -return RARROW; +return LARROW; YY_BREAK case 196: YY_RULE_SETUP #line 650 "ds2_lexer.lpp" -return LARROW; +return ADDEQU; YY_BREAK case 197: YY_RULE_SETUP #line 651 "ds2_lexer.lpp" -return ADDEQU; +return SUBEQU; YY_BREAK case 198: YY_RULE_SETUP #line 652 "ds2_lexer.lpp" -return SUBEQU; +return DIVEQU; YY_BREAK case 199: YY_RULE_SETUP #line 653 "ds2_lexer.lpp" -return DIVEQU; +return MULEQU; YY_BREAK case 200: YY_RULE_SETUP #line 654 "ds2_lexer.lpp" -return MULEQU; +return MODEQU; YY_BREAK case 201: YY_RULE_SETUP #line 655 "ds2_lexer.lpp" -return MODEQU; +return ANDANDEQU; YY_BREAK case 202: YY_RULE_SETUP #line 656 "ds2_lexer.lpp" -return ANDANDEQU; +return OROREQU; YY_BREAK case 203: YY_RULE_SETUP #line 657 "ds2_lexer.lpp" -return OROREQU; +return XORXOREQU; YY_BREAK case 204: YY_RULE_SETUP #line 658 "ds2_lexer.lpp" -return XORXOREQU; +return ANDAND; YY_BREAK case 205: YY_RULE_SETUP #line 659 "ds2_lexer.lpp" -return ANDAND; +return OROR; YY_BREAK case 206: YY_RULE_SETUP #line 660 "ds2_lexer.lpp" -return OROR; +return XORXOR; YY_BREAK case 207: YY_RULE_SETUP #line 661 "ds2_lexer.lpp" -return XORXOR; +return ANDEQU; YY_BREAK case 208: YY_RULE_SETUP #line 662 "ds2_lexer.lpp" -return ANDEQU; +return OREQU; YY_BREAK case 209: YY_RULE_SETUP #line 663 "ds2_lexer.lpp" -return OREQU; +return XOREQU; YY_BREAK case 210: YY_RULE_SETUP #line 664 "ds2_lexer.lpp" -return XOREQU; +return ADDADD; YY_BREAK case 211: YY_RULE_SETUP #line 665 "ds2_lexer.lpp" -return ADDADD; +return SUBSUB; YY_BREAK case 212: YY_RULE_SETUP #line 666 "ds2_lexer.lpp" -return SUBSUB; +return LEEQU; YY_BREAK case 213: YY_RULE_SETUP #line 667 "ds2_lexer.lpp" -return LEEQU; +return GREQU; YY_BREAK case 214: YY_RULE_SETUP #line 668 "ds2_lexer.lpp" -return GREQU; +return EQUEQU; YY_BREAK case 215: YY_RULE_SETUP #line 669 "ds2_lexer.lpp" -return EQUEQU; +return NOTEQU; YY_BREAK case 216: YY_RULE_SETUP #line 670 "ds2_lexer.lpp" -return NOTEQU; - YY_BREAK -case 217: -YY_RULE_SETUP -#line 671 "ds2_lexer.lpp" { if ( yyextra->das_arrow_depth ) { unput('>'); @@ -3105,9 +3098,9 @@ YY_RULE_SETUP } } YY_BREAK -case 218: +case 217: YY_RULE_SETUP -#line 681 "ds2_lexer.lpp" +#line 680 "ds2_lexer.lpp" { if ( yyextra->das_arrow_depth ) { unput('>'); @@ -3118,50 +3111,50 @@ YY_RULE_SETUP } } YY_BREAK +case 218: +YY_RULE_SETUP +#line 689 "ds2_lexer.lpp" +return ROTL; + YY_BREAK case 219: YY_RULE_SETUP #line 690 "ds2_lexer.lpp" -return ROTL; +return SHL; YY_BREAK case 220: YY_RULE_SETUP #line 691 "ds2_lexer.lpp" -return SHL; +return SHREQU; YY_BREAK case 221: YY_RULE_SETUP #line 692 "ds2_lexer.lpp" -return SHREQU; +return SHLEQU; YY_BREAK case 222: YY_RULE_SETUP #line 693 "ds2_lexer.lpp" -return SHLEQU; +return ROTREQU; YY_BREAK case 223: YY_RULE_SETUP #line 694 "ds2_lexer.lpp" -return ROTREQU; +return ROTLEQU; YY_BREAK case 224: YY_RULE_SETUP #line 695 "ds2_lexer.lpp" -return ROTLEQU; +return MAPTO; YY_BREAK case 225: YY_RULE_SETUP #line 696 "ds2_lexer.lpp" -return MAPTO; - YY_BREAK -case 226: -YY_RULE_SETUP -#line 697 "ds2_lexer.lpp" /* skip white space */ YY_BREAK -case 227: -/* rule 227 can match eol */ +case 226: +/* rule 226 can match eol */ YY_RULE_SETUP -#line 699 "ds2_lexer.lpp" +#line 698 "ds2_lexer.lpp" { if ( yyextra->das_nested_curly_braces < 2 ) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching curly braces", CompilationError::mismatching_parentheses); @@ -3171,10 +3164,10 @@ YY_RULE_SETUP return SEMICOLON_CUR_CUR; } YY_BREAK -case 228: -/* rule 228 can match eol */ +case 227: +/* rule 227 can match eol */ YY_RULE_SETUP -#line 708 "ds2_lexer.lpp" +#line 707 "ds2_lexer.lpp" { if ( !yyextra->das_nested_curly_braces ) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching curly braces", CompilationError::mismatching_parentheses); @@ -3189,10 +3182,10 @@ YY_RULE_SETUP return SEMICOLON_CUR_SQR; } YY_BREAK -case 229: -/* rule 229 can match eol */ +case 228: +/* rule 228 can match eol */ YY_RULE_SETUP -#line 722 "ds2_lexer.lpp" +#line 721 "ds2_lexer.lpp" { if ( !yyextra->das_nested_curly_braces ) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching curly braces", CompilationError::mismatching_parentheses); @@ -3207,10 +3200,10 @@ YY_RULE_SETUP return COMMA_CUR_SQR; } YY_BREAK -case 230: -/* rule 230 can match eol */ +case 229: +/* rule 229 can match eol */ YY_RULE_SETUP -#line 736 "ds2_lexer.lpp" +#line 735 "ds2_lexer.lpp" { if ( yyextra->das_nested_square_braces < 2) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching square braces", CompilationError::mismatching_parentheses); @@ -3220,10 +3213,10 @@ YY_RULE_SETUP return SEMICOLON_SQR_SQR; } YY_BREAK -case 231: -/* rule 231 can match eol */ +case 230: +/* rule 230 can match eol */ YY_RULE_SETUP -#line 745 "ds2_lexer.lpp" +#line 744 "ds2_lexer.lpp" { if ( yyextra->das_nested_square_braces < 2) { das2_yyfatalerror(yylloc_param,yyscanner,"mismatching square braces", CompilationError::mismatching_parentheses); @@ -3233,25 +3226,25 @@ YY_RULE_SETUP return COMMA_SQR_SQR; } YY_BREAK -case 232: -/* rule 232 can match eol */ +case 231: +/* rule 231 can match eol */ YY_RULE_SETUP -#line 753 "ds2_lexer.lpp" +#line 752 "ds2_lexer.lpp" { YYCOLUMN(yyextra->das_yycolumn = 0, "NEW LINE"); } YY_BREAK -case 233: -/* rule 233 can match eol */ +case 232: +/* rule 232 can match eol */ YY_RULE_SETUP -#line 756 "ds2_lexer.lpp" +#line 755 "ds2_lexer.lpp" { YYCOLUMN(yyextra->das_yycolumn = 0, "NEW LINE"); das_accept_cpp_comment(yyextra->g_CommentReaders, yyscanner, *yylloc_param, yytext); } YY_BREAK case YY_STATE_EOF(normal): -#line 760 "ds2_lexer.lpp" +#line 759 "ds2_lexer.lpp" { if ( yyextra->g_FileAccessStack.size()==1 ) { YYCOLUMN(yyextra->das_yycolumn = 0,"EOF"); @@ -3264,17 +3257,17 @@ case YY_STATE_EOF(normal): } } YY_BREAK -case 234: +case 233: YY_RULE_SETUP -#line 771 "ds2_lexer.lpp" +#line 770 "ds2_lexer.lpp" return *yytext; YY_BREAK -case 235: +case 234: YY_RULE_SETUP -#line 773 "ds2_lexer.lpp" +#line 772 "ds2_lexer.lpp" ECHO; YY_BREAK -#line 3277 "ds2_lexer.cpp" +#line 3270 "ds2_lexer.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(include): yyterminate(); @@ -3575,7 +3568,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 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 >= 687 ) + if ( yy_current_state >= 682 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -3604,11 +3597,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 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 >= 687 ) + if ( yy_current_state >= 682 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 686); + yy_is_jam = (yy_current_state == 681); (void)yyg; return yy_is_jam ? 0 : yy_current_state; @@ -4468,7 +4461,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 773 "ds2_lexer.lpp" +#line 772 "ds2_lexer.lpp" void das2_accept_sequence ( yyscan_t yyscanner, const char * seq, size_t seqLen, int lineNo, FileInfo * info ) { diff --git a/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.lpp b/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.lpp index d04756c98..7927a41e0 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.lpp +++ b/prog/1stPartyLibs/daScript/src/parser/ds2_lexer.lpp @@ -70,7 +70,6 @@ void das_accept_cpp_comment ( vector & crdi, yyscan_t scanner, %% -\#gen2\# { /* skipping #gen2# text, which indicates type of syntax */ } \#[0-9]+,[0-9]+,\"[^\"]+\"\# { string txt = yytext; int lRow, lCol; diff --git a/prog/1stPartyLibs/daScript/src/parser/ds2_parser.cpp b/prog/1stPartyLibs/daScript/src/parser/ds2_parser.cpp index f480a10fe..13601f85b 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds2_parser.cpp +++ b/prog/1stPartyLibs/daScript/src/parser/ds2_parser.cpp @@ -403,206 +403,209 @@ enum yysymbol_kind_t YYSYMBOL_expression_any = 265, /* expression_any */ YYSYMBOL_expressions = 266, /* expressions */ YYSYMBOL_optional_expr_list = 267, /* optional_expr_list */ - YYSYMBOL_type_declaration_no_options_list = 268, /* type_declaration_no_options_list */ - YYSYMBOL_name_in_namespace = 269, /* name_in_namespace */ - YYSYMBOL_expression_delete = 270, /* expression_delete */ - YYSYMBOL_new_type_declaration = 271, /* new_type_declaration */ - YYSYMBOL_272_3 = 272, /* $@3 */ - YYSYMBOL_273_4 = 273, /* $@4 */ - YYSYMBOL_expr_new = 274, /* expr_new */ - YYSYMBOL_expression_break = 275, /* expression_break */ - YYSYMBOL_expression_continue = 276, /* expression_continue */ - YYSYMBOL_expression_return = 277, /* expression_return */ - YYSYMBOL_expression_yield = 278, /* expression_yield */ - YYSYMBOL_expression_try_catch = 279, /* expression_try_catch */ - YYSYMBOL_kwd_let_var_or_nothing = 280, /* kwd_let_var_or_nothing */ - YYSYMBOL_kwd_let = 281, /* kwd_let */ - YYSYMBOL_optional_in_scope = 282, /* optional_in_scope */ - YYSYMBOL_tuple_expansion = 283, /* tuple_expansion */ - YYSYMBOL_tuple_expansion_variable_declaration = 284, /* tuple_expansion_variable_declaration */ - YYSYMBOL_expression_let = 285, /* expression_let */ - YYSYMBOL_expr_cast = 286, /* expr_cast */ - YYSYMBOL_287_5 = 287, /* $@5 */ - YYSYMBOL_288_6 = 288, /* $@6 */ - YYSYMBOL_289_7 = 289, /* $@7 */ - YYSYMBOL_290_8 = 290, /* $@8 */ - YYSYMBOL_291_9 = 291, /* $@9 */ - YYSYMBOL_292_10 = 292, /* $@10 */ - YYSYMBOL_expr_type_decl = 293, /* expr_type_decl */ - YYSYMBOL_294_11 = 294, /* $@11 */ - YYSYMBOL_295_12 = 295, /* $@12 */ - YYSYMBOL_expr_type_info = 296, /* expr_type_info */ - YYSYMBOL_expr_list = 297, /* expr_list */ - YYSYMBOL_block_or_simple_block = 298, /* block_or_simple_block */ - YYSYMBOL_block_or_lambda = 299, /* block_or_lambda */ - YYSYMBOL_capture_entry = 300, /* capture_entry */ - YYSYMBOL_capture_list = 301, /* capture_list */ - YYSYMBOL_optional_capture_list = 302, /* optional_capture_list */ - YYSYMBOL_expr_full_block = 303, /* expr_full_block */ - YYSYMBOL_expr_full_block_assumed_piped = 304, /* expr_full_block_assumed_piped */ - YYSYMBOL_expr_numeric_const = 305, /* expr_numeric_const */ - YYSYMBOL_expr_assign = 306, /* expr_assign */ - YYSYMBOL_expr_named_call = 307, /* expr_named_call */ - YYSYMBOL_expr_method_call = 308, /* expr_method_call */ - YYSYMBOL_func_addr_name = 309, /* func_addr_name */ - YYSYMBOL_func_addr_expr = 310, /* func_addr_expr */ - YYSYMBOL_311_13 = 311, /* $@13 */ - YYSYMBOL_312_14 = 312, /* $@14 */ - YYSYMBOL_313_15 = 313, /* $@15 */ - YYSYMBOL_314_16 = 314, /* $@16 */ - YYSYMBOL_expr_field = 315, /* expr_field */ - YYSYMBOL_316_17 = 316, /* $@17 */ - YYSYMBOL_317_18 = 317, /* $@18 */ - YYSYMBOL_expr_call = 318, /* expr_call */ - YYSYMBOL_expr = 319, /* expr */ - YYSYMBOL_320_19 = 320, /* $@19 */ - YYSYMBOL_321_20 = 321, /* $@20 */ - YYSYMBOL_322_21 = 322, /* $@21 */ - YYSYMBOL_323_22 = 323, /* $@22 */ - YYSYMBOL_324_23 = 324, /* $@23 */ - YYSYMBOL_325_24 = 325, /* $@24 */ - YYSYMBOL_expr_mtag = 326, /* expr_mtag */ - YYSYMBOL_optional_field_annotation = 327, /* optional_field_annotation */ - YYSYMBOL_optional_override = 328, /* optional_override */ - YYSYMBOL_optional_constant = 329, /* optional_constant */ - YYSYMBOL_optional_public_or_private_member_variable = 330, /* optional_public_or_private_member_variable */ - YYSYMBOL_optional_static_member_variable = 331, /* optional_static_member_variable */ - YYSYMBOL_structure_variable_declaration = 332, /* structure_variable_declaration */ - YYSYMBOL_struct_variable_declaration_list = 333, /* struct_variable_declaration_list */ - YYSYMBOL_334_25 = 334, /* $@25 */ - YYSYMBOL_335_26 = 335, /* $@26 */ - YYSYMBOL_336_27 = 336, /* $@27 */ - YYSYMBOL_function_argument_declaration = 337, /* function_argument_declaration */ - YYSYMBOL_function_argument_list = 338, /* function_argument_list */ - YYSYMBOL_tuple_type = 339, /* tuple_type */ - YYSYMBOL_tuple_type_list = 340, /* tuple_type_list */ - YYSYMBOL_tuple_alias_type_list = 341, /* tuple_alias_type_list */ - YYSYMBOL_variant_type = 342, /* variant_type */ - YYSYMBOL_variant_type_list = 343, /* variant_type_list */ - YYSYMBOL_variant_alias_type_list = 344, /* variant_alias_type_list */ - YYSYMBOL_copy_or_move = 345, /* copy_or_move */ - YYSYMBOL_variable_declaration = 346, /* variable_declaration */ - YYSYMBOL_copy_or_move_or_clone = 347, /* copy_or_move_or_clone */ - YYSYMBOL_optional_ref = 348, /* optional_ref */ - YYSYMBOL_let_variable_name_with_pos_list = 349, /* let_variable_name_with_pos_list */ - YYSYMBOL_global_let_variable_name_with_pos_list = 350, /* global_let_variable_name_with_pos_list */ - YYSYMBOL_let_variable_declaration = 351, /* let_variable_declaration */ - YYSYMBOL_global_let_variable_declaration = 352, /* global_let_variable_declaration */ - YYSYMBOL_optional_shared = 353, /* optional_shared */ - YYSYMBOL_optional_public_or_private_variable = 354, /* optional_public_or_private_variable */ - YYSYMBOL_global_let = 355, /* global_let */ - YYSYMBOL_356_28 = 356, /* $@28 */ - YYSYMBOL_enum_expression = 357, /* enum_expression */ - YYSYMBOL_enum_list = 358, /* enum_list */ - YYSYMBOL_optional_public_or_private_alias = 359, /* optional_public_or_private_alias */ - YYSYMBOL_single_alias = 360, /* single_alias */ - YYSYMBOL_361_29 = 361, /* $@29 */ - YYSYMBOL_alias_declaration = 362, /* alias_declaration */ - YYSYMBOL_optional_public_or_private_enum = 363, /* optional_public_or_private_enum */ - YYSYMBOL_enum_name = 364, /* enum_name */ - YYSYMBOL_optional_enum_basic_type_declaration = 365, /* optional_enum_basic_type_declaration */ - YYSYMBOL_enum_declaration = 366, /* enum_declaration */ - YYSYMBOL_367_30 = 367, /* $@30 */ - YYSYMBOL_368_31 = 368, /* $@31 */ - YYSYMBOL_optional_structure_parent = 369, /* optional_structure_parent */ - YYSYMBOL_optional_sealed = 370, /* optional_sealed */ - YYSYMBOL_structure_name = 371, /* structure_name */ - YYSYMBOL_class_or_struct = 372, /* class_or_struct */ - YYSYMBOL_optional_public_or_private_structure = 373, /* optional_public_or_private_structure */ - YYSYMBOL_optional_struct_variable_declaration_list = 374, /* optional_struct_variable_declaration_list */ - YYSYMBOL_structure_declaration = 375, /* structure_declaration */ - YYSYMBOL_376_32 = 376, /* $@32 */ - YYSYMBOL_377_33 = 377, /* $@33 */ - YYSYMBOL_variable_name_with_pos_list = 378, /* variable_name_with_pos_list */ - YYSYMBOL_basic_type_declaration = 379, /* basic_type_declaration */ - YYSYMBOL_enum_basic_type_declaration = 380, /* enum_basic_type_declaration */ - YYSYMBOL_structure_type_declaration = 381, /* structure_type_declaration */ - YYSYMBOL_auto_type_declaration = 382, /* auto_type_declaration */ - YYSYMBOL_bitfield_bits = 383, /* bitfield_bits */ - YYSYMBOL_bitfield_alias_bits = 384, /* bitfield_alias_bits */ - YYSYMBOL_bitfield_type_declaration = 385, /* bitfield_type_declaration */ - YYSYMBOL_386_34 = 386, /* $@34 */ - YYSYMBOL_387_35 = 387, /* $@35 */ - YYSYMBOL_table_type_pair = 388, /* table_type_pair */ - YYSYMBOL_dim_list = 389, /* dim_list */ - YYSYMBOL_type_declaration_no_options = 390, /* type_declaration_no_options */ - YYSYMBOL_type_declaration_no_options_no_dim = 391, /* type_declaration_no_options_no_dim */ - YYSYMBOL_392_36 = 392, /* $@36 */ - YYSYMBOL_393_37 = 393, /* $@37 */ - YYSYMBOL_394_38 = 394, /* $@38 */ - YYSYMBOL_395_39 = 395, /* $@39 */ - YYSYMBOL_396_40 = 396, /* $@40 */ - YYSYMBOL_397_41 = 397, /* $@41 */ - YYSYMBOL_398_42 = 398, /* $@42 */ - YYSYMBOL_399_43 = 399, /* $@43 */ - YYSYMBOL_400_44 = 400, /* $@44 */ - YYSYMBOL_401_45 = 401, /* $@45 */ - YYSYMBOL_402_46 = 402, /* $@46 */ - YYSYMBOL_403_47 = 403, /* $@47 */ - YYSYMBOL_404_48 = 404, /* $@48 */ - YYSYMBOL_405_49 = 405, /* $@49 */ - YYSYMBOL_406_50 = 406, /* $@50 */ - YYSYMBOL_407_51 = 407, /* $@51 */ - YYSYMBOL_408_52 = 408, /* $@52 */ - YYSYMBOL_409_53 = 409, /* $@53 */ - YYSYMBOL_410_54 = 410, /* $@54 */ - YYSYMBOL_411_55 = 411, /* $@55 */ - YYSYMBOL_412_56 = 412, /* $@56 */ - YYSYMBOL_413_57 = 413, /* $@57 */ - YYSYMBOL_414_58 = 414, /* $@58 */ - YYSYMBOL_415_59 = 415, /* $@59 */ - YYSYMBOL_416_60 = 416, /* $@60 */ - YYSYMBOL_417_61 = 417, /* $@61 */ - YYSYMBOL_418_62 = 418, /* $@62 */ - YYSYMBOL_type_declaration = 419, /* type_declaration */ - YYSYMBOL_tuple_alias_declaration = 420, /* tuple_alias_declaration */ - YYSYMBOL_421_63 = 421, /* $@63 */ - YYSYMBOL_422_64 = 422, /* $@64 */ - YYSYMBOL_423_65 = 423, /* $@65 */ - YYSYMBOL_variant_alias_declaration = 424, /* variant_alias_declaration */ - YYSYMBOL_425_66 = 425, /* $@66 */ - YYSYMBOL_426_67 = 426, /* $@67 */ - YYSYMBOL_427_68 = 427, /* $@68 */ - YYSYMBOL_bitfield_alias_declaration = 428, /* bitfield_alias_declaration */ - YYSYMBOL_429_69 = 429, /* $@69 */ - YYSYMBOL_430_70 = 430, /* $@70 */ - YYSYMBOL_431_71 = 431, /* $@71 */ - YYSYMBOL_make_decl = 432, /* make_decl */ - YYSYMBOL_make_struct_fields = 433, /* make_struct_fields */ - YYSYMBOL_make_variant_dim = 434, /* make_variant_dim */ - YYSYMBOL_make_struct_single = 435, /* make_struct_single */ - YYSYMBOL_make_struct_dim_list = 436, /* make_struct_dim_list */ - YYSYMBOL_make_struct_dim_decl = 437, /* make_struct_dim_decl */ - YYSYMBOL_use_initializer = 438, /* use_initializer */ - YYSYMBOL_make_struct_decl = 439, /* make_struct_decl */ - YYSYMBOL_440_72 = 440, /* $@72 */ - YYSYMBOL_441_73 = 441, /* $@73 */ - YYSYMBOL_442_74 = 442, /* $@74 */ - YYSYMBOL_443_75 = 443, /* $@75 */ - YYSYMBOL_444_76 = 444, /* $@76 */ - YYSYMBOL_445_77 = 445, /* $@77 */ - YYSYMBOL_446_78 = 446, /* $@78 */ - YYSYMBOL_447_79 = 447, /* $@79 */ - YYSYMBOL_make_map_tuple = 448, /* make_map_tuple */ - YYSYMBOL_make_tuple_call = 449, /* make_tuple_call */ - YYSYMBOL_450_80 = 450, /* $@80 */ - YYSYMBOL_451_81 = 451, /* $@81 */ - YYSYMBOL_make_dim_decl = 452, /* make_dim_decl */ - YYSYMBOL_453_82 = 453, /* $@82 */ - YYSYMBOL_454_83 = 454, /* $@83 */ - YYSYMBOL_455_84 = 455, /* $@84 */ - YYSYMBOL_456_85 = 456, /* $@85 */ - YYSYMBOL_457_86 = 457, /* $@86 */ - YYSYMBOL_458_87 = 458, /* $@87 */ - YYSYMBOL_459_88 = 459, /* $@88 */ - YYSYMBOL_460_89 = 460, /* $@89 */ - YYSYMBOL_461_90 = 461, /* $@90 */ - YYSYMBOL_462_91 = 462, /* $@91 */ - YYSYMBOL_expr_map_tuple_list = 463, /* expr_map_tuple_list */ - YYSYMBOL_make_table_decl = 464, /* make_table_decl */ - YYSYMBOL_array_comprehension_where = 465, /* array_comprehension_where */ - YYSYMBOL_optional_comma = 466, /* optional_comma */ - YYSYMBOL_array_comprehension = 467 /* array_comprehension */ + YYSYMBOL_optional_expr_map_tuple_list = 268, /* optional_expr_map_tuple_list */ + YYSYMBOL_type_declaration_no_options_list = 269, /* type_declaration_no_options_list */ + YYSYMBOL_name_in_namespace = 270, /* name_in_namespace */ + YYSYMBOL_expression_delete = 271, /* expression_delete */ + YYSYMBOL_new_type_declaration = 272, /* new_type_declaration */ + YYSYMBOL_273_3 = 273, /* $@3 */ + YYSYMBOL_274_4 = 274, /* $@4 */ + YYSYMBOL_expr_new = 275, /* expr_new */ + YYSYMBOL_expression_break = 276, /* expression_break */ + YYSYMBOL_expression_continue = 277, /* expression_continue */ + YYSYMBOL_expression_return = 278, /* expression_return */ + YYSYMBOL_expression_yield = 279, /* expression_yield */ + YYSYMBOL_expression_try_catch = 280, /* expression_try_catch */ + YYSYMBOL_kwd_let_var_or_nothing = 281, /* kwd_let_var_or_nothing */ + YYSYMBOL_kwd_let = 282, /* kwd_let */ + YYSYMBOL_optional_in_scope = 283, /* optional_in_scope */ + YYSYMBOL_tuple_expansion = 284, /* tuple_expansion */ + YYSYMBOL_tuple_expansion_variable_declaration = 285, /* tuple_expansion_variable_declaration */ + YYSYMBOL_expression_let = 286, /* expression_let */ + YYSYMBOL_expr_cast = 287, /* expr_cast */ + YYSYMBOL_288_5 = 288, /* $@5 */ + YYSYMBOL_289_6 = 289, /* $@6 */ + YYSYMBOL_290_7 = 290, /* $@7 */ + YYSYMBOL_291_8 = 291, /* $@8 */ + YYSYMBOL_292_9 = 292, /* $@9 */ + YYSYMBOL_293_10 = 293, /* $@10 */ + YYSYMBOL_expr_type_decl = 294, /* expr_type_decl */ + YYSYMBOL_295_11 = 295, /* $@11 */ + YYSYMBOL_296_12 = 296, /* $@12 */ + YYSYMBOL_expr_type_info = 297, /* expr_type_info */ + YYSYMBOL_expr_list = 298, /* expr_list */ + YYSYMBOL_block_or_simple_block = 299, /* block_or_simple_block */ + YYSYMBOL_block_or_lambda = 300, /* block_or_lambda */ + YYSYMBOL_capture_entry = 301, /* capture_entry */ + YYSYMBOL_capture_list = 302, /* capture_list */ + YYSYMBOL_optional_capture_list = 303, /* optional_capture_list */ + YYSYMBOL_expr_full_block = 304, /* expr_full_block */ + YYSYMBOL_expr_full_block_assumed_piped = 305, /* expr_full_block_assumed_piped */ + YYSYMBOL_expr_numeric_const = 306, /* expr_numeric_const */ + YYSYMBOL_expr_assign = 307, /* expr_assign */ + YYSYMBOL_expr_named_call = 308, /* expr_named_call */ + YYSYMBOL_expr_method_call = 309, /* expr_method_call */ + YYSYMBOL_func_addr_name = 310, /* func_addr_name */ + YYSYMBOL_func_addr_expr = 311, /* func_addr_expr */ + YYSYMBOL_312_13 = 312, /* $@13 */ + YYSYMBOL_313_14 = 313, /* $@14 */ + YYSYMBOL_314_15 = 314, /* $@15 */ + YYSYMBOL_315_16 = 315, /* $@16 */ + YYSYMBOL_expr_field = 316, /* expr_field */ + YYSYMBOL_317_17 = 317, /* $@17 */ + YYSYMBOL_318_18 = 318, /* $@18 */ + YYSYMBOL_expr_call = 319, /* expr_call */ + YYSYMBOL_expr = 320, /* expr */ + YYSYMBOL_321_19 = 321, /* $@19 */ + YYSYMBOL_322_20 = 322, /* $@20 */ + YYSYMBOL_323_21 = 323, /* $@21 */ + YYSYMBOL_324_22 = 324, /* $@22 */ + YYSYMBOL_325_23 = 325, /* $@23 */ + YYSYMBOL_326_24 = 326, /* $@24 */ + YYSYMBOL_expr_mtag = 327, /* expr_mtag */ + YYSYMBOL_optional_field_annotation = 328, /* optional_field_annotation */ + YYSYMBOL_optional_override = 329, /* optional_override */ + YYSYMBOL_optional_constant = 330, /* optional_constant */ + YYSYMBOL_optional_public_or_private_member_variable = 331, /* optional_public_or_private_member_variable */ + YYSYMBOL_optional_static_member_variable = 332, /* optional_static_member_variable */ + YYSYMBOL_structure_variable_declaration = 333, /* structure_variable_declaration */ + YYSYMBOL_struct_variable_declaration_list = 334, /* struct_variable_declaration_list */ + YYSYMBOL_335_25 = 335, /* $@25 */ + YYSYMBOL_336_26 = 336, /* $@26 */ + YYSYMBOL_337_27 = 337, /* $@27 */ + YYSYMBOL_function_argument_declaration = 338, /* function_argument_declaration */ + YYSYMBOL_function_argument_list = 339, /* function_argument_list */ + YYSYMBOL_tuple_type = 340, /* tuple_type */ + YYSYMBOL_tuple_type_list = 341, /* tuple_type_list */ + YYSYMBOL_tuple_alias_type_list = 342, /* tuple_alias_type_list */ + YYSYMBOL_variant_type = 343, /* variant_type */ + YYSYMBOL_variant_type_list = 344, /* variant_type_list */ + YYSYMBOL_variant_alias_type_list = 345, /* variant_alias_type_list */ + YYSYMBOL_copy_or_move = 346, /* copy_or_move */ + YYSYMBOL_variable_declaration = 347, /* variable_declaration */ + YYSYMBOL_copy_or_move_or_clone = 348, /* copy_or_move_or_clone */ + YYSYMBOL_optional_ref = 349, /* optional_ref */ + YYSYMBOL_let_variable_name_with_pos_list = 350, /* let_variable_name_with_pos_list */ + YYSYMBOL_global_let_variable_name_with_pos_list = 351, /* global_let_variable_name_with_pos_list */ + YYSYMBOL_let_variable_declaration = 352, /* let_variable_declaration */ + YYSYMBOL_global_let_variable_declaration = 353, /* global_let_variable_declaration */ + YYSYMBOL_optional_shared = 354, /* optional_shared */ + YYSYMBOL_optional_public_or_private_variable = 355, /* optional_public_or_private_variable */ + YYSYMBOL_global_let = 356, /* global_let */ + YYSYMBOL_357_28 = 357, /* $@28 */ + YYSYMBOL_enum_expression = 358, /* enum_expression */ + YYSYMBOL_enum_list = 359, /* enum_list */ + YYSYMBOL_optional_public_or_private_alias = 360, /* optional_public_or_private_alias */ + YYSYMBOL_single_alias = 361, /* single_alias */ + YYSYMBOL_362_29 = 362, /* $@29 */ + YYSYMBOL_alias_declaration = 363, /* alias_declaration */ + YYSYMBOL_optional_public_or_private_enum = 364, /* optional_public_or_private_enum */ + YYSYMBOL_enum_name = 365, /* enum_name */ + YYSYMBOL_optional_enum_basic_type_declaration = 366, /* optional_enum_basic_type_declaration */ + YYSYMBOL_enum_declaration = 367, /* enum_declaration */ + YYSYMBOL_368_30 = 368, /* $@30 */ + YYSYMBOL_369_31 = 369, /* $@31 */ + YYSYMBOL_optional_structure_parent = 370, /* optional_structure_parent */ + YYSYMBOL_optional_sealed = 371, /* optional_sealed */ + YYSYMBOL_structure_name = 372, /* structure_name */ + YYSYMBOL_class_or_struct = 373, /* class_or_struct */ + YYSYMBOL_optional_public_or_private_structure = 374, /* optional_public_or_private_structure */ + YYSYMBOL_optional_struct_variable_declaration_list = 375, /* optional_struct_variable_declaration_list */ + YYSYMBOL_structure_declaration = 376, /* structure_declaration */ + YYSYMBOL_377_32 = 377, /* $@32 */ + YYSYMBOL_378_33 = 378, /* $@33 */ + YYSYMBOL_variable_name_with_pos_list = 379, /* variable_name_with_pos_list */ + YYSYMBOL_basic_type_declaration = 380, /* basic_type_declaration */ + YYSYMBOL_enum_basic_type_declaration = 381, /* enum_basic_type_declaration */ + YYSYMBOL_structure_type_declaration = 382, /* structure_type_declaration */ + YYSYMBOL_auto_type_declaration = 383, /* auto_type_declaration */ + YYSYMBOL_bitfield_bits = 384, /* bitfield_bits */ + YYSYMBOL_bitfield_alias_bits = 385, /* bitfield_alias_bits */ + YYSYMBOL_bitfield_type_declaration = 386, /* bitfield_type_declaration */ + YYSYMBOL_387_34 = 387, /* $@34 */ + YYSYMBOL_388_35 = 388, /* $@35 */ + YYSYMBOL_c_or_s = 389, /* c_or_s */ + YYSYMBOL_table_type_pair = 390, /* table_type_pair */ + YYSYMBOL_dim_list = 391, /* dim_list */ + YYSYMBOL_type_declaration_no_options = 392, /* type_declaration_no_options */ + YYSYMBOL_type_declaration_no_options_no_dim = 393, /* type_declaration_no_options_no_dim */ + YYSYMBOL_394_36 = 394, /* $@36 */ + YYSYMBOL_395_37 = 395, /* $@37 */ + YYSYMBOL_396_38 = 396, /* $@38 */ + YYSYMBOL_397_39 = 397, /* $@39 */ + YYSYMBOL_398_40 = 398, /* $@40 */ + YYSYMBOL_399_41 = 399, /* $@41 */ + YYSYMBOL_400_42 = 400, /* $@42 */ + YYSYMBOL_401_43 = 401, /* $@43 */ + YYSYMBOL_402_44 = 402, /* $@44 */ + YYSYMBOL_403_45 = 403, /* $@45 */ + YYSYMBOL_404_46 = 404, /* $@46 */ + YYSYMBOL_405_47 = 405, /* $@47 */ + YYSYMBOL_406_48 = 406, /* $@48 */ + YYSYMBOL_407_49 = 407, /* $@49 */ + YYSYMBOL_408_50 = 408, /* $@50 */ + YYSYMBOL_409_51 = 409, /* $@51 */ + YYSYMBOL_410_52 = 410, /* $@52 */ + YYSYMBOL_411_53 = 411, /* $@53 */ + YYSYMBOL_412_54 = 412, /* $@54 */ + YYSYMBOL_413_55 = 413, /* $@55 */ + YYSYMBOL_414_56 = 414, /* $@56 */ + YYSYMBOL_415_57 = 415, /* $@57 */ + YYSYMBOL_416_58 = 416, /* $@58 */ + YYSYMBOL_417_59 = 417, /* $@59 */ + YYSYMBOL_418_60 = 418, /* $@60 */ + YYSYMBOL_419_61 = 419, /* $@61 */ + YYSYMBOL_420_62 = 420, /* $@62 */ + YYSYMBOL_type_declaration = 421, /* type_declaration */ + YYSYMBOL_tuple_alias_declaration = 422, /* tuple_alias_declaration */ + YYSYMBOL_423_63 = 423, /* $@63 */ + YYSYMBOL_424_64 = 424, /* $@64 */ + YYSYMBOL_425_65 = 425, /* $@65 */ + YYSYMBOL_variant_alias_declaration = 426, /* variant_alias_declaration */ + YYSYMBOL_427_66 = 427, /* $@66 */ + YYSYMBOL_428_67 = 428, /* $@67 */ + YYSYMBOL_429_68 = 429, /* $@68 */ + YYSYMBOL_bitfield_alias_declaration = 430, /* bitfield_alias_declaration */ + YYSYMBOL_431_69 = 431, /* $@69 */ + YYSYMBOL_432_70 = 432, /* $@70 */ + YYSYMBOL_433_71 = 433, /* $@71 */ + YYSYMBOL_make_decl = 434, /* make_decl */ + YYSYMBOL_make_struct_fields = 435, /* make_struct_fields */ + YYSYMBOL_make_variant_dim = 436, /* make_variant_dim */ + YYSYMBOL_make_struct_single = 437, /* make_struct_single */ + YYSYMBOL_make_struct_dim_list = 438, /* make_struct_dim_list */ + YYSYMBOL_make_struct_dim_decl = 439, /* make_struct_dim_decl */ + YYSYMBOL_optional_make_struct_dim_decl = 440, /* optional_make_struct_dim_decl */ + YYSYMBOL_use_initializer = 441, /* use_initializer */ + YYSYMBOL_make_struct_decl = 442, /* make_struct_decl */ + YYSYMBOL_443_72 = 443, /* $@72 */ + YYSYMBOL_444_73 = 444, /* $@73 */ + YYSYMBOL_445_74 = 445, /* $@74 */ + YYSYMBOL_446_75 = 446, /* $@75 */ + YYSYMBOL_447_76 = 447, /* $@76 */ + YYSYMBOL_448_77 = 448, /* $@77 */ + YYSYMBOL_449_78 = 449, /* $@78 */ + YYSYMBOL_450_79 = 450, /* $@79 */ + YYSYMBOL_make_map_tuple = 451, /* make_map_tuple */ + YYSYMBOL_make_tuple_call = 452, /* make_tuple_call */ + YYSYMBOL_453_80 = 453, /* $@80 */ + YYSYMBOL_454_81 = 454, /* $@81 */ + YYSYMBOL_make_dim_decl = 455, /* make_dim_decl */ + YYSYMBOL_456_82 = 456, /* $@82 */ + YYSYMBOL_457_83 = 457, /* $@83 */ + YYSYMBOL_458_84 = 458, /* $@84 */ + YYSYMBOL_459_85 = 459, /* $@85 */ + YYSYMBOL_460_86 = 460, /* $@86 */ + YYSYMBOL_461_87 = 461, /* $@87 */ + YYSYMBOL_462_88 = 462, /* $@88 */ + YYSYMBOL_463_89 = 463, /* $@89 */ + YYSYMBOL_464_90 = 464, /* $@90 */ + YYSYMBOL_465_91 = 465, /* $@91 */ + YYSYMBOL_expr_map_tuple_list = 466, /* expr_map_tuple_list */ + YYSYMBOL_make_table_decl = 467, /* make_table_decl */ + YYSYMBOL_array_comprehension_where = 468, /* array_comprehension_where */ + YYSYMBOL_optional_comma = 469, /* optional_comma */ + YYSYMBOL_array_comprehension = 470 /* array_comprehension */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -933,16 +936,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 10704 +#define YYLAST 10702 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 210 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 258 +#define YYNNTS 261 /* YYNRULES -- Number of rules. */ -#define YYNRULES 769 +#define YYNRULES 778 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1415 +#define YYNSTATES 1426 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 437 @@ -1009,83 +1012,84 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 531, 531, 532, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 553, 559, 560, - 561, 565, 566, 570, 588, 589, 590, 591, 595, 599, - 604, 613, 621, 637, 642, 650, 650, 689, 707, 711, - 714, 718, 724, 733, 736, 742, 743, 747, 751, 752, - 756, 759, 765, 771, 774, 780, 781, 785, 786, 787, - 796, 797, 801, 802, 808, 809, 810, 811, 812, 816, - 822, 828, 834, 842, 852, 861, 868, 869, 870, 871, - 872, 873, 877, 882, 890, 891, 892, 896, 897, 898, - 899, 900, 901, 902, 903, 909, 912, 918, 921, 927, - 928, 929, 933, 946, 964, 967, 975, 986, 997, 1008, - 1011, 1018, 1022, 1029, 1030, 1034, 1035, 1036, 1040, 1043, - 1050, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, - 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, - 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, - 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, - 1133, 1134, 1135, 1136, 1137, 1142, 1160, 1161, 1162, 1166, - 1172, 1172, 1189, 1193, 1204, 1217, 1218, 1219, 1220, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 1233, 1234, 1238, 1243, 1249, 1255, 1256, 1260, 1264, - 1271, 1272, 1283, 1287, 1290, 1298, 1298, 1298, 1304, 1307, - 1311, 1315, 1322, 1328, 1332, 1336, 1339, 1342, 1350, 1353, - 1361, 1367, 1368, 1369, 1373, 1374, 1378, 1379, 1383, 1388, - 1396, 1402, 1414, 1417, 1423, 1423, 1423, 1426, 1426, 1426, - 1431, 1431, 1431, 1439, 1439, 1439, 1445, 1455, 1466, 1481, - 1484, 1490, 1491, 1498, 1509, 1510, 1511, 1515, 1516, 1517, - 1518, 1522, 1527, 1535, 1536, 1540, 1547, 1551, 1557, 1558, - 1559, 1560, 1561, 1562, 1563, 1567, 1568, 1569, 1570, 1571, - 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 1585, 1589, 1596, 1608, 1613, 1623, 1627, - 1634, 1637, 1637, 1637, 1642, 1642, 1642, 1655, 1659, 1663, - 1668, 1675, 1675, 1675, 1682, 1686, 1695, 1699, 1702, 1708, - 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, - 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, - 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, - 1739, 1740, 1741, 1742, 1743, 1749, 1750, 1751, 1752, 1753, - 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, - 1776, 1777, 1780, 1783, 1788, 1789, 1792, 1792, 1792, 1795, - 1800, 1804, 1808, 1808, 1808, 1813, 1816, 1820, 1820, 1820, - 1825, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, - 1838, 1842, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1856, - 1860, 1864, 1868, 1872, 1876, 1880, 1884, 1888, 1895, 1896, - 1900, 1901, 1902, 1906, 1907, 1911, 1912, 1913, 1917, 1918, - 1922, 1933, 1936, 1936, 1955, 1954, 1968, 1967, 1983, 1992, - 2002, 2003, 2007, 2010, 2019, 2020, 2024, 2027, 2030, 2046, - 2055, 2056, 2060, 2063, 2066, 2080, 2081, 2085, 2091, 2097, - 2100, 2104, 2113, 2114, 2115, 2119, 2120, 2124, 2131, 2136, - 2145, 2151, 2162, 2169, 2179, 2182, 2187, 2198, 2201, 2206, - 2218, 2219, 2223, 2224, 2225, 2229, 2229, 2247, 2251, 2258, - 2261, 2274, 2291, 2292, 2293, 2298, 2298, 2324, 2328, 2329, - 2330, 2334, 2344, 2347, 2353, 2358, 2353, 2373, 2374, 2378, - 2379, 2383, 2389, 2390, 2394, 2395, 2396, 2400, 2403, 2409, - 2414, 2409, 2428, 2435, 2440, 2449, 2455, 2466, 2467, 2468, - 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, - 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, - 2489, 2490, 2491, 2492, 2496, 2497, 2498, 2499, 2500, 2501, - 2502, 2503, 2507, 2518, 2522, 2529, 2541, 2548, 2557, 2562, - 2572, 2585, 2585, 2585, 2598, 2602, 2609, 2613, 2617, 2621, - 2628, 2631, 2649, 2650, 2651, 2652, 2653, 2653, 2653, 2657, - 2662, 2669, 2669, 2676, 2680, 2684, 2689, 2694, 2699, 2704, - 2708, 2712, 2717, 2721, 2725, 2730, 2730, 2730, 2736, 2743, - 2743, 2743, 2748, 2748, 2748, 2754, 2754, 2754, 2759, 2763, - 2763, 2763, 2768, 2768, 2768, 2777, 2781, 2781, 2781, 2786, - 2786, 2786, 2795, 2799, 2799, 2799, 2804, 2804, 2804, 2813, - 2813, 2813, 2819, 2819, 2819, 2828, 2831, 2842, 2858, 2863, - 2868, 2858, 2893, 2898, 2904, 2893, 2929, 2934, 2939, 2929, - 2969, 2970, 2971, 2972, 2973, 2977, 2984, 2991, 2997, 3003, - 3010, 3017, 3023, 3032, 3038, 3046, 3051, 3058, 3063, 3069, - 3070, 3074, 3074, 3074, 3082, 3082, 3082, 3089, 3089, 3089, - 3096, 3096, 3096, 3107, 3113, 3119, 3125, 3125, 3125, 3135, - 3143, 3143, 3143, 3153, 3153, 3153, 3163, 3163, 3163, 3173, - 3181, 3181, 3181, 3189, 3196, 3196, 3196, 3206, 3209, 3215, - 3223, 3231, 3239, 3252, 3253, 3257, 3258, 3263, 3266, 3269 + 0, 533, 533, 534, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 555, 561, 562, + 563, 567, 568, 572, 590, 591, 592, 593, 597, 601, + 606, 615, 623, 639, 644, 652, 652, 691, 709, 713, + 716, 720, 726, 735, 738, 744, 745, 749, 753, 754, + 758, 761, 767, 773, 776, 782, 783, 787, 788, 789, + 798, 799, 803, 804, 810, 811, 812, 813, 814, 818, + 824, 830, 836, 844, 854, 863, 870, 871, 872, 873, + 874, 875, 879, 884, 892, 893, 894, 898, 899, 900, + 901, 902, 903, 904, 905, 911, 914, 920, 923, 929, + 930, 931, 935, 948, 966, 969, 977, 988, 999, 1010, + 1013, 1020, 1024, 1031, 1032, 1036, 1037, 1038, 1042, 1045, + 1052, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, + 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, + 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, + 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1144, 1162, 1163, 1164, 1168, + 1174, 1174, 1191, 1195, 1206, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, + 1234, 1235, 1236, 1240, 1245, 1251, 1257, 1258, 1262, 1263, + 1267, 1271, 1278, 1279, 1290, 1294, 1297, 1305, 1305, 1305, + 1311, 1314, 1318, 1322, 1329, 1335, 1339, 1343, 1346, 1349, + 1357, 1360, 1368, 1374, 1375, 1376, 1380, 1381, 1385, 1386, + 1390, 1395, 1403, 1409, 1421, 1424, 1430, 1430, 1430, 1433, + 1433, 1433, 1438, 1438, 1438, 1446, 1446, 1446, 1452, 1462, + 1473, 1488, 1491, 1497, 1498, 1505, 1516, 1517, 1518, 1522, + 1523, 1524, 1525, 1529, 1534, 1542, 1543, 1547, 1554, 1558, + 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1574, 1575, 1576, + 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, + 1587, 1588, 1589, 1590, 1591, 1592, 1596, 1603, 1615, 1620, + 1630, 1634, 1641, 1644, 1644, 1644, 1649, 1649, 1649, 1662, + 1666, 1670, 1675, 1682, 1682, 1682, 1689, 1693, 1703, 1712, + 1721, 1725, 1728, 1734, 1735, 1736, 1737, 1738, 1739, 1740, + 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, + 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1775, + 1776, 1777, 1778, 1779, 1792, 1793, 1794, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1806, 1809, 1814, 1815, + 1818, 1818, 1818, 1821, 1826, 1830, 1834, 1834, 1834, 1839, + 1842, 1846, 1846, 1846, 1851, 1854, 1855, 1856, 1857, 1858, + 1859, 1860, 1861, 1862, 1864, 1868, 1869, 1877, 1878, 1879, + 1880, 1881, 1882, 1883, 1887, 1891, 1895, 1899, 1903, 1907, + 1911, 1915, 1919, 1926, 1927, 1931, 1932, 1933, 1937, 1938, + 1942, 1943, 1944, 1948, 1949, 1953, 1964, 1967, 1967, 1986, + 1985, 1999, 1998, 2014, 2023, 2033, 2034, 2038, 2041, 2050, + 2051, 2055, 2058, 2061, 2077, 2086, 2087, 2091, 2094, 2097, + 2111, 2112, 2116, 2122, 2128, 2131, 2135, 2144, 2145, 2146, + 2150, 2151, 2155, 2162, 2167, 2176, 2182, 2193, 2200, 2210, + 2213, 2218, 2229, 2232, 2237, 2249, 2250, 2254, 2255, 2256, + 2260, 2260, 2278, 2282, 2289, 2292, 2305, 2322, 2323, 2324, + 2329, 2329, 2355, 2359, 2360, 2361, 2365, 2375, 2378, 2384, + 2389, 2384, 2404, 2405, 2409, 2410, 2414, 2420, 2421, 2425, + 2426, 2427, 2431, 2434, 2440, 2445, 2440, 2459, 2466, 2471, + 2480, 2486, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, + 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, + 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2527, + 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2538, 2549, 2553, + 2560, 2572, 2579, 2588, 2593, 2603, 2616, 2616, 2616, 2629, + 2630, 2634, 2638, 2645, 2649, 2653, 2657, 2664, 2667, 2685, + 2686, 2687, 2688, 2689, 2689, 2689, 2693, 2698, 2705, 2705, + 2712, 2716, 2720, 2725, 2730, 2735, 2740, 2744, 2748, 2753, + 2757, 2761, 2766, 2766, 2766, 2772, 2779, 2779, 2779, 2784, + 2784, 2784, 2790, 2790, 2790, 2795, 2799, 2799, 2799, 2804, + 2804, 2804, 2813, 2817, 2817, 2817, 2822, 2822, 2822, 2831, + 2835, 2835, 2835, 2840, 2840, 2840, 2849, 2849, 2849, 2855, + 2855, 2855, 2864, 2867, 2878, 2894, 2899, 2904, 2894, 2929, + 2934, 2940, 2929, 2965, 2970, 2975, 2965, 3005, 3006, 3007, + 3008, 3009, 3013, 3020, 3027, 3033, 3039, 3046, 3053, 3059, + 3068, 3074, 3082, 3087, 3094, 3099, 3105, 3106, 3110, 3111, + 3115, 3115, 3115, 3123, 3123, 3123, 3130, 3130, 3130, 3137, + 3137, 3137, 3148, 3154, 3160, 3166, 3166, 3166, 3176, 3184, + 3184, 3184, 3194, 3194, 3194, 3204, 3204, 3204, 3214, 3222, + 3222, 3222, 3241, 3248, 3248, 3248, 3258, 3261, 3267, 3275, + 3283, 3303, 3328, 3329, 3333, 3334, 3339, 3342, 3345 }; #endif @@ -1163,16 +1167,16 @@ static const char *const yytname[] = "optional_public_or_private_function", "function_declaration_header", "function_declaration", "$@2", "expression_block", "expr_call_pipe", "expression_any", "expressions", "optional_expr_list", - "type_declaration_no_options_list", "name_in_namespace", - "expression_delete", "new_type_declaration", "$@3", "$@4", "expr_new", - "expression_break", "expression_continue", "expression_return", - "expression_yield", "expression_try_catch", "kwd_let_var_or_nothing", - "kwd_let", "optional_in_scope", "tuple_expansion", - "tuple_expansion_variable_declaration", "expression_let", "expr_cast", - "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "expr_type_decl", "$@11", - "$@12", "expr_type_info", "expr_list", "block_or_simple_block", - "block_or_lambda", "capture_entry", "capture_list", - "optional_capture_list", "expr_full_block", + "optional_expr_map_tuple_list", "type_declaration_no_options_list", + "name_in_namespace", "expression_delete", "new_type_declaration", "$@3", + "$@4", "expr_new", "expression_break", "expression_continue", + "expression_return", "expression_yield", "expression_try_catch", + "kwd_let_var_or_nothing", "kwd_let", "optional_in_scope", + "tuple_expansion", "tuple_expansion_variable_declaration", + "expression_let", "expr_cast", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", + "expr_type_decl", "$@11", "$@12", "expr_type_info", "expr_list", + "block_or_simple_block", "block_or_lambda", "capture_entry", + "capture_list", "optional_capture_list", "expr_full_block", "expr_full_block_assumed_piped", "expr_numeric_const", "expr_assign", "expr_named_call", "expr_method_call", "func_addr_name", "func_addr_expr", "$@13", "$@14", "$@15", "$@16", "expr_field", "$@17", @@ -1199,7 +1203,7 @@ static const char *const yytname[] = "$@32", "$@33", "variable_name_with_pos_list", "basic_type_declaration", "enum_basic_type_declaration", "structure_type_declaration", "auto_type_declaration", "bitfield_bits", "bitfield_alias_bits", - "bitfield_type_declaration", "$@34", "$@35", "table_type_pair", + "bitfield_type_declaration", "$@34", "$@35", "c_or_s", "table_type_pair", "dim_list", "type_declaration_no_options", "type_declaration_no_options_no_dim", "$@36", "$@37", "$@38", "$@39", "$@40", "$@41", "$@42", "$@43", "$@44", "$@45", "$@46", "$@47", "$@48", @@ -1209,11 +1213,12 @@ static const char *const yytname[] = "variant_alias_declaration", "$@66", "$@67", "$@68", "bitfield_alias_declaration", "$@69", "$@70", "$@71", "make_decl", "make_struct_fields", "make_variant_dim", "make_struct_single", - "make_struct_dim_list", "make_struct_dim_decl", "use_initializer", - "make_struct_decl", "$@72", "$@73", "$@74", "$@75", "$@76", "$@77", - "$@78", "$@79", "make_map_tuple", "make_tuple_call", "$@80", "$@81", - "make_dim_decl", "$@82", "$@83", "$@84", "$@85", "$@86", "$@87", "$@88", - "$@89", "$@90", "$@91", "expr_map_tuple_list", "make_table_decl", + "make_struct_dim_list", "make_struct_dim_decl", + "optional_make_struct_dim_decl", "use_initializer", "make_struct_decl", + "$@72", "$@73", "$@74", "$@75", "$@76", "$@77", "$@78", "$@79", + "make_map_tuple", "make_tuple_call", "$@80", "$@81", "make_dim_decl", + "$@82", "$@83", "$@84", "$@85", "$@86", "$@87", "$@88", "$@89", "$@90", + "$@91", "expr_map_tuple_list", "make_table_decl", "array_comprehension_where", "optional_comma", "array_comprehension", YY_NULLPTR }; @@ -1224,12 +1229,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-1236) +#define YYPACT_NINF (-1274) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-677) +#define YYTABLE_NINF (-684) #define yytable_value_is_error(Yyn) \ ((Yyn) == YYTABLE_NINF) @@ -1238,148 +1243,149 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -1236, 23, -1236, -1236, 24, -54, -67, 331, -1236, -102, - 331, 331, 331, -1236, 148, 58, -1236, -1236, -9, -1236, - -1236, -1236, 175, -1236, 91, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, 46, -1236, 155, 179, 305, - -1236, -1236, -67, 11, -1236, -1236, -1236, 211, 235, -1236, - -1236, 91, 273, 283, 284, 301, 134, -1236, -1236, -1236, - 58, 58, 58, 275, -1236, 520, 51, -1236, -1236, -1236, - -1236, 424, 428, 440, -1236, 452, 22, 24, 335, -1236, - -54, 226, 336, -1236, 361, 373, -1236, -1236, -1236, 456, - -1236, -1236, -1236, -1236, 376, 368, -1236, -1236, -41, 24, - 58, 58, 58, 58, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, 391, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -87, 94, -1236, -1236, -1236, -1236, 494, - -1236, -1236, 375, -1236, -1236, -1236, 400, 413, 421, -1236, - -1236, 430, -1236, 39, -1236, 497, 465, 520, 10542, -1236, - 435, 503, 416, -1236, -1236, 498, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, 106, -1236, 1577, -1236, -1236, -1236, -1236, - -1236, 9222, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, 611, 612, -1236, - 445, 481, 325, 483, -1236, 507, -1236, 24, 464, 511, - -1236, -1236, -1236, 94, -1236, 489, 490, 491, 472, 493, - 496, -1236, -1236, -1236, 474, -1236, -1236, -1236, -1236, -1236, - 499, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, 500, -1236, -1236, -1236, 501, 504, -1236, -1236, - -1236, -1236, 506, 508, 477, 148, -1236, -1236, -1236, -1236, - -1236, -1236, 671, 510, 526, -1236, -1236, 533, 535, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, 536, - 495, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, 678, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, 540, 502, -1236, -1236, - -100, 522, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, 524, 537, -1236, 24, -1236, 144, - -1236, -1236, -1236, -1236, -1236, 5979, -1236, -1236, 546, -1236, - 143, 191, 201, -1236, -1236, 5979, 216, -1236, -1236, -1236, - 9, -1236, -1236, 3, -1236, 3261, -1236, 509, 1300, -1236, - 531, 1399, -68, -1236, -1236, -1236, -1236, 549, 581, -1236, - 514, -1236, 110, -1236, -32, 1577, -1236, 1877, 552, 148, - -1236, -1236, -1236, -1236, 558, 1577, -1236, 26, 1577, 1577, - 1577, 538, 539, -1236, -1236, 66, 148, 548, 30, -1236, - 217, 516, 550, 553, 517, 554, 231, 555, -1236, 232, - 557, 560, 5979, 5979, 529, 532, 542, 544, 545, 551, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, 3457, - 5979, 5979, 5979, 5979, 5979, 2873, 5979, -1236, 559, -1236, - -1236, -1236, 556, -1236, -1236, -1236, -1236, 562, -1236, -1236, - -1236, -1236, -1236, -1236, 100, 1401, -1236, 561, -1236, -1236, - -1236, -1236, -1236, -1236, 1577, 1577, 519, 586, 1577, 445, - 1577, 445, 1577, 445, 6322, 589, 6316, -1236, 5979, -1236, - -1236, -1236, -1236, 567, -1236, -1236, 8674, 3651, -1236, -1236, - 595, -1236, -19, -1236, 571, 510, 587, 578, -1236, 591, - 603, -1236, -1236, 5979, -1236, -1236, 156, -66, -1236, 510, - -1236, 572, -1236, -1236, 574, 3845, -1236, 481, 4039, 575, - 619, -1236, 610, 628, 4233, 481, 4427, 747, -1236, 615, - 617, 585, 781, -1236, -1236, -1236, -1236, -1236, 621, -1236, - 623, 624, 625, 627, 629, -1236, 734, -1236, 630, 9106, - 626, -1236, 632, -1236, 20, -1236, 118, -1236, -1236, -1236, - 5979, 8, 370, 620, 223, -1236, -1236, -1236, 598, 606, - -1236, 244, -1236, 631, 633, 634, -1236, 5979, 1577, 5979, - 5979, -1236, -1236, 5979, -1236, -1236, 5979, -1236, -1236, 5979, - -1236, 1577, 19, 19, 5979, 5979, 5979, 5979, 5979, 5979, - 476, 156, 9253, -1236, 635, 19, 19, -48, 19, 19, - 156, 801, 639, 9910, 639, 212, 3067, 816, -1236, 613, - 562, -1236, 10392, 10423, 5979, 5979, -1236, -1236, 5979, 5979, - 5979, 5979, 660, 5979, 314, 5979, 5979, 5979, 5979, 5979, - 5979, 5979, 5979, 5979, 4621, 5979, 5979, 5979, 5979, 5979, - 5979, 5979, 5979, 5979, 5979, -46, 5979, -1236, 4815, 389, - 390, -1236, -1236, -27, 395, 522, 396, 522, 402, 522, - -1236, 190, -1236, 266, -1236, 1577, 618, 645, -1236, -1236, - -1236, 8765, -1236, 654, 1577, -1236, -1236, 1577, -1236, -1236, - 6352, 622, 783, -1236, 104, -1236, 5979, 156, 5979, 9910, - 814, 5979, 9910, 5979, 650, -1236, 649, 679, 9910, -1236, - 5979, 9910, 663, -1236, -1236, 5979, 636, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -77, -1236, 5979, 5979, 5979, 5979, - 5979, 5979, 5979, 5979, 5979, 5979, 5979, 5979, 5979, 5979, - 5979, 5979, 5979, 5979, 5979, 552, -1236, -1236, 827, 416, - -1236, 5979, 9352, -1236, -1236, -1236, 1577, 1577, 1577, 1577, - 766, 5979, 675, 5979, 1577, -1236, -1236, -1236, 1577, 639, - 269, 635, 6444, 1577, 1577, 6543, 1577, 1577, 639, 1577, - 1577, 639, 1577, 652, 6574, 6673, 6765, 6798, 6890, 6989, - -1236, 5979, 455, 14, 5979, 5979, 668, 25, 156, 5979, - 638, 637, 641, 643, 234, -1236, -1236, 644, -36, 2677, - -1236, 114, 662, 646, 651, 445, 2082, -1236, 816, 659, - 657, -1236, -1236, 665, 661, -1236, -1236, 412, 412, 1028, - 1028, 10259, 10259, 664, 150, 666, -1236, 8796, -64, -64, - 561, 412, 412, 10113, 377, 900, 9999, 10511, 9441, 810, - 10145, 10227, 1028, 1028, 527, 527, 150, 150, 150, 316, - 5979, 667, 672, 320, 5979, 850, 8886, -1236, 120, -1236, - -1236, 692, -1236, -1236, 673, -1236, 682, -1236, 684, 6322, - -1236, 589, -1236, 271, 510, -1236, 5979, -1236, -1236, 510, - 510, -1236, 5979, 695, -1236, 699, -1236, 1577, -1236, 5979, - 7020, 31, 9910, 481, 9910, 7119, 5979, -1236, -1236, 9910, - -1236, 7211, 5979, 674, 821, 703, -1236, 281, -1236, 9910, - 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, - 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, -1236, 702, - 463, 809, 706, 9473, -1236, -1236, -1236, -1236, 510, 696, - 697, 403, -1236, 109, 680, 272, 7244, 404, 1577, 1577, - 1577, 698, 681, 1577, 676, 683, -1236, 704, 705, -1236, - 708, 709, 686, 711, 713, 694, 715, 816, -1236, -1236, - -1236, -1236, -1236, 700, 9555, 5979, 9910, -1236, -1236, 5979, - 38, 9910, -1236, -1236, 5979, 5979, 1577, 445, 5979, 5979, - 5979, 69, 6173, -1236, 322, -1236, -57, 522, -1236, 445, - -1236, 5979, -1236, 5979, 5009, 5979, -1236, 717, 701, -1236, - -1236, 5979, 707, -1236, 8917, 5979, 5203, 710, -1236, 9007, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, 1577, 712, 7336, - -1236, 842, -59, 9910, 481, 5979, -1236, 481, 9910, 2287, - 481, 7435, 5979, 741, -1236, 121, 742, 1577, 26, -1236, - -1236, -1236, 141, -1236, 6, -1236, -1236, -1236, -1236, -1236, - 161, -1236, 718, -1236, 745, 714, -1236, -1236, 723, 724, - 725, -1236, -1236, 727, 5979, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -29, 5397, -1236, 349, 353, - 5979, 7466, 7565, 728, 522, 7657, 9910, 9910, 730, 2677, - 726, 163, 761, 780, 784, 785, -1236, 128, 62, 522, - 1577, 7690, 1577, 7782, -1236, 131, 7881, -1236, 5979, 10031, - 5979, -1236, 7912, -1236, 138, 5979, -1236, -1236, -1236, -1236, - -1236, 510, 5979, -1236, 786, 5979, -1236, 152, -1236, -1236, - 366, 933, 8011, -1236, 787, -17, 907, 132, 5979, 918, - 6, -1236, -1236, 463, 748, 752, -1236, -1236, 772, 5979, - -1236, -1236, -1236, -1236, 755, 756, 635, 5979, 5979, 5979, - 757, 766, 758, 759, 5591, -1236, -1236, 160, 5979, 5979, - 356, -1236, -1236, -1236, 782, 168, -1236, 70, 5979, 5979, - 5979, -1236, -1236, -1236, -1236, -57, -1236, 5785, -1236, -1236, - 481, 788, -1236, 410, -1236, -1236, -1236, 1577, 8103, 8136, - -1236, -1236, 8228, 746, -1236, 9910, 481, 481, -1236, -1236, - 762, -1236, 2481, 797, -1236, -1236, 1577, 26, 808, -1236, - 5979, 9587, -1236, -1236, 918, 156, 766, 766, 767, 8327, - 768, 770, 771, 5979, 5979, 765, 1028, 1028, 1028, 5979, - -1236, 766, 326, -1236, 8358, -1236, 805, 9669, 5979, 218, - -1236, 5979, 5979, 774, 8457, 9910, 9910, -1236, 5979, 9999, - -1236, -1236, -1236, 411, -1236, -1236, -1236, -1236, -1236, -1236, - 5979, -1236, -1236, -1236, -1236, -1236, 9910, -1236, 26, 5979, - -1236, 9703, -1236, 10542, -1236, -1236, 13, 13, 5979, -1236, - 766, 766, 326, 639, 635, -1236, 639, 13, 662, 796, - -1236, 925, 817, 800, 9669, -1236, 218, 9910, 9910, -1236, - 170, 10031, -1236, -1236, -1236, 8549, 5979, 9785, -1236, 818, - 10542, 326, 662, 811, 799, 802, 8582, 13, 13, 803, - 804, 815, 820, 826, -1236, 5979, -1236, -1236, 807, -1236, - 5979, 5979, -1236, 481, 9874, -1236, -1236, 481, 173, 830, - -1236, -1236, -1236, -1236, 831, 832, -1236, -1236, -1236, -1236, - -1236, 9910, -1236, 9910, 9910, 366, -1236, -1236, -1236, 326, - -1236, -1236, -1236, 177, -1236 + -1274, 28, -1274, -1274, 53, -63, -98, 109, -1274, -103, + 109, 109, 109, -1274, 22, 153, -1274, -1274, -96, -4, + -1274, -1274, 291, -1274, 108, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, 87, -1274, 86, 96, 156, + -1274, -1274, -98, 12, -1274, -1274, -1274, 139, 175, -1274, + -1274, 108, 216, 226, 245, 250, 214, -1274, -1274, -1274, + 153, 153, 153, 217, -1274, 517, 50, -1274, -1274, -1274, + -1274, -1274, 354, 388, 419, -1274, 458, 41, 53, 283, + -63, 286, 355, -1274, 358, 370, -1274, -1274, -1274, 516, + -1274, -1274, -1274, -1274, 397, 392, -1274, -1274, -43, 53, + 153, 153, 153, 153, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, 409, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, 316, 123, -1274, -1274, -1274, -1274, 526, + -1274, -1274, 395, -1274, -1274, -1274, 428, 480, 493, -1274, + -1274, 467, -1274, 54, -1274, 521, 527, 517, 852, -1274, + 484, 568, 468, -1274, -1274, 504, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, 61, -1274, 1662, -1274, -1274, -1274, -1274, + -1274, 9350, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, 642, 643, -1274, + 474, 510, 430, 511, -1274, 520, -1274, 53, 475, 523, + -1274, -1274, -1274, 123, -1274, 501, 503, 507, 489, 508, + 512, -1274, -1274, -1274, 490, -1274, -1274, -1274, -1274, -1274, + 513, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, 514, -1274, -1274, -1274, 515, 518, -1274, -1274, + -1274, -1274, 519, 522, 491, 22, -1274, -1274, -1274, -1274, + -1274, -1274, 276, 524, 540, -1274, -1274, 546, 548, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, 549, + 485, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, 690, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, 552, 525, -1274, -1274, + -79, 534, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, 537, 550, -1274, 53, -1274, 335, + -1274, -1274, -1274, -1274, -1274, 6068, -1274, -1274, 557, -1274, + 232, 235, 253, -1274, -1274, 6068, 113, -1274, -1274, -1274, + -2, -1274, -1274, -1274, 72, 3350, -1274, 528, 1381, -1274, + 543, 1481, 228, -1274, -1274, -1274, -1274, 560, 592, -1274, + 530, -1274, 130, -1274, 16, 1662, -1274, 1966, 563, 22, + -1274, -1274, -1274, -1274, 574, 1662, -1274, 45, 1662, 1662, + 1662, 545, 553, -1274, -1274, 89, 22, 554, 20, -1274, + 239, 532, 555, 556, 538, 559, 541, 279, 562, -1274, + 292, 564, 565, 6068, 6068, 547, 558, 561, 566, 567, + 570, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + 3546, 6068, 6068, 6068, 6068, 6068, 3156, 6068, -1274, 569, + -1274, -1274, -1274, 577, -1274, -1274, -1274, -1274, 539, -1274, + -1274, -1274, -1274, -1274, -1274, -105, 893, -1274, 585, -1274, + -1274, -1274, -1274, -1274, -1274, 1662, 1662, 542, 591, 1662, + 474, 1662, 474, 1662, 474, 6411, 593, 6405, -1274, 6068, + -1274, -1274, -1274, -1274, 575, -1274, -1274, 8862, 3740, -1274, + -1274, 598, -1274, 14, -1274, -1274, 410, -1274, 524, 583, + 580, 410, -1274, 594, -1274, -1274, 6068, -1274, -1274, 257, + -99, -1274, 524, -1274, 588, -1274, -1274, 590, 3934, -1274, + 510, 4128, 596, 607, -1274, 632, 615, 4322, -36, 4516, + 769, -1274, 635, 636, 604, 800, -1274, -1274, -1274, -1274, + -1274, 639, -1274, 644, 645, 647, 648, 654, -1274, 749, + -1274, 655, 9234, 659, -1274, 663, -1274, 18, -1274, 161, + -1274, -1274, -1274, 6068, 264, 411, 656, 363, -1274, -1274, + -1274, 638, 657, -1274, 302, -1274, 664, 665, 667, -1274, + 6068, 1662, 6068, 6068, -1274, -1274, 6068, -1274, 6068, -1274, + 6068, -1274, -1274, 6068, -1274, 1662, 140, 140, 6068, 6068, + 6068, 6068, 6068, 6068, 488, 257, 9381, -1274, 666, 140, + 140, -38, 140, 140, 257, 835, 675, 10038, 675, 321, + 2764, 857, -1274, 658, 539, -1274, 10419, 10507, 6068, 6068, + -1274, -1274, 6068, 6068, 6068, 6068, 701, 6068, 380, 6068, + 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 4710, 6068, + 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, -47, + 6068, -1274, 4904, 420, 421, -1274, -1274, 306, 452, 534, + 454, 534, 455, 534, -1274, 336, -1274, 362, -1274, 1662, + 662, 675, -1274, -1274, -1274, 8893, -1274, 693, 1662, -1274, + -1274, 1662, -1274, -1274, 6441, 660, 824, -1274, -60, -1274, + 6068, 257, 6068, 10038, 855, 6068, 10038, 6068, 694, -1274, + 695, 722, 10038, -1274, 6068, 10038, 708, -1274, -1274, 6068, + 674, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -92, -1274, + 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, + 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 6068, 563, + -1274, -1274, 872, 468, -1274, 6068, 9480, -1274, -1274, -1274, + 1662, 1662, 1662, 1662, 811, 6068, 721, 6068, 1662, -1274, + -1274, -1274, 1662, 675, 379, 666, 6533, 1662, 1662, 6632, + 1662, 6663, 1662, 675, 1662, 1662, 675, 1662, 698, 6762, + 6854, 6887, 6979, 7078, 7109, -1274, 6068, 440, 7, 6068, + 6068, 714, 29, 257, 6068, 696, 692, 697, 699, 261, + -1274, -1274, 82, 700, 218, 2960, -1274, 74, 723, 704, + 707, 474, 2171, -1274, 857, 718, 711, -1274, -1274, 726, + 712, -1274, -1274, 177, 177, 1579, 1579, 669, 669, 715, + 15, 716, -1274, 8983, -86, -86, 585, 177, 177, 1122, + 10159, 10241, 10127, 10540, 9569, 10273, 10355, 1487, 1579, 1579, + 373, 373, 15, 15, 15, 384, 6068, 717, 719, 391, + 6068, 912, 9014, -1274, 84, -1274, -1274, 757, -1274, -1274, + 746, -1274, 758, -1274, 762, -1274, 6411, -1274, 593, 382, + 524, -1274, -1274, -1274, -1274, 524, 524, -1274, 6068, 787, + -1274, 792, -1274, 1662, -1274, 6068, 7208, 33, 10038, 510, + 10038, 7300, 6068, -1274, -1274, 10038, -1274, 7333, 6068, 750, + 913, 795, -1274, 403, -1274, 10038, 10038, 10038, 10038, 10038, + 10038, 10038, 10038, 10038, 10038, 10038, 10038, 10038, 10038, 10038, + 10038, 10038, 10038, 10038, -1274, 788, 529, 891, 791, 9601, + -1274, -1274, -1274, -1274, 524, 779, 781, 460, -1274, 120, + 765, 394, 7425, 461, 1662, 1662, 1662, 782, 766, 768, + 1662, 770, -1274, 789, 793, -1274, 794, -1274, 796, 771, + 797, 799, 772, 801, 857, -1274, -1274, -1274, -1274, -1274, + 776, 9683, 6068, 10038, -1274, -1274, 6068, 34, 10038, -1274, + -1274, 6068, 6068, 1662, 474, 203, -1274, 780, 6068, 6068, + 6068, 85, 6262, -1274, 408, -1274, -25, 534, -1274, 474, + -1274, 6068, -1274, 6068, 5098, 6068, -1274, 803, 785, -1274, + -1274, 6068, 790, -1274, 9104, 6068, 5292, 798, -1274, 9135, + -1274, -1274, 6068, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, 802, 1662, + 7524, -1274, 949, -1, 10038, 510, 6068, -1274, 510, 10038, + 2376, 510, 7555, 6068, 831, -1274, 94, 832, 1662, 45, + -1274, -1274, -1274, 100, -1274, 6, -1274, -1274, -1274, -1274, + -1274, -1274, 807, -1274, 814, 834, -1274, -1274, 812, 815, + 818, -1274, -1274, 6068, 819, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, 56, 5486, -1274, 418, 422, + 6068, 7654, 7746, 839, 534, -1274, 7779, 10038, 10038, 822, + 2960, 825, 219, 838, 867, 869, 873, -1274, 125, -70, + 534, 1662, 7871, 1662, 7970, -1274, 132, 8001, -1274, 6068, + 706, 6068, -1274, 8100, -1274, 133, 6068, -1274, -1274, -1274, + -1274, -1274, 6068, 524, -1274, 874, 6068, -1274, 171, -1274, + -1274, 487, 985, 8192, -1274, 875, -107, 996, 190, 6068, + 1007, 6, -1274, -1274, 529, 836, 840, -1274, -1274, 6068, + 858, -1274, -1274, -1274, -1274, 841, 842, 666, 844, 6068, + 6068, 6068, 845, 811, 846, 847, 5680, -1274, -1274, 181, + 6068, 6068, 423, -1274, -1274, -1274, 861, 244, -1274, 142, + 6068, 6068, 6068, -1274, -1274, -1274, -1274, -25, -1274, 5874, + -1274, -1274, 510, 868, -1274, 462, -1274, -1274, -1274, 1662, + 8225, 8317, -1274, -1274, 8416, 850, -1274, 10038, 510, 510, + -1274, -1274, 848, -1274, 2570, 885, -1274, -1274, 1662, 45, + 896, -1274, 6068, 9715, -1274, -1274, 1007, 257, 811, 811, + 8447, 860, 862, 863, 864, 6068, -1274, -1274, 6068, 1579, + 1579, 1579, 6068, -1274, 811, 416, -1274, 8546, -1274, 894, + 9797, 6068, 310, -1274, 6068, 6068, 865, 8638, 10038, 10038, + -1274, 6068, 10127, -1274, -1274, -1274, 463, -1274, -1274, -1274, + -1274, -1274, -1274, 6068, -1274, -1274, -1274, -1274, -1274, 10038, + -1274, 45, 6068, -1274, 9831, -1274, 852, -1274, -1274, -12, + -12, -1274, 6068, 811, 811, 416, 866, 879, 675, -12, + 723, 880, -1274, 1017, 917, 886, 9797, -1274, 310, 10038, + 10038, -1274, 270, 706, -1274, -1274, -1274, 8671, 6068, 9913, + -1274, 919, 852, 416, 723, 911, -1274, 887, 888, 8763, + -12, -12, 895, -1274, -1274, 897, 898, -1274, 6068, -1274, + -1274, 901, -1274, 6068, 6068, -1274, 510, 10002, -1274, -1274, + 510, 183, 892, -1274, -1274, -1274, -1274, 902, 903, -1274, + -1274, -1274, 10038, -1274, 10038, 10038, 487, -1274, -1274, -1274, + 416, -1274, -1274, -1274, 195, -1274 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1387,210 +1393,213 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_int16 yydefact[] = { - 2, 113, 1, 264, 0, 0, 0, 532, 265, 0, - 532, 532, 532, 16, 0, 0, 15, 3, 0, 10, - 9, 8, 0, 7, 520, 6, 11, 5, 4, 13, - 12, 14, 85, 86, 84, 93, 95, 37, 50, 0, - 48, 39, 0, 45, 38, 534, 533, 0, 0, 22, - 21, 520, 0, 0, 0, 0, 240, 35, 100, 101, - 0, 0, 0, 102, 104, 111, 0, 99, 17, 553, - 552, 206, 538, 554, 521, 522, 0, 0, 0, 47, - 0, 40, 0, 46, 0, 0, 43, 535, 537, 18, - 696, 688, 692, 242, 0, 0, 110, 105, 0, 0, - 0, 0, 0, 0, 114, 208, 207, 210, 205, 540, - 539, 0, 556, 555, 559, 524, 523, 525, 91, 92, + 2, 113, 1, 266, 0, 0, 0, 537, 267, 0, + 537, 537, 537, 16, 0, 0, 15, 3, 0, 0, + 9, 8, 0, 7, 525, 6, 11, 5, 4, 13, + 12, 14, 85, 86, 84, 93, 95, 37, 50, 47, + 48, 39, 0, 45, 38, 539, 538, 0, 0, 22, + 21, 525, 0, 0, 0, 0, 242, 35, 100, 101, + 0, 0, 0, 102, 104, 111, 0, 99, 17, 10, + 558, 557, 206, 543, 559, 526, 527, 0, 0, 0, + 0, 40, 0, 46, 0, 0, 43, 540, 542, 18, + 703, 695, 699, 244, 0, 0, 110, 105, 0, 0, + 0, 0, 0, 0, 114, 208, 207, 210, 205, 545, + 544, 0, 561, 560, 564, 529, 528, 530, 91, 92, 89, 90, 88, 0, 0, 87, 96, 51, 49, 45, - 42, 41, 0, 19, 20, 23, 0, 0, 0, 241, - 33, 36, 109, 0, 106, 107, 108, 112, 0, 541, - 542, 549, 458, 24, 25, 0, 80, 81, 78, 79, - 77, 76, 82, 0, 44, 0, 697, 689, 693, 34, + 42, 41, 0, 19, 20, 23, 0, 0, 0, 243, + 33, 36, 109, 0, 106, 107, 108, 112, 0, 546, + 547, 554, 463, 24, 25, 0, 80, 81, 78, 79, + 77, 76, 82, 0, 44, 0, 704, 696, 700, 34, 103, 0, 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, 0, 0, 120, - 115, 0, 0, 0, 550, 0, 560, 0, 459, 0, + 115, 0, 0, 0, 555, 0, 565, 0, 464, 0, 26, 27, 28, 0, 94, 0, 0, 0, 0, 0, - 0, 567, 587, 568, 603, 569, 573, 574, 575, 576, - 593, 580, 581, 582, 583, 584, 585, 586, 588, 589, - 590, 591, 658, 572, 579, 592, 665, 672, 570, 577, - 571, 578, 0, 0, 0, 0, 602, 622, 625, 623, - 624, 685, 620, 536, 608, 486, 492, 174, 175, 172, + 0, 572, 592, 573, 608, 574, 578, 579, 580, 581, + 598, 585, 586, 587, 588, 589, 590, 591, 593, 594, + 595, 596, 665, 577, 584, 597, 672, 679, 575, 582, + 576, 583, 0, 0, 0, 0, 607, 629, 632, 630, + 631, 692, 627, 541, 613, 491, 497, 174, 175, 172, 123, 124, 126, 125, 127, 128, 129, 130, 156, 157, 154, 155, 147, 158, 159, 148, 145, 146, 173, 167, 0, 171, 160, 161, 162, 163, 134, 135, 136, 131, 132, 133, 144, 0, 150, 151, 149, 142, 143, 138, 137, 139, 140, 141, 122, 121, 166, 0, 152, 153, - 458, 118, 233, 211, 594, 597, 600, 601, 595, 598, - 596, 599, 543, 544, 547, 557, 97, 0, 512, 505, - 526, 83, 626, 649, 652, 0, 655, 645, 0, 611, - 659, 666, 673, 679, 682, 0, 0, 635, 640, 634, - 0, 648, 637, 0, 644, 0, 639, 621, 0, 609, - 765, 690, 694, 176, 177, 170, 165, 178, 168, 164, - 0, 116, 263, 480, 0, 0, 209, 0, 529, 0, - 551, 471, 561, 98, 0, 0, 506, 0, 0, 0, - 0, 0, 0, 365, 366, 0, 0, 0, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 593, 0, + 463, 118, 233, 211, 599, 602, 605, 606, 600, 603, + 601, 604, 548, 549, 552, 562, 97, 0, 517, 510, + 531, 83, 633, 656, 659, 0, 662, 652, 0, 616, + 666, 673, 680, 686, 689, 0, 0, 642, 647, 641, + 0, 655, 651, 644, 0, 0, 646, 628, 0, 614, + 774, 697, 701, 176, 177, 170, 165, 178, 168, 164, + 0, 116, 265, 485, 0, 0, 209, 0, 534, 0, + 556, 476, 566, 98, 0, 0, 511, 0, 0, 0, + 0, 0, 0, 369, 370, 0, 0, 0, 0, 363, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 447, 308, 310, 309, 311, 312, 313, 314, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 294, 295, 363, - 362, 441, 360, 434, 433, 432, 431, 113, 437, 361, - 436, 435, 406, 367, 407, 0, 368, 0, 364, 700, - 704, 701, 702, 703, 0, 0, 0, 0, 0, 115, - 0, 115, 0, 115, 0, 0, 0, 631, 236, 642, - 643, 636, 638, 0, 641, 617, 0, 0, 687, 686, - 766, 698, 240, 487, 0, 482, 0, 0, 493, 0, - 0, 179, 169, 0, 261, 262, 0, 458, 117, 119, - 235, 0, 60, 61, 0, 255, 253, 0, 0, 0, - 0, 254, 0, 0, 0, 0, 0, 212, 215, 0, - 0, 0, 0, 228, 223, 220, 219, 221, 0, 234, - 0, 67, 68, 65, 66, 229, 267, 218, 0, 64, - 527, 530, 765, 548, 472, 513, 0, 503, 504, 502, - 0, 0, 0, 0, 614, 721, 724, 245, 0, 248, - 252, 0, 283, 0, 0, 0, 750, 0, 0, 0, - 0, 274, 277, 0, 280, 754, 0, 730, 736, 0, - 727, 0, 395, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 734, 757, 765, 372, 371, 408, 370, 369, - 0, 0, 765, 289, 765, 296, 0, 303, 233, 295, - 113, 214, 0, 0, 0, 0, 397, 398, 0, 0, + 0, 452, 310, 312, 311, 313, 314, 315, 316, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 297, + 367, 366, 445, 364, 438, 437, 436, 435, 113, 441, + 365, 440, 439, 410, 371, 411, 0, 372, 0, 368, + 707, 711, 708, 709, 710, 0, 0, 0, 0, 0, + 115, 0, 115, 0, 115, 0, 0, 0, 638, 236, + 649, 650, 643, 645, 0, 648, 624, 0, 0, 694, + 693, 775, 705, 242, 620, 619, 0, 492, 487, 0, + 0, 0, 498, 0, 179, 169, 0, 263, 264, 0, + 463, 117, 119, 235, 0, 60, 61, 0, 257, 255, + 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, + 212, 215, 0, 0, 0, 0, 228, 223, 220, 219, + 221, 0, 234, 0, 67, 68, 65, 66, 229, 269, + 218, 0, 64, 532, 535, 774, 553, 477, 518, 0, + 508, 509, 507, 0, 0, 0, 0, 621, 730, 733, + 247, 0, 250, 254, 0, 285, 0, 0, 0, 759, + 0, 0, 0, 0, 276, 279, 0, 282, 0, 763, + 0, 739, 745, 0, 736, 0, 399, 400, 0, 0, + 0, 0, 0, 0, 0, 0, 743, 766, 774, 376, + 375, 412, 374, 373, 0, 0, 774, 291, 774, 298, + 0, 305, 233, 297, 113, 214, 0, 0, 0, 0, + 401, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, + 0, 636, 0, 0, 0, 609, 611, 0, 0, 118, + 0, 118, 0, 118, 489, 0, 495, 0, 610, 0, + 0, 774, 640, 623, 626, 0, 615, 0, 0, 493, + 698, 0, 499, 702, 0, 0, 567, 483, 502, 486, + 0, 0, 0, 258, 0, 0, 245, 0, 0, 232, + 0, 0, 54, 72, 0, 260, 0, 230, 231, 0, + 0, 222, 217, 224, 225, 226, 227, 268, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 351, 0, 629, 0, 0, - 0, 604, 606, 0, 0, 118, 0, 118, 0, 118, - 484, 0, 490, 0, 605, 0, 0, 237, 633, 616, - 619, 0, 610, 0, 0, 488, 691, 0, 494, 695, - 0, 0, 562, 478, 497, 481, 0, 0, 0, 256, - 0, 0, 243, 0, 0, 232, 0, 0, 54, 72, - 0, 258, 0, 230, 231, 0, 0, 222, 217, 224, - 225, 226, 227, 266, 0, 216, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, + 550, 563, 0, 463, 522, 0, 0, 634, 657, 660, + 0, 0, 0, 0, 728, 236, 0, 0, 0, 749, + 752, 755, 0, 774, 0, 774, 0, 0, 0, 0, + 0, 0, 0, 774, 0, 0, 774, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 30, 0, 0, + 775, 0, 0, 0, 775, 0, 0, 0, 0, 343, + 340, 342, 0, 0, 242, 0, 356, 0, 721, 0, + 0, 115, 0, 298, 305, 0, 0, 424, 423, 0, + 0, 425, 429, 377, 378, 390, 391, 388, 389, 0, + 418, 0, 408, 0, 442, 443, 444, 379, 380, 395, + 396, 397, 398, 0, 0, 393, 394, 392, 386, 387, + 382, 381, 383, 384, 385, 0, 0, 0, 349, 0, + 0, 0, 0, 361, 0, 663, 653, 0, 617, 667, + 0, 674, 0, 681, 0, 687, 0, 690, 0, 0, + 240, 637, 237, 625, 706, 488, 494, 484, 0, 0, + 501, 0, 500, 0, 503, 0, 0, 0, 259, 0, + 246, 0, 0, 52, 53, 261, 233, 0, 0, 0, + 512, 0, 275, 510, 274, 327, 328, 330, 329, 331, + 321, 322, 323, 332, 333, 319, 320, 334, 335, 324, + 325, 326, 318, 533, 536, 0, 470, 473, 0, 0, + 524, 635, 658, 661, 622, 0, 0, 0, 729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 766, 545, 558, 0, 458, - 517, 0, 0, 627, 650, 653, 0, 0, 0, 0, - 719, 236, 0, 0, 0, 740, 743, 746, 0, 765, - 0, 765, 0, 0, 0, 0, 0, 0, 765, 0, - 0, 765, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 30, 0, 0, 766, 0, 0, 0, 766, - 0, 0, 0, 0, 341, 338, 340, 0, 240, 0, - 354, 0, 714, 0, 0, 115, 0, 296, 303, 0, - 0, 420, 419, 0, 0, 421, 425, 373, 374, 386, - 387, 384, 385, 0, 414, 0, 404, 0, 438, 439, - 440, 375, 376, 391, 392, 393, 394, 0, 0, 389, - 390, 388, 382, 383, 378, 377, 379, 380, 381, 0, - 0, 0, 347, 0, 0, 0, 0, 357, 0, 656, - 646, 0, 612, 660, 0, 667, 0, 674, 0, 0, - 680, 0, 683, 0, 238, 630, 0, 618, 699, 483, - 489, 479, 0, 0, 496, 0, 495, 0, 498, 0, - 0, 0, 257, 0, 244, 0, 0, 52, 53, 259, - 233, 0, 0, 0, 507, 0, 273, 505, 272, 325, - 326, 328, 327, 329, 319, 320, 321, 330, 331, 317, - 318, 332, 333, 322, 323, 324, 316, 528, 531, 0, - 465, 468, 0, 0, 519, 628, 651, 654, 615, 0, - 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 409, 0, 0, 410, - 0, 0, 0, 0, 0, 0, 0, 303, 442, 443, - 444, 445, 446, 0, 0, 0, 733, 758, 759, 0, - 0, 290, 739, 399, 0, 0, 0, 115, 0, 0, - 0, 0, 0, 356, 0, 355, 0, 118, 307, 115, - 416, 0, 422, 0, 0, 0, 402, 0, 0, 426, - 430, 0, 0, 405, 0, 0, 0, 0, 348, 0, - 352, 400, 358, 657, 647, 607, 613, 661, 663, 668, - 670, 675, 677, 485, 681, 491, 684, 0, 0, 0, - 564, 565, 499, 501, 0, 0, 260, 0, 75, 0, - 0, 0, 0, 0, 268, 0, 0, 0, 0, 546, - 466, 467, 468, 469, 460, 473, 518, 722, 725, 246, - 0, 250, 0, 249, 0, 0, 286, 284, 0, 0, - 0, 751, 749, 0, 0, 760, 275, 278, 281, 755, - 753, 731, 737, 735, 728, 0, 0, 31, 0, 0, - 0, 0, 0, 0, 118, 0, 706, 705, 0, 0, - 0, 0, 0, 0, 0, 0, 301, 0, 0, 118, - 0, 0, 0, 0, 336, 0, 0, 427, 0, 415, - 0, 403, 0, 349, 0, 0, 401, 353, 664, 671, - 678, 239, 236, 563, 0, 0, 73, 0, 74, 213, - 57, 62, 0, 509, 0, 505, 510, 0, 0, 463, - 460, 461, 462, 465, 0, 0, 247, 251, 0, 0, - 285, 741, 744, 747, 0, 0, 765, 0, 0, 0, - 0, 719, 0, 0, 0, 413, 448, 0, 0, 0, - 0, 339, 457, 342, 0, 0, 334, 0, 0, 0, - 0, 299, 300, 298, 297, 0, 304, 0, 291, 305, - 0, 0, 456, 0, 454, 337, 451, 0, 0, 0, - 450, 350, 0, 0, 566, 500, 0, 0, 55, 56, - 0, 69, 0, 0, 508, 269, 0, 0, 0, 514, - 0, 0, 464, 474, 463, 0, 719, 719, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 279, 282, 0, - 732, 719, 0, 411, 0, 449, 763, 763, 0, 0, - 345, 0, 0, 0, 0, 708, 707, 302, 0, 292, - 306, 417, 423, 0, 455, 453, 452, 632, 71, 58, - 0, 63, 67, 68, 65, 66, 64, 70, 0, 0, - 511, 0, 516, 0, 476, 470, 0, 0, 0, 287, - 719, 719, 0, 765, 765, 761, 765, 0, 713, 0, - 412, 0, 0, 0, 763, 343, 0, 710, 709, 335, - 0, 293, 418, 424, 428, 0, 0, 0, 515, 0, - 0, 0, 717, 765, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 729, 0, 769, 767, 0, 346, - 0, 0, 429, 0, 0, 271, 475, 0, 0, 766, - 718, 723, 726, 288, 0, 0, 748, 752, 762, 756, - 738, 764, 768, 712, 711, 57, 270, 477, 715, 0, - 742, 745, 59, 0, 716 + 0, 0, 413, 0, 0, 414, 0, 446, 0, 0, + 0, 0, 0, 0, 305, 447, 448, 449, 450, 451, + 0, 0, 0, 742, 767, 768, 0, 0, 292, 748, + 403, 0, 0, 0, 115, 0, 357, 0, 0, 0, + 0, 0, 0, 360, 0, 358, 0, 118, 309, 115, + 420, 0, 426, 0, 0, 0, 406, 0, 0, 430, + 434, 0, 0, 409, 0, 0, 0, 0, 350, 0, + 354, 404, 0, 362, 664, 654, 612, 618, 668, 670, + 675, 677, 682, 684, 688, 490, 691, 496, 0, 0, + 0, 569, 570, 504, 506, 0, 0, 262, 0, 75, + 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, + 551, 471, 472, 473, 474, 465, 478, 523, 731, 734, + 248, 252, 0, 251, 0, 0, 288, 286, 0, 0, + 0, 760, 758, 238, 0, 769, 277, 280, 283, 764, + 762, 740, 746, 744, 737, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 118, 359, 0, 713, 712, 0, + 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, + 118, 0, 0, 0, 0, 338, 0, 0, 431, 0, + 419, 0, 407, 0, 351, 0, 0, 405, 355, 671, + 678, 685, 236, 241, 568, 0, 0, 73, 0, 74, + 213, 57, 62, 0, 514, 0, 510, 515, 0, 0, + 468, 465, 466, 467, 470, 0, 0, 249, 253, 0, + 0, 287, 750, 753, 756, 0, 0, 774, 0, 0, + 0, 0, 0, 728, 0, 0, 0, 417, 453, 0, + 0, 0, 0, 341, 462, 344, 0, 0, 336, 0, + 0, 0, 0, 301, 302, 300, 299, 0, 306, 0, + 293, 307, 0, 0, 461, 0, 459, 339, 456, 0, + 0, 0, 455, 352, 0, 0, 571, 505, 0, 0, + 55, 56, 0, 69, 0, 0, 513, 271, 0, 0, + 0, 519, 0, 0, 469, 479, 468, 0, 728, 728, + 0, 0, 0, 0, 0, 236, 770, 239, 238, 278, + 281, 284, 0, 741, 728, 0, 415, 0, 454, 772, + 772, 0, 0, 347, 0, 0, 0, 0, 715, 714, + 304, 0, 294, 308, 421, 427, 0, 460, 458, 457, + 639, 71, 58, 0, 63, 67, 68, 65, 66, 64, + 70, 0, 0, 516, 0, 521, 0, 481, 475, 727, + 727, 289, 0, 728, 728, 0, 0, 0, 774, 727, + 720, 0, 416, 0, 0, 0, 772, 345, 0, 717, + 716, 337, 0, 295, 422, 428, 432, 0, 0, 0, + 520, 0, 0, 0, 724, 774, 726, 0, 0, 0, + 727, 727, 0, 761, 771, 0, 0, 738, 0, 778, + 776, 0, 348, 0, 0, 433, 0, 0, 273, 480, + 0, 0, 775, 725, 732, 735, 290, 0, 0, 757, + 765, 747, 773, 777, 719, 718, 57, 272, 482, 722, + 0, 751, 754, 59, 0, 723 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1236, -1236, -1236, -1236, -1236, -1236, 381, 930, -1236, -1236, - -1236, 1006, -1236, -1236, -1236, 972, -1236, 891, -1236, -1236, - 956, -1236, -1236, -1236, -364, -1236, -1236, -210, -1236, -1236, - -1236, -1236, -1236, -1236, 833, -1236, -1236, -61, 945, -1236, - -1236, -1236, 308, -1236, -433, -462, -650, -1236, -1236, -1236, - -1230, -1236, -1236, -520, -1236, -1236, -615, -759, -1236, -14, - -1236, -1236, -1236, -1236, -1236, -207, -205, -204, -201, -1236, - -1236, 1051, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -426, -1236, 590, - -172, -1236, -789, -1236, -1236, -1236, -1236, -1236, -1236, -1235, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, 543, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -147, -125, -206, - -126, -23, -1236, -1236, -1236, -1236, -1236, 547, -1236, -476, - -1236, -1236, -479, -1236, -1236, -701, -203, -556, -909, -1236, - -1236, -1236, -1236, 1009, -1236, -1236, -1236, 306, -1236, 656, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -589, -161, - -1236, 669, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -336, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -139, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, 670, -617, -267, 103, -1236, -1036, -1152, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -794, -1236, - -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, -1236, - -1236, -1236, -1236, -587, -1236, -1231, -548, -1236 + -1274, -1274, -1274, -1274, -1274, -1274, 478, 1023, -1274, -1274, + -1274, 1101, -1274, -1274, -1274, 1065, -1274, 981, -1274, -1274, + 1031, -1274, -1274, -1274, -304, -1274, -1274, -150, -1274, -1274, + -1274, -1274, -1274, -1274, 900, -1274, -1274, -58, 1016, -1274, + -1274, -1274, 393, -1274, -414, -471, -664, -1274, -1274, -1274, + -1273, -1274, -1274, -526, -1274, -1274, -614, -767, -172, -1274, + -14, -1274, -1274, -1274, -1274, -1274, -146, -145, -144, -143, + -1274, -1274, 1121, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -417, -1274, + 668, -114, -1274, -784, -1274, -1274, -1274, -1274, -1274, -1274, + -1223, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + 619, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -142, -67, + -149, -69, 35, -1274, -1274, -1274, -1274, -1274, 606, -1274, + -469, -1274, -1274, -462, -1274, -1274, -701, -148, -564, -910, + -1274, -1274, -1274, -1274, 1079, -1274, -1274, -1274, 372, -1274, + 661, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -583, + -162, -1274, 727, -1274, -1274, -1274, -1274, -1274, -1274, -332, + -1274, -1274, -362, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -151, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, 729, -628, -209, -761, -1274, -1274, + -966, -1168, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -789, -1274, -1274, -1274, -1274, -1274, -1274, -1274, -1274, + -1274, -1274, -1274, -1274, -1274, -1274, -402, -1274, -1220, -543, + -1274 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 16, 135, 51, 17, 155, 161, 610, 449, - 141, 450, 95, 19, 20, 43, 44, 86, 21, 39, - 40, 539, 540, 1250, 1251, 541, 1253, 542, 543, 544, - 545, 546, 547, 548, 162, 163, 35, 36, 37, 208, + 0, 1, 16, 135, 51, 17, 155, 161, 614, 450, + 141, 451, 95, 19, 20, 43, 44, 86, 21, 39, + 40, 542, 543, 1262, 1263, 544, 1265, 545, 546, 547, + 548, 549, 550, 551, 162, 163, 35, 36, 37, 208, 63, 64, 65, 66, 22, 321, 386, 200, 23, 107, - 201, 108, 148, 323, 451, 549, 387, 686, 893, 452, - 550, 578, 769, 1186, 453, 551, 552, 553, 554, 555, - 516, 556, 734, 1075, 926, 557, 454, 783, 1197, 784, - 1198, 786, 1199, 455, 774, 1190, 456, 622, 1229, 457, - 1136, 1137, 825, 458, 631, 459, 558, 460, 461, 816, - 462, 1006, 1289, 1007, 1346, 463, 875, 1157, 464, 623, - 1140, 1352, 1142, 1353, 1237, 1382, 466, 382, 1183, 1263, - 1082, 1084, 952, 564, 759, 1323, 1360, 383, 384, 504, - 681, 371, 509, 683, 372, 1010, 703, 570, 397, 927, - 339, 928, 340, 75, 117, 25, 152, 561, 562, 47, - 48, 132, 26, 111, 150, 203, 27, 388, 949, 390, - 205, 206, 73, 114, 392, 28, 151, 335, 704, 467, - 332, 258, 259, 673, 370, 260, 477, 1046, 573, 367, - 261, 262, 398, 955, 685, 475, 1044, 399, 956, 400, - 957, 474, 1043, 478, 1047, 479, 1158, 480, 1049, 481, - 1159, 482, 1051, 483, 1160, 484, 1054, 485, 1056, 505, - 29, 137, 265, 506, 30, 138, 266, 510, 31, 136, - 264, 693, 468, 1362, 1339, 823, 1363, 1364, 963, 469, - 767, 1184, 768, 1185, 792, 1203, 789, 1201, 613, 470, - 790, 1202, 471, 968, 1270, 969, 1271, 970, 1272, 778, - 1194, 787, 1200, 614, 472, 1342, 501, 473 + 201, 108, 148, 323, 452, 552, 387, 690, 1206, 899, + 453, 553, 581, 773, 1197, 454, 554, 555, 556, 557, + 558, 519, 559, 738, 1086, 932, 560, 455, 787, 1209, + 788, 1210, 790, 1211, 456, 778, 1201, 457, 691, 1241, + 458, 1147, 1148, 831, 459, 635, 460, 561, 461, 462, + 821, 463, 1013, 1302, 1014, 1358, 464, 881, 1168, 465, + 627, 1151, 1364, 1153, 1365, 1249, 1395, 467, 382, 1194, + 1275, 1093, 1095, 958, 567, 763, 1336, 1372, 383, 384, + 506, 685, 371, 511, 687, 372, 1020, 707, 573, 397, + 933, 339, 934, 340, 76, 117, 25, 152, 564, 565, + 47, 48, 132, 26, 111, 150, 203, 27, 388, 955, + 390, 205, 206, 74, 114, 392, 28, 151, 335, 708, + 468, 332, 258, 259, 677, 370, 260, 478, 1057, 507, + 576, 367, 261, 262, 398, 961, 689, 476, 1055, 399, + 962, 400, 963, 475, 1054, 479, 1058, 480, 1169, 481, + 1060, 482, 1170, 483, 1062, 484, 1171, 485, 1064, 486, + 1066, 508, 29, 137, 265, 509, 30, 138, 266, 513, + 31, 136, 264, 697, 469, 1374, 1351, 829, 1375, 1376, + 1377, 969, 470, 771, 1195, 772, 1196, 797, 1215, 794, + 1213, 617, 471, 795, 1214, 472, 974, 1282, 975, 1283, + 976, 1284, 782, 1205, 792, 1212, 1207, 473, 1354, 502, + 474 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1598,1336 +1607,1305 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 57, 67, 781, 909, 257, 209, 682, 710, 680, 822, - 761, 997, 964, 826, 756, 719, 126, 675, 1078, 677, - 624, 679, 803, 2, 627, 884, 263, 886, -113, 888, - 3, 807, 499, 82, 995, 583, 491, 118, 119, 1019, - 632, 633, 489, 32, 33, 999, 67, 67, 67, 1280, - 380, 1065, 1181, 4, 1345, 5, 1343, 6, 1120, 566, - 49, 642, 687, 7, 644, 645, 806, 904, 83, 1132, - 923, 401, 402, 8, 810, 1133, 811, 153, 154, 9, - 644, 645, 869, 870, 380, 924, 67, 67, 67, 67, - 904, 408, 58, 1359, 507, 41, 1009, 410, 100, 101, - 102, 38, 94, 10, 508, 50, 381, 871, 207, 156, - 157, 1379, 1182, 1378, 1326, 1327, 872, 514, 911, 94, - 906, 59, 1134, 368, 42, 11, 12, 1135, 925, 1337, - 1387, 758, 584, 585, 416, 417, 636, 637, 665, 666, - 517, 322, 207, 906, 642, 881, 336, 644, 645, 646, - 647, 256, 567, 74, 665, 666, 873, 874, 568, 882, - 515, 779, 694, 68, 1256, 142, 817, 396, 419, 420, - 788, 632, 633, 791, 518, 1090, 1204, 120, 1367, 1368, - 69, 70, 121, 71, 122, 123, 34, 492, 1179, 60, - 368, 757, 905, 490, 763, 13, 55, 828, 1115, 1227, - 821, 84, 1011, 905, 55, 569, 493, 257, 1083, 905, - 257, 72, 494, 85, 14, 586, 905, 77, 1361, 1000, - 56, 665, 666, 15, 257, 76, 15, 124, 56, 103, - 904, 972, 322, 975, 257, 587, 439, 257, 257, 257, - 982, 356, 878, 985, 567, 170, 519, 1014, 1014, 158, - 568, 577, 780, 61, 159, 104, 160, 123, 567, 571, - 572, 574, 817, 62, 568, 793, 1257, 636, 637, 445, - 628, 1090, 94, 1128, 1293, 642, 393, 643, 644, 645, - 646, 647, 905, 906, 213, 907, 55, 904, 908, 904, - 760, 1365, 1012, 1009, 904, 1219, 904, 569, 896, 1174, - 1291, 1373, 1380, 701, 1259, 1069, 1225, 447, 629, 896, - 56, 569, 214, 257, 257, 1091, 896, 257, 702, 257, - 1013, 257, 394, 257, -662, 395, 1042, 1175, 396, -662, - 896, 1394, 1395, 77, 1226, 669, 670, 1235, 896, 674, - 906, 676, 906, 678, 1241, 687, 822, 906, -662, 906, - 55, 1014, 665, 666, 256, 1014, 55, 256, 1246, 812, - 78, 1165, 889, 1017, 813, 812, 1285, 1138, 96, 97, - 98, 256, -669, 87, 56, 563, 890, -669, 1247, 1408, - 56, 256, -676, 1414, 256, 256, 256, -676, 45, 1248, - 1249, 256, 581, 1066, 46, 766, -669, 814, 632, 633, - 324, 487, 588, 1243, 325, 368, -676, 88, 144, 145, - 146, 147, 1055, 1053, 1286, -344, 595, 598, 326, 327, - -344, 488, 589, 328, 329, 330, 331, 257, 85, 772, - 1220, 959, 960, 632, 633, 90, 596, 599, 891, -344, - 257, 973, 971, 1057, 1094, 91, 92, 977, 978, 773, - 980, 981, 892, 983, 984, 974, 986, 1058, 1095, 1076, - 256, 256, 1077, 93, 256, 396, 256, 845, 256, 1032, - 256, 832, 836, 1037, 1214, 1130, 846, 79, 1033, 817, - 99, 105, 1038, 80, 1131, 109, 850, 106, 1090, 1230, - 127, 110, 634, 635, 636, 637, 638, 112, 129, 639, - 640, 641, 642, 113, 643, 644, 645, 646, 647, 115, - 648, 649, 1217, 133, 1292, 116, 650, 1196, 652, 134, - 1080, 1208, 1178, 130, 257, 1209, 1081, 896, 1288, 636, - 637, 896, 140, 257, 896, 131, 257, 642, 139, 643, - 644, 645, 646, 647, 1166, 1124, 894, 1168, 632, 633, - 1170, 83, 368, 149, 165, 899, 764, 1139, 900, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 1118, - 166, 368, 368, 1119, 256, 879, 880, 368, 368, 665, - 666, 883, 885, 167, 368, 368, 368, 256, 887, 1089, - 1097, 168, 368, 368, 169, 1205, 1302, 1354, 1145, 660, - 661, 662, 663, 664, 100, 257, 257, 257, 257, 204, - 1154, 815, 951, 257, 665, 666, 202, 257, 1228, 210, - 211, 1260, 257, 257, 207, 257, 257, 958, 257, 257, - 961, 257, 1098, 1099, 1100, 967, 100, 1103, 102, 1167, - 153, 154, 800, 801, 636, 637, 318, 319, 1275, 1381, - 320, 322, 642, 333, 643, 644, 645, 646, 647, 100, - 101, 102, 210, 211, 212, 1338, 52, 53, 54, 334, - 1123, 256, 337, 338, 342, 343, 344, 345, 346, 348, - 256, 347, 355, 256, 349, 350, 351, 1334, 369, 352, - 1207, 353, 368, 354, 1210, 373, 1030, 374, 375, 376, - 377, 1319, 378, 385, 357, 389, 379, 391, 476, 500, - 1300, 511, 497, 512, 560, 1338, 662, 663, 664, 513, - 565, 590, 593, 575, 576, 671, 1308, 1309, 257, 665, - 666, 358, 359, 582, 604, 591, 687, 605, 592, 594, - 597, 1177, 600, 695, 1388, 601, 257, 606, 672, 607, - 608, 507, 256, 256, 256, 256, 609, 692, 696, 697, - 256, 626, 1356, 698, 256, 15, 668, 625, 1062, 256, - 256, 688, 256, 256, 699, 256, 256, 706, 256, 707, - 713, 714, 715, 716, 722, 1370, 1371, 723, 1372, 724, - 725, 726, 1413, 727, 360, 728, 729, 730, 361, 731, - 733, 732, 735, 770, 1231, 754, 765, 257, 257, 257, - 755, 771, 257, 805, 808, 1390, 775, 809, 776, 777, - 824, 827, 843, 896, 895, 898, 903, 902, 913, 916, - 917, 632, 633, 920, 918, 950, 962, 965, 987, 998, - 1014, 922, 1002, 1003, 1020, 257, 1004, 1333, 1005, 1008, - 1022, 1040, 1015, 1336, 1045, 362, 1016, 1060, 363, 1048, - 364, 1061, 1021, 1405, 1073, 1074, 1023, 1407, 1050, 1024, - 1052, 1025, 1035, 1079, 365, 256, 1083, 1036, 1085, 1072, - 366, 1104, 1087, 1088, 1101, 1164, 1093, 1102, 465, 1105, - 1106, 1107, 1110, 256, 1108, 1109, 257, 1111, 486, 1112, - 1113, 1114, 1147, 1173, 1176, 1116, 1148, 1188, 496, 1191, - 1192, 1193, 1150, 1195, 1213, 1155, 257, 1162, 1161, 1189, - 1318, 632, 633, 1221, 1187, 634, 635, 636, 637, 638, - 559, 1218, 639, 640, 641, 642, 1216, 643, 644, 645, - 646, 647, 1222, 648, 649, 1252, 1223, 1224, 1244, 1255, - 1258, 1262, 1307, 1266, 256, 256, 256, 1267, 1268, 256, - 1273, 1274, 1279, 1281, 1282, 602, 603, 1310, 1290, 1317, - 1320, 1335, 1328, 1330, 1301, 1331, 1332, 1341, 1375, 257, - 1349, 257, 612, 615, 616, 617, 618, 619, 1376, 1389, - 1386, 802, 256, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 1374, 1233, 1377, 1391, 125, 18, 1392, 1396, - 1397, 1402, 665, 666, 81, 634, 635, 636, 637, 638, - 164, 1398, 639, 640, 641, 642, 1399, 643, 644, 645, - 646, 647, 1400, 648, 649, 1409, 128, 1410, 1411, 650, - 691, 1412, 1311, 256, 143, 1312, 341, 1313, 1314, 632, - 633, 1315, 24, 1297, 630, 1264, 700, 1265, 1324, 1180, - 89, 948, 1325, 256, 705, 1369, 1092, 0, 709, 0, - 0, 712, 0, 0, 579, 580, 257, 718, 0, 721, - 0, 0, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 0, 0, 0, 257, 0, 0, 1303, 0, - 0, 0, 665, 666, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 762, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 256, 0, 256, 0, - 0, 0, 612, 782, 0, 0, 785, 0, 0, 0, - 0, 0, 0, 634, 635, 636, 637, 794, 795, 796, - 797, 798, 799, 642, 0, 643, 644, 645, 646, 647, - 0, 648, 649, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 837, 838, 0, - 0, 839, 840, 841, 842, 0, 844, 0, 847, 848, - 849, 851, 852, 853, 854, 855, 856, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 0, 876, - 0, 0, 0, 0, 0, 660, 661, 662, 663, 664, - 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, - 665, 666, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 256, 0, 0, 0, 0, 0, 0, 910, - 0, 912, 0, 0, 914, 0, 915, 0, 0, 0, - 0, 0, 0, 919, 0, 0, 0, 0, 921, 0, - 0, 0, 0, 0, 0, 815, 0, 0, 0, 929, - 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, - 940, 941, 942, 943, 944, 945, 946, 947, 0, 0, - 0, 0, 0, 0, 953, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 966, 0, 0, 215, - 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, - 0, 217, 815, 0, 0, 0, 0, 0, 0, 0, - 0, 218, 0, 0, 994, 0, 0, 996, 612, 219, - 0, 0, 1001, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 220, 0, 0, 0, 0, 559, - 0, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1034, 0, 0, 0, 1039, 215, 0, - 0, 0, 632, 633, 216, 0, 0, 0, 0, 0, - 217, 0, 0, 0, 0, 0, 0, 0, 55, 1001, - 218, 0, 0, 0, 0, 1059, 0, 0, 219, 0, - 0, 254, 1063, 0, 0, 0, 0, 0, 0, 1068, - 0, 0, 56, 220, 0, 1071, 0, 0, 0, 0, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 0, 0, 0, 0, 255, 0, 498, - 0, 0, 0, 0, 0, 0, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 0, 55, 0, 0, - 650, 651, 652, 0, 0, 0, 653, 1121, 1122, 0, - 254, 1125, 1126, 1127, 0, 1001, 0, 0, 0, 0, - 0, 502, 0, 0, 1141, 0, 1143, 0, 1146, 0, - 0, 503, 0, 0, 1149, 0, 0, 0, 1152, 0, - 0, 654, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 215, 0, 0, 0, - 0, 0, 216, 665, 666, 0, 255, 667, 217, 0, - 0, 0, 559, 0, 0, 1172, 0, 0, 218, 0, - 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 220, 0, 0, 0, 0, 0, 612, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1238, 0, 1239, 0, 0, 0, 0, 1242, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1245, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 1261, 0, 0, 0, 0, 0, 0, 254, 0, - 0, 0, 1269, 0, 0, 0, 0, 0, 0, 56, - 1276, 1277, 1278, 0, 0, 0, 0, 1284, 0, 0, - 0, 612, 1287, 0, 0, 0, 0, 0, 0, 0, - 0, 1294, 1295, 1296, 0, 0, 0, 0, 0, 0, - 1299, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1316, 0, 0, 0, 0, - 0, 0, 0, 1321, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1344, 0, 0, 1347, 1348, 0, 0, 0, 0, - 0, 1351, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1355, 0, 0, 0, 0, 0, 0, - 0, 0, 1357, 0, 0, 0, 0, 0, 0, 0, - 0, 1366, 0, 0, 0, 0, 0, 0, 520, 0, - 0, 0, 401, 402, 3, 0, 521, 522, 523, 0, - 524, 0, 403, 404, 405, 406, 407, 0, 0, 1384, - 0, 0, 408, 525, 409, 526, 527, 0, 410, 0, - 0, 0, 0, 0, 0, 528, 411, 0, 1401, 529, - 0, 530, 412, 1403, 1404, 413, 0, 8, 414, 531, - 0, 532, 415, 0, 0, 533, 534, 0, 0, 0, - 0, 0, 535, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 536, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, + 57, 67, 828, 257, 714, 765, 500, 915, 970, 679, + 209, 681, 723, 683, 263, 890, 684, 892, 832, 894, + 126, 1004, 760, 1089, 686, 586, -113, 1002, 2, 626, + 628, 490, 808, 569, 82, 3, 636, 637, 618, 646, + 512, 812, 648, 649, 631, 1293, 67, 67, 67, 1006, + 1029, 380, 1192, 1076, 1130, 929, 118, 119, 4, 49, + 5, 1017, 6, 1371, 41, 632, 910, 1239, 7, 83, + 930, 380, 32, 33, 1268, 811, 68, 396, 8, 1357, + 1355, 875, 876, 815, 9, 816, 67, 67, 67, 67, + 648, 649, 38, 42, 401, 402, 100, 101, 102, 1400, + 322, 1143, 448, 633, 50, 492, 877, 1144, 10, 207, + 1339, 1340, 1193, 931, 408, 878, 669, 670, 911, 912, + 410, 913, 587, 588, 914, 910, 1349, 381, 917, 207, + 11, 12, 640, 641, 322, 1392, 1391, 517, 156, 157, + 646, 823, 647, 648, 649, 650, 651, 1190, 902, 336, + 1015, 256, 94, 762, 1145, 879, 880, 417, 418, 1146, + 55, 636, 637, 142, 669, 670, 45, 1094, 69, 598, + 75, 570, 46, 783, 699, 1380, 1381, 571, 912, 702, + 518, 368, 491, 793, 56, 911, 796, 58, 520, 761, + 785, 420, 421, 1373, 828, 698, 120, 1021, 636, 637, + 13, 121, 84, 122, 123, 589, 257, 911, 1102, 257, + 1125, 911, 911, 827, 85, 34, 59, 669, 670, 14, + 834, 15, 521, 257, 572, 590, 322, 55, 103, 784, + 1007, 15, 78, 257, 522, 823, 257, 257, 257, 213, + 978, 356, 981, 798, 1015, 770, 124, 574, 575, 577, + 989, 56, 1022, 992, 104, 884, 493, 640, 641, 440, + 170, 1216, 1052, 1024, 78, 646, 77, 214, 648, 649, + 650, 651, 1185, 823, 580, 494, 1269, 79, 158, 393, + 1023, 495, 1015, 159, 60, 160, 123, 570, 1016, 1139, + 1053, 55, 446, 571, 640, 641, 70, 71, 488, 72, + 1186, 87, 646, 1237, 647, 648, 649, 650, 651, 357, + 1052, 1052, 1080, 257, 257, 56, 570, 257, 489, 257, + 1024, 257, 571, 257, 673, 674, 1101, 73, 678, 910, + 680, 1238, 682, 764, 80, 1019, 358, 359, 1247, 1253, + 572, 828, 669, 670, 910, 910, 1306, 88, 61, 1052, + 1019, 1231, 94, 896, 256, 898, 94, 256, 62, 1052, + 1027, 1024, 1271, 1149, 664, 665, 666, 667, 668, 572, + 910, 256, 1176, 1024, 1378, 566, 1304, 1258, 90, 669, + 670, 256, 912, 1386, 256, 256, 256, 1298, 91, 1419, + 510, 256, 584, 1077, 636, 637, 910, 912, 912, 360, + 504, 1425, 1393, 361, 705, 1255, 505, 92, 626, 965, + 966, 105, 93, -669, 1407, 1408, -676, 106, -669, 706, + 977, -676, 99, 912, 591, 983, 984, 1065, 986, 257, + 988, 1299, 990, 991, -683, 993, 1067, -669, 127, -683, + -676, 1232, -346, 257, 592, 109, 368, -346, 55, 912, + 767, 110, 980, 96, 97, 98, 362, 817, -683, 55, + 363, 256, 256, 364, 599, 256, -346, 256, 817, 256, + 1226, 256, 56, 818, 838, 842, 112, 602, 887, 365, + 153, 154, 113, 56, 600, 366, 1242, 776, 85, 856, + 640, 641, 888, 144, 145, 146, 147, 603, 646, 1259, + 647, 648, 649, 650, 651, 324, 819, 777, 504, 325, + 1260, 1261, 1229, 394, 505, 115, 395, 129, 1346, 396, + 130, 116, 895, 326, 327, 1189, 1305, 257, 328, 329, + 330, 331, 131, 851, 504, 504, 257, 1042, 900, 257, + 505, 505, 852, 1134, 1047, 368, 1043, 905, 897, 1177, + 906, 504, 1179, 1048, 504, 1181, 140, 505, 1150, 139, + 505, 1141, 666, 667, 668, 979, 504, 1069, 1068, 823, + 1142, 149, 505, 133, 165, 669, 670, 256, 1015, 134, + 1104, 1087, 504, 83, 1088, 1128, 1091, 396, 505, 1129, + 1220, 256, 1092, 368, 1221, 1301, 1052, 768, 166, 1217, + 1052, 1052, 368, 368, 210, 211, 885, 886, 257, 257, + 257, 257, 1108, 1109, 1110, 820, 257, 1156, 1114, 964, + 257, 957, 967, 1240, 1272, 257, 257, 973, 257, 1165, + 257, 169, 257, 257, 368, 257, 368, 368, 889, 1105, + 891, 893, 368, 368, 368, 368, 1100, 1107, 1315, 1366, + 167, 1133, 153, 154, 805, 806, 100, 101, 102, 1178, + 100, 1394, 102, 168, 1287, 202, 100, 1350, 210, 211, + 212, 52, 53, 54, 204, 256, 207, 318, 319, 320, + 322, 333, 334, 337, 256, 338, 342, 256, 343, 376, + 636, 637, 344, 346, 345, 348, 355, 347, 349, 350, + 351, 1040, 369, 352, 353, 1332, 368, 354, 373, 1219, + 374, 375, 377, 1222, 378, 385, 1313, 1350, 389, 477, + 391, 501, 514, 626, 515, 563, 1188, 636, 637, 379, + 578, 498, 1321, 1322, 257, 516, 568, 593, 579, 585, + 594, 595, 15, 596, 597, 1401, 598, 601, 675, 604, + 605, 257, 608, 676, 700, 510, 256, 256, 256, 256, + 696, 701, 1073, 609, 256, 703, 610, 1368, 256, 718, + 720, 611, 612, 256, 256, 613, 256, 629, 256, 692, + 256, 256, 630, 256, 638, 639, 640, 641, 642, 1243, + 672, 643, 1424, 710, 646, 711, 647, 648, 649, 650, + 651, 717, 652, 653, 719, 1385, 726, 727, 728, 729, + 730, 731, 257, 257, 257, 737, 732, 733, 257, 734, + 735, 638, 639, 640, 641, 642, 736, 739, 643, 644, + 645, 646, 1403, 647, 648, 649, 650, 651, 758, 652, + 653, 759, 769, 774, 810, 654, 655, 656, 813, 779, + 780, 257, 781, 814, 662, 663, 664, 665, 666, 667, + 668, 830, 775, 849, 904, 908, 833, 909, 901, 919, + 1416, 669, 670, 922, 1418, 1348, 923, 924, 926, 928, + 956, 968, 256, 971, 994, 1005, 658, 171, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 1010, 256, + 1009, 1024, 1011, 1030, 1012, 1018, 1331, 257, 669, 670, + 1025, 1032, 1026, 1050, 636, 637, 1031, 1033, 1173, 1056, + 1034, 1035, 1045, 172, 1046, 173, 257, 174, 175, 176, + 177, 178, 1059, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 1061, 190, 191, 192, 1063, 1071, + 193, 194, 195, 196, 1072, 1083, 1084, 1085, 1094, 1090, + 256, 256, 256, 1096, 466, 1098, 256, 1099, 1111, 197, + 198, 1103, 1112, 1113, 487, 1116, 1115, 1120, 1123, 1117, + 1118, 1126, 1119, 1121, 497, 1122, 1135, 1124, 1158, 257, + 1159, 257, 1175, 1184, 1187, 1161, 1200, 1264, 1202, 256, + 1233, 1203, 1245, 1166, 1204, 1208, 562, 1172, 638, 639, + 640, 641, 642, 1198, 199, 643, 644, 645, 646, 1199, + 647, 648, 649, 650, 651, 1225, 652, 653, 1228, 1234, + 1230, 1235, 654, 655, 656, 1236, 1256, 1267, 657, 1270, + 1274, 1278, 606, 607, 1281, 1279, 1285, 1303, 1286, 1288, + 1292, 1294, 1295, 1323, 1314, 256, 1320, 1330, 1333, 616, + 619, 620, 621, 622, 623, 1342, 1353, 1343, 1344, 1345, + 1388, 1361, 1383, 658, 256, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 1384, 1387, 257, 1389, 1402, + 1390, 1399, 807, 1404, 1405, 669, 670, 1420, 1316, 671, + 125, 1409, 18, 1410, 1411, 1413, 257, 81, 1421, 1422, + 164, 128, 1423, 341, 1324, 143, 1347, 695, 1325, 1326, + 1327, 1328, 24, 1310, 1276, 1277, 709, 1337, 1191, 1338, + 89, 954, 582, 634, 583, 704, 1382, 256, 0, 256, + 0, 0, 0, 636, 637, 0, 0, 713, 0, 0, + 716, 0, 0, 0, 0, 0, 722, 0, 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 0, 430, 431, 432, 433, 434, 435, 436, 437, 56, - 438, 0, 0, 0, 0, 0, 0, 439, 537, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 0, 0, 0, 0, - 445, 0, 446, 520, 447, 448, 0, 401, 402, 3, - 0, 521, 522, 523, 0, 524, 0, 403, 404, 405, - 406, 407, 0, 0, 0, 0, 0, 408, 525, 409, - 526, 527, 0, 410, 0, 0, 0, 0, 0, 0, - 528, 411, 0, 0, 529, 0, 530, 412, 0, 0, - 413, 0, 8, 414, 531, 0, 532, 415, 0, 0, - 533, 534, 0, 0, 0, 0, 0, 535, 0, 0, - 416, 417, 0, 221, 222, 223, 0, 225, 226, 227, - 228, 229, 418, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, - 248, 249, 250, 251, 419, 420, 421, 536, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, - 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 424, 425, - 426, 427, 428, 0, 429, 0, 430, 431, 432, 433, - 434, 435, 436, 437, 56, 438, 0, 0, 0, 0, - 0, 0, 439, 1018, 538, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, - 441, 442, 0, 14, 0, 0, 443, 444, 0, 0, - 0, 0, 0, 0, 0, 445, 0, 446, 520, 447, - 448, 0, 401, 402, 3, 0, 521, 522, 523, 0, - 524, 0, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 525, 409, 526, 527, 0, 410, 0, - 0, 0, 0, 0, 0, 528, 411, 0, 0, 529, - 0, 530, 412, 0, 0, 413, 0, 8, 414, 531, - 0, 532, 415, 0, 0, 533, 534, 0, 0, 0, - 0, 0, 535, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 536, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 0, 430, 431, 432, 433, 434, 435, 436, 437, 56, - 438, 0, 0, 0, 0, 0, 0, 439, 1169, 538, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 401, 402, 0, 0, - 445, 0, 446, 0, 447, 448, 403, 404, 405, 406, - 407, 0, 0, 0, 0, 0, 408, 525, 409, 526, - 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 412, 0, 0, 413, - 0, 0, 414, 531, 0, 0, 415, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, - 417, 0, 221, 222, 223, 0, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 419, 420, 421, 536, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 0, 0, 0, 0, 424, 425, 426, - 427, 428, 0, 429, 0, 430, 431, 432, 433, 434, - 435, 436, 437, 56, 438, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, - 442, 0, 14, 0, 0, 443, 444, 0, 0, 0, - 0, 0, 401, 402, 445, 0, 446, 0, 447, 448, - 620, 0, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 0, 409, 0, 0, 0, 410, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 412, 0, 0, 413, 621, 0, 414, 0, - 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, + 0, 0, 766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 817, 430, 431, 432, 433, 434, 435, 436, 437, 818, - 438, 0, 0, 0, 0, 0, 0, 439, 0, 0, + 0, 616, 786, 0, 0, 789, 0, 791, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 799, 800, 801, + 802, 803, 804, 0, 0, 256, 0, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 256, 652, 653, 843, 844, 0, + 0, 845, 846, 847, 848, 0, 850, 0, 853, 854, + 855, 857, 858, 859, 860, 861, 862, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 874, 820, 882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 0, 0, 401, 402, - 445, 0, 446, 0, 447, 448, 620, 0, 403, 404, - 405, 406, 407, 0, 0, 0, 0, 0, 408, 0, - 409, 0, 0, 0, 410, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 412, 0, - 0, 413, 621, 0, 414, 0, 0, 0, 415, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 416, 417, 0, 221, 222, 223, 0, 225, 226, - 227, 228, 229, 418, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, - 0, 248, 249, 250, 251, 419, 420, 421, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 422, 423, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 0, 0, 0, 916, + 0, 918, 0, 0, 920, 0, 921, 0, 0, 0, + 0, 0, 0, 925, 820, 0, 0, 0, 927, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 935, + 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, + 946, 947, 948, 949, 950, 951, 952, 953, 0, 0, + 0, 0, 0, 0, 959, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 972, 0, 0, 0, + 215, 0, 0, 0, 0, 0, 216, 0, 0, 0, + 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 218, 0, 0, 1001, 0, 0, 1003, 616, + 219, 0, 0, 1008, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, + 0, 562, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 0, 0, 0, 1049, + 215, 0, 0, 0, 0, 0, 216, 0, 636, 637, + 0, 0, 217, 0, 0, 0, 0, 0, 0, 55, + 0, 0, 218, 0, 0, 0, 0, 1070, 0, 0, + 219, 0, 254, 0, 1074, 0, 0, 0, 0, 0, + 0, 1079, 0, 56, 0, 220, 0, 1082, 0, 0, + 0, 0, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 0, 0, 255, 0, + 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 636, 637, 638, 639, 640, 641, 642, 0, 0, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 55, + 652, 653, 0, 0, 0, 0, 0, 0, 0, 0, + 1131, 1132, 254, 0, 0, 0, 0, 1136, 1137, 1138, + 0, 1008, 0, 503, 0, 0, 0, 0, 0, 0, + 1152, 0, 1154, 504, 1157, 0, 0, 0, 0, 505, + 1160, 0, 0, 0, 1163, 0, 0, 0, 0, 0, + 0, 1008, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 215, 0, 0, 0, 0, 0, 216, 255, 669, + 670, 0, 0, 217, 638, 639, 640, 641, 0, 562, + 0, 0, 1183, 218, 646, 0, 647, 648, 649, 650, + 651, 219, 652, 653, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, + 0, 0, 616, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 0, 0, 1250, 0, + 1251, 669, 670, 0, 0, 1254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 1273, 0, + 0, 0, 0, 254, 0, 0, 0, 0, 1280, 0, + 0, 0, 0, 0, 56, 0, 0, 0, 1289, 1290, + 1291, 0, 0, 0, 0, 1297, 0, 0, 0, 616, + 1300, 0, 0, 0, 0, 0, 0, 0, 0, 1307, + 1308, 1309, 0, 0, 0, 0, 0, 0, 1312, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 424, - 425, 426, 427, 428, 0, 429, 0, 430, 431, 432, - 433, 434, 435, 436, 437, 56, 438, 0, 0, 0, - 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1329, 0, 0, 0, 0, 0, 0, + 0, 1334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 440, 441, 442, 0, 14, 0, 0, 443, 444, 0, - 0, 0, 401, 402, 0, 0, 445, 0, 446, 0, - 447, 448, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 0, 409, 0, 0, 0, 410, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 412, 0, 0, 413, 0, 0, 414, 0, - 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, + 1356, 0, 0, 1359, 1360, 0, 0, 0, 0, 0, + 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1367, 0, 0, 0, 0, 0, 0, 0, + 0, 1369, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1379, 0, 0, 0, 0, 0, 523, 0, 0, + 0, 401, 402, 3, 0, 524, 525, 526, 0, 527, + 0, 403, 404, 405, 406, 407, 0, 1397, 0, 0, + 0, 408, 528, 409, 529, 530, 0, 410, 0, 0, + 0, 0, 0, 0, 531, 411, 0, 1412, 532, 0, + 533, 412, 1414, 1415, 413, 0, 8, 414, 534, 0, + 535, 415, 0, 0, 536, 537, 0, 0, 0, 0, + 0, 538, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 539, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 817, 430, 431, 432, 433, 434, 435, 436, 437, 818, - 438, 0, 0, 0, 0, 0, 0, 439, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 540, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 401, 402, 0, 0, - 819, 0, 446, 820, 447, 448, 403, 404, 405, 406, - 407, 0, 0, 0, 0, 0, 408, 0, 409, 0, - 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 412, 0, 0, 413, - 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, - 417, 0, 221, 222, 223, 0, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 0, 0, 0, 0, 446, + 0, 447, 523, 448, 449, 0, 401, 402, 3, 0, + 524, 525, 526, 0, 527, 0, 403, 404, 405, 406, + 407, 0, 0, 0, 0, 0, 408, 528, 409, 529, + 530, 0, 410, 0, 0, 0, 0, 0, 0, 531, + 411, 0, 0, 532, 0, 533, 412, 0, 0, 413, + 0, 8, 414, 534, 0, 535, 415, 0, 0, 536, + 537, 0, 0, 0, 0, 0, 538, 0, 0, 417, + 418, 0, 221, 222, 223, 0, 225, 226, 227, 228, + 229, 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 419, 420, 421, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, + 249, 250, 251, 420, 421, 422, 539, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 0, 0, 0, 0, 424, 425, 426, - 427, 428, 0, 429, 0, 430, 431, 432, 433, 434, - 435, 436, 437, 56, 438, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, - 442, 0, 14, 0, 0, 443, 444, 0, 0, 0, - 0, 0, 401, 402, 445, 495, 446, 0, 447, 448, - 611, 0, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 0, 409, 0, 0, 0, 410, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 412, 0, 0, 413, 0, 0, 414, 0, - 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 425, 426, 427, + 428, 429, 0, 430, 0, 431, 432, 433, 434, 435, + 436, 437, 438, 56, 439, 0, 0, 0, 0, 0, + 0, 440, 1028, 541, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 441, 442, + 443, 0, 14, 0, 0, 444, 445, 0, 0, 0, + 0, 0, 0, 0, 446, 0, 447, 523, 448, 449, + 0, 401, 402, 3, 0, 524, 525, 526, 0, 527, + 0, 403, 404, 405, 406, 407, 0, 0, 0, 0, + 0, 408, 528, 409, 529, 530, 0, 410, 0, 0, + 0, 0, 0, 0, 531, 411, 0, 0, 532, 0, + 533, 412, 0, 0, 413, 0, 8, 414, 534, 0, + 535, 415, 0, 0, 536, 537, 0, 0, 0, 0, + 0, 538, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 539, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 1180, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 0, 430, 431, 432, 433, 434, 435, 436, 437, 56, - 438, 0, 0, 0, 0, 0, 0, 439, 0, 0, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 401, 402, 0, 0, 446, + 0, 447, 0, 448, 449, 403, 404, 405, 406, 407, + 0, 0, 0, 0, 0, 408, 528, 409, 529, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 0, + 0, 414, 534, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 539, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 401, 402, 0, 0, - 445, 0, 446, 0, 447, 448, 403, 404, 405, 406, - 407, 0, 0, 0, 0, 0, 408, 0, 409, 0, - 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 412, 0, 0, 413, - 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 56, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 401, + 402, 0, 0, 446, 0, 447, 0, 448, 449, 403, + 404, 405, 406, 407, 0, 0, 0, 0, 0, 408, + 0, 409, 0, 0, 0, 410, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 412, + 0, 0, 413, 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, - 417, 0, 221, 222, 223, 0, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 419, 420, 421, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, + 0, 0, 417, 418, 822, 221, 222, 223, 0, 225, + 226, 227, 228, 229, 419, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 0, 243, 244, 245, + 0, 0, 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 0, 0, 0, 0, 424, 425, 426, - 427, 428, 0, 429, 0, 430, 431, 432, 433, 434, - 435, 436, 437, 56, 438, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, - 442, 0, 14, 0, 0, 443, 444, 0, 0, 0, - 401, 402, 0, 0, 445, 690, 446, 0, 447, 448, - 403, 404, 405, 406, 407, 0, 0, 0, 0, 0, - 408, 0, 409, 0, 0, 0, 410, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 412, 0, 0, 413, 0, 0, 414, 0, 0, 0, - 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 416, 417, 0, 221, 222, 223, 0, - 225, 226, 227, 228, 229, 418, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 0, 243, 244, - 245, 0, 0, 248, 249, 250, 251, 419, 420, 421, + 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 422, 423, 0, 0, 0, 0, 0, 0, - 0, 708, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 0, 424, 425, 426, 427, 428, 0, 429, 0, 430, - 431, 432, 433, 434, 435, 436, 437, 56, 438, 0, - 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 425, 426, 427, 428, 429, 0, 430, 823, 431, 432, + 433, 434, 435, 436, 437, 438, 824, 439, 0, 0, + 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 440, 441, 442, 0, 14, 0, 0, 443, - 444, 0, 0, 0, 401, 402, 0, 0, 445, 0, - 446, 0, 447, 448, 403, 404, 405, 406, 407, 0, - 0, 0, 0, 0, 408, 0, 409, 0, 0, 0, - 410, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 412, 0, 0, 413, 0, 0, - 414, 0, 0, 0, 415, 0, 0, 0, 0, 0, - 711, 0, 0, 0, 0, 0, 0, 416, 417, 0, - 221, 222, 223, 0, 225, 226, 227, 228, 229, 418, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 0, 243, 244, 245, 0, 0, 248, 249, 250, - 251, 419, 420, 421, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 422, 423, 0, 0, + 0, 441, 442, 443, 0, 14, 0, 0, 444, 445, + 0, 0, 0, 0, 0, 401, 402, 825, 0, 447, + 826, 448, 449, 624, 0, 403, 404, 405, 406, 407, + 0, 0, 0, 0, 0, 408, 0, 409, 0, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 625, + 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 0, 0, 0, 0, 424, 425, 426, 427, 428, - 0, 429, 0, 430, 431, 432, 433, 434, 435, 436, - 437, 56, 438, 0, 0, 0, 0, 0, 0, 439, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 823, 431, 432, 433, 434, 435, 436, + 437, 438, 824, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 0, + 0, 401, 402, 446, 0, 447, 0, 448, 449, 624, + 0, 403, 404, 405, 406, 407, 0, 0, 0, 0, + 0, 408, 0, 409, 0, 0, 0, 410, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 412, 0, 0, 413, 625, 0, 414, 0, 0, + 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 440, 441, 442, 0, - 14, 0, 0, 443, 444, 0, 0, 0, 401, 402, - 0, 0, 445, 0, 446, 0, 447, 448, 403, 404, - 405, 406, 407, 0, 0, 0, 0, 0, 408, 0, - 409, 0, 0, 0, 410, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 412, 0, - 0, 413, 0, 0, 414, 0, 0, 0, 415, 0, - 0, 717, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 416, 417, 0, 221, 222, 223, 0, 225, 226, - 227, 228, 229, 418, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, - 0, 248, 249, 250, 251, 419, 420, 421, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 422, 423, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 401, 402, 0, 0, 446, + 0, 447, 0, 448, 449, 403, 404, 405, 406, 407, + 0, 0, 0, 0, 0, 408, 0, 409, 0, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 0, + 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 424, - 425, 426, 427, 428, 0, 429, 0, 430, 431, 432, - 433, 434, 435, 436, 437, 56, 438, 0, 0, 0, - 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 56, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 0, + 0, 401, 402, 446, 496, 447, 0, 448, 449, 615, + 0, 403, 404, 405, 406, 407, 0, 0, 0, 0, + 0, 408, 0, 409, 0, 0, 0, 410, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 412, 0, 0, 413, 0, 0, 414, 0, 0, + 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 440, 441, 442, 0, 14, 0, 0, 443, 444, 0, - 0, 0, 401, 402, 0, 0, 445, 0, 446, 0, - 447, 448, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 0, 409, 0, 0, 0, 410, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 412, 0, 0, 413, 0, 0, 414, 0, - 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, - 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 0, 430, 431, 432, 433, 434, 435, 436, 437, 56, - 438, 0, 0, 0, 0, 0, 0, 439, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 401, 402, 0, 0, 446, + 0, 447, 0, 448, 449, 403, 404, 405, 406, 407, + 0, 0, 0, 0, 0, 408, 0, 409, 0, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 0, + 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 401, 402, 0, 0, - 445, 0, 446, 0, 447, 448, 403, 404, 405, 406, - 407, 0, 0, 857, 0, 0, 408, 0, 409, 0, - 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 412, 0, 0, 413, - 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 56, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 401, + 402, 0, 0, 446, 694, 447, 0, 448, 449, 403, + 404, 405, 406, 407, 0, 0, 0, 0, 0, 408, + 0, 409, 0, 0, 0, 410, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 412, + 0, 0, 413, 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, - 417, 0, 221, 222, 223, 0, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 419, 420, 421, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, + 0, 0, 417, 418, 0, 221, 222, 223, 0, 225, + 226, 227, 228, 229, 419, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 0, 243, 244, 245, + 0, 0, 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 0, 0, 0, 0, 424, 425, 426, - 427, 428, 0, 429, 0, 430, 431, 432, 433, 434, - 435, 436, 437, 56, 438, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, - 442, 0, 14, 0, 0, 443, 444, 0, 0, 0, - 401, 402, 0, 0, 445, 0, 446, 0, 447, 448, - 403, 404, 405, 406, 407, 0, 0, 0, 0, 0, - 408, 0, 409, 0, 0, 0, 410, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 412, 0, 0, 413, 0, 0, 414, 0, 0, 0, - 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 416, 417, 0, 221, 222, 223, 0, - 225, 226, 227, 228, 229, 418, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 0, 243, 244, - 245, 0, 0, 248, 249, 250, 251, 419, 420, 421, + 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, + 712, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 425, 426, 427, 428, 429, 0, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 56, 439, 0, 0, + 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 422, 423, 0, 0, 0, 0, 0, 0, + 0, 441, 442, 443, 0, 14, 0, 0, 444, 445, + 0, 0, 0, 401, 402, 0, 0, 446, 0, 447, + 0, 448, 449, 403, 404, 405, 406, 407, 0, 0, + 0, 0, 0, 408, 0, 409, 0, 0, 0, 410, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 412, 0, 0, 413, 0, 0, 414, + 0, 0, 0, 415, 0, 0, 0, 0, 0, 715, + 0, 0, 0, 416, 0, 0, 417, 418, 0, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 419, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 0, 243, 244, 245, 0, 0, 248, 249, 250, 251, + 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 0, 424, 425, 426, 427, 428, 0, 429, 0, 430, - 431, 432, 433, 434, 435, 436, 437, 56, 438, 0, - 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 425, 426, 427, 428, 429, 0, + 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, + 56, 439, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 440, 441, 442, 0, 14, 0, 0, 443, - 444, 0, 0, 0, 401, 402, 0, 0, 445, 0, - 446, 877, 447, 448, 403, 404, 405, 406, 407, 0, - 0, 0, 0, 0, 408, 0, 409, 0, 0, 0, - 410, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 412, 0, 0, 413, 0, 0, - 414, 0, 0, 0, 415, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 416, 417, 0, - 221, 222, 223, 0, 225, 226, 227, 228, 229, 418, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 0, 243, 244, 245, 0, 0, 248, 249, 250, - 251, 419, 420, 421, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 422, 423, 0, 0, + 0, 0, 0, 0, 0, 441, 442, 443, 0, 14, + 0, 0, 444, 445, 0, 0, 0, 401, 402, 0, + 0, 446, 0, 447, 0, 448, 449, 403, 404, 405, + 406, 407, 0, 0, 0, 0, 0, 408, 0, 409, + 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 412, 0, 0, + 413, 0, 0, 414, 0, 0, 0, 415, 0, 0, + 721, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 417, 418, 0, 221, 222, 223, 0, 225, 226, 227, + 228, 229, 419, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, + 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, + 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 0, 0, 0, 0, 424, 425, 426, 427, 428, - 0, 429, 0, 430, 431, 432, 433, 434, 435, 436, - 437, 56, 438, 0, 0, 0, 0, 0, 0, 439, + 55, 0, 0, 0, 0, 0, 0, 0, 425, 426, + 427, 428, 429, 0, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 56, 439, 0, 0, 0, 0, + 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, + 442, 443, 0, 14, 0, 0, 444, 445, 0, 0, + 0, 401, 402, 0, 0, 446, 0, 447, 0, 448, + 449, 403, 404, 405, 406, 407, 0, 0, 0, 0, + 0, 408, 0, 409, 0, 0, 0, 410, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 412, 0, 0, 413, 0, 0, 414, 0, 0, + 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, + 0, 0, 724, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 440, 441, 442, 0, - 14, 0, 0, 443, 444, 0, 0, 0, 401, 402, - 0, 0, 445, 0, 446, 1144, 447, 448, 403, 404, - 405, 406, 407, 0, 0, 0, 0, 0, 408, 0, - 409, 0, 0, 0, 410, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 412, 0, - 0, 413, 0, 0, 414, 0, 0, 0, 415, 0, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 401, 402, 0, 0, 446, + 0, 447, 0, 448, 449, 403, 404, 405, 406, 407, + 0, 0, 863, 0, 0, 408, 0, 409, 0, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 0, + 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 416, 417, 0, 221, 222, 223, 0, 225, 226, - 227, 228, 229, 418, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, - 0, 248, 249, 250, 251, 419, 420, 421, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 56, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 401, + 402, 0, 0, 446, 0, 447, 0, 448, 449, 403, + 404, 405, 406, 407, 0, 0, 0, 0, 0, 408, + 0, 409, 0, 0, 0, 410, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 412, + 0, 0, 413, 0, 0, 414, 0, 0, 0, 415, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 417, 418, 0, 221, 222, 223, 0, 225, + 226, 227, 228, 229, 419, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 0, 243, 244, 245, + 0, 0, 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 422, 423, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 424, - 425, 426, 427, 428, 0, 429, 0, 430, 431, 432, - 433, 434, 435, 436, 437, 56, 438, 0, 0, 0, - 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 425, 426, 427, 428, 429, 0, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 56, 439, 0, 0, + 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 440, 441, 442, 0, 14, 0, 0, 443, 444, 0, - 0, 0, 401, 402, 0, 0, 445, 0, 446, 1153, - 447, 448, 403, 404, 405, 406, 407, 0, 0, 0, - 0, 0, 408, 0, 409, 0, 0, 0, 410, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 412, 0, 0, 413, 0, 0, 414, 0, - 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 416, 417, 0, 221, 222, - 223, 0, 225, 226, 227, 228, 229, 418, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, - 243, 244, 245, 0, 0, 248, 249, 250, 251, 419, - 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 422, 423, 0, 0, 0, 0, + 0, 441, 442, 443, 0, 14, 0, 0, 444, 445, + 0, 0, 0, 401, 402, 0, 0, 446, 0, 447, + 883, 448, 449, 403, 404, 405, 406, 407, 0, 0, + 0, 0, 0, 408, 0, 409, 0, 0, 0, 410, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 412, 0, 0, 413, 0, 0, 414, + 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 417, 418, 0, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 419, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 0, 243, 244, 245, 0, 0, 248, 249, 250, 251, + 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 0, 0, 0, 424, 425, 426, 427, 428, 0, 429, - 0, 430, 431, 432, 433, 434, 435, 436, 437, 56, - 438, 0, 0, 0, 0, 0, 0, 439, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 425, 426, 427, 428, 429, 0, + 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, + 56, 439, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 0, 14, 0, - 0, 443, 444, 0, 0, 0, 401, 402, 0, 0, - 445, 0, 446, 1206, 447, 448, 403, 404, 405, 406, - 407, 0, 0, 0, 0, 0, 408, 0, 409, 0, - 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 412, 0, 0, 413, - 0, 0, 414, 0, 0, 0, 415, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, - 417, 0, 221, 222, 223, 0, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 419, 420, 421, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, + 0, 0, 0, 0, 0, 441, 442, 443, 0, 14, + 0, 0, 444, 445, 0, 0, 0, 401, 402, 0, + 0, 446, 0, 447, 1155, 448, 449, 403, 404, 405, + 406, 407, 0, 0, 0, 0, 0, 408, 0, 409, + 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 412, 0, 0, + 413, 0, 0, 414, 0, 0, 0, 415, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 417, 418, 0, 221, 222, 223, 0, 225, 226, 227, + 228, 229, 419, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, + 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, + 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 0, 0, 0, 0, 424, 425, 426, - 427, 428, 0, 429, 0, 430, 431, 432, 433, 434, - 435, 436, 437, 56, 438, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, - 442, 0, 14, 0, 0, 443, 444, 0, 0, 0, - 401, 402, 0, 0, 445, 0, 446, 1283, 447, 448, - 403, 404, 405, 406, 407, 0, 0, 0, 0, 0, - 408, 0, 409, 0, 0, 0, 410, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 412, 0, 0, 413, 0, 0, 414, 0, 0, 0, - 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 416, 417, 0, 221, 222, 223, 0, - 225, 226, 227, 228, 229, 418, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 0, 243, 244, - 245, 0, 0, 248, 249, 250, 251, 419, 420, 421, + 55, 0, 0, 0, 0, 0, 0, 0, 425, 426, + 427, 428, 429, 0, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 56, 439, 0, 0, 0, 0, + 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, + 442, 443, 0, 14, 0, 0, 444, 445, 0, 0, + 0, 401, 402, 0, 0, 446, 0, 447, 1164, 448, + 449, 403, 404, 405, 406, 407, 0, 0, 0, 0, + 0, 408, 0, 409, 0, 0, 0, 410, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 412, 0, 0, 413, 0, 0, 414, 0, 0, + 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 417, 418, 0, 221, 222, 223, + 0, 225, 226, 227, 228, 229, 419, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 0, 243, + 244, 245, 0, 0, 248, 249, 250, 251, 420, 421, + 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 422, 423, 0, 0, 0, 0, 0, 0, - 0, 1298, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 0, 424, 425, 426, 427, 428, 0, 429, 0, 430, - 431, 432, 433, 434, 435, 436, 437, 56, 438, 0, - 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 425, 426, 427, 428, 429, 0, 430, 0, + 431, 432, 433, 434, 435, 436, 437, 438, 56, 439, + 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 440, 441, 442, 0, 14, 0, 0, 443, - 444, 0, 0, 0, 401, 402, 0, 0, 445, 0, - 446, 0, 447, 448, 403, 404, 405, 406, 407, 0, - 0, 0, 0, 0, 408, 0, 409, 0, 0, 0, - 410, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 412, 0, 0, 413, 0, 0, - 414, 0, 0, 0, 415, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 416, 417, 0, - 221, 222, 223, 0, 225, 226, 227, 228, 229, 418, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 0, 243, 244, 245, 0, 0, 248, 249, 250, - 251, 419, 420, 421, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 422, 423, 0, 0, + 0, 0, 0, 441, 442, 443, 0, 14, 0, 0, + 444, 445, 0, 0, 0, 401, 402, 0, 0, 446, + 0, 447, 1218, 448, 449, 403, 404, 405, 406, 407, + 0, 0, 0, 0, 0, 408, 0, 409, 0, 0, + 0, 410, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 412, 0, 0, 413, 0, + 0, 414, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 417, 418, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 0, 0, 0, 0, 424, 425, 426, 427, 428, - 0, 429, 0, 430, 431, 432, 433, 434, 435, 436, - 437, 56, 438, 0, 0, 0, 0, 0, 0, 439, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 0, 0, 0, 0, 0, 425, 426, 427, 428, + 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 56, 439, 0, 0, 0, 0, 0, 0, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 442, 443, + 0, 14, 0, 0, 444, 445, 0, 0, 0, 401, + 402, 0, 0, 446, 0, 447, 1296, 448, 449, 403, + 404, 405, 406, 407, 0, 0, 0, 0, 0, 408, + 0, 409, 0, 0, 0, 410, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 412, + 0, 0, 413, 0, 0, 414, 0, 0, 0, 415, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 417, 418, 0, 221, 222, 223, 0, 225, + 226, 227, 228, 229, 419, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 0, 243, 244, 245, + 0, 0, 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 440, 441, 442, 0, - 14, 0, 0, 443, 444, 0, 0, 0, 401, 402, - 0, 0, 445, 0, 446, 0, 447, 448, 403, 404, - 405, 406, 407, 0, 0, 0, 0, 0, 408, 0, - 409, 0, 0, 0, 410, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 412, 0, - 0, 413, 0, 0, 414, 0, 0, 0, 415, 0, + 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, + 1311, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 425, 426, 427, 428, 429, 0, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 56, 439, 0, 0, + 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 416, 417, 0, 221, 222, 223, 0, 225, 226, - 227, 228, 229, 418, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, - 0, 248, 249, 250, 251, 419, 420, 421, 0, 0, + 0, 441, 442, 443, 0, 14, 0, 0, 444, 445, + 0, 0, 0, 401, 402, 0, 0, 446, 0, 447, + 0, 448, 449, 403, 404, 405, 406, 407, 0, 0, + 0, 0, 0, 408, 0, 409, 0, 0, 0, 410, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 412, 0, 0, 413, 0, 0, 414, + 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 417, 418, 0, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 419, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 0, 243, 244, 245, 0, 0, 248, 249, 250, 251, + 420, 421, 422, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 422, 423, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 425, 426, 427, 428, 429, 0, + 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, + 56, 439, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 424, - 425, 426, 427, 428, 0, 429, 0, 430, 431, 432, - 433, 434, 435, 436, 437, 56, 438, 632, 633, 0, - 0, 215, 0, 439, 0, 0, 0, 216, 0, 0, - 0, 0, 0, 217, 0, 0, 0, 0, 0, 0, - 440, 441, 442, 218, 14, 0, 0, 443, 444, 0, - 0, 219, 0, 632, 633, 0, 1129, 0, 446, 0, - 447, 448, 0, 0, 0, 0, 220, 0, 0, 0, - 0, 0, 0, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 0, 0, 0, 0, - 0, 634, 635, 636, 637, 638, 0, 0, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 0, 0, - 55, 653, 0, 0, 0, 632, 633, 634, 635, 636, - 637, 638, 0, 254, 639, 640, 641, 642, 0, 643, - 644, 645, 646, 647, 502, 648, 649, 0, 0, 0, - 0, 650, 651, 652, 0, 0, 654, 653, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 0, 0, 684, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 654, 0, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, 666, 0, 0, 901, 634, - 635, 636, 637, 638, 632, 633, 639, 640, 641, 642, - 0, 643, 644, 645, 646, 647, 0, 648, 649, 0, - 0, 0, 0, 650, 651, 652, 0, 0, 0, 653, - 0, 0, 0, 0, 0, 632, 633, 0, 0, 0, + 0, 0, 0, 0, 0, 441, 442, 443, 0, 14, + 0, 0, 444, 445, 0, 0, 0, 401, 402, 0, + 0, 446, 0, 447, 0, 448, 449, 403, 404, 405, + 406, 407, 0, 0, 0, 0, 0, 408, 0, 409, + 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 412, 0, 0, + 413, 0, 0, 414, 0, 0, 0, 415, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 417, 418, 0, 221, 222, 223, 0, 225, 226, 227, + 228, 229, 419, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, + 248, 249, 250, 251, 420, 421, 422, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, + 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 425, 426, + 427, 428, 429, 0, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 56, 439, 636, 637, 0, 0, + 215, 0, 440, 0, 0, 0, 216, 0, 0, 0, + 0, 0, 217, 0, 0, 0, 0, 0, 0, 441, + 442, 443, 218, 14, 0, 0, 444, 445, 0, 0, + 219, 0, 636, 637, 0, 1140, 0, 447, 0, 448, + 449, 0, 0, 0, 0, 220, 0, 0, 0, 0, + 0, 0, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, + 638, 639, 640, 641, 642, 0, 0, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 0, 0, 0, 654, 655, 656, 0, 0, 55, + 657, 0, 0, 0, 636, 637, 638, 639, 640, 641, + 642, 0, 254, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 503, 652, 653, 0, 0, 0, 0, + 654, 655, 656, 0, 0, 658, 657, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 0, + 0, 688, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 669, 670, 0, 0, 907, 638, 639, + 640, 641, 642, 636, 637, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 0, + 0, 0, 0, 0, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 654, 0, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, - 976, 0, 0, 0, 0, 0, 0, 0, 634, 635, - 636, 637, 638, 0, 0, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 0, 0, - 0, 0, 650, 651, 652, 0, 0, 0, 653, 634, - 635, 636, 637, 638, 632, 633, 639, 640, 641, 642, - 0, 643, 644, 645, 646, 647, 0, 648, 649, 0, - 0, 0, 0, 650, 651, 652, 0, 0, 0, 653, - 0, 0, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 665, 666, 0, 0, 979, - 0, 0, 0, 0, 654, 0, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, - 988, 0, 0, 0, 0, 0, 632, 633, 634, 635, - 636, 637, 638, 0, 0, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 0, 0, - 0, 0, 650, 651, 652, 0, 0, 0, 653, 632, - 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 0, 0, 982, + 0, 0, 0, 0, 0, 0, 0, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, + 0, 654, 655, 656, 0, 0, 0, 657, 638, 639, + 640, 641, 642, 636, 637, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 0, + 0, 0, 658, 0, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 0, 0, 985, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 0, 0, 987, + 0, 0, 0, 0, 0, 636, 637, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, + 0, 654, 655, 656, 0, 0, 0, 657, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 665, 666, 0, 0, 989, - 634, 635, 636, 637, 638, 0, 0, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 0, 0, 0, 0, 650, 651, 652, 0, 0, 0, - 653, 632, 633, 634, 635, 636, 637, 638, 0, 0, - 639, 640, 641, 642, 0, 643, 644, 645, 646, 647, - 0, 648, 649, 0, 0, 0, 0, 650, 651, 652, - 0, 0, 0, 653, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 0, - 0, 990, 0, 0, 0, 0, 0, 0, 654, 0, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 665, 666, 0, 0, 991, 634, 635, 636, 637, 638, - 632, 633, 639, 640, 641, 642, 0, 643, 644, 645, - 646, 647, 0, 648, 649, 0, 0, 0, 0, 650, - 651, 652, 0, 0, 0, 653, 0, 0, 0, 0, - 0, 632, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 658, 0, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 0, 0, 995, 638, + 639, 640, 641, 642, 0, 0, 643, 644, 645, 646, + 0, 647, 648, 649, 650, 651, 0, 652, 653, 0, + 0, 0, 0, 654, 655, 656, 0, 0, 0, 657, + 636, 637, 638, 639, 640, 641, 642, 0, 0, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 0, + 652, 653, 0, 0, 0, 0, 654, 655, 656, 0, + 0, 0, 657, 0, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 0, 0, + 996, 0, 0, 0, 0, 0, 0, 658, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, + 670, 0, 0, 997, 638, 639, 640, 641, 642, 636, + 637, 643, 644, 645, 646, 0, 647, 648, 649, 650, + 651, 0, 652, 653, 0, 0, 0, 0, 654, 655, + 656, 0, 0, 0, 657, 0, 0, 0, 0, 0, + 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 654, 0, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 665, 666, 0, 0, 992, 0, 0, 0, - 0, 0, 0, 0, 634, 635, 636, 637, 638, 0, - 0, 639, 640, 641, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 0, 0, 0, 0, 650, 651, - 652, 0, 0, 0, 653, 634, 635, 636, 637, 638, - 632, 633, 639, 640, 641, 642, 0, 643, 644, 645, - 646, 647, 0, 648, 649, 0, 0, 0, 0, 650, - 651, 652, 0, 0, 0, 653, 0, 0, 0, 654, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 0, 0, 993, 0, 0, 0, 0, - 654, 0, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 665, 666, 0, 0, 1064, 0, 0, 0, - 0, 0, 632, 633, 634, 635, 636, 637, 638, 0, - 0, 639, 640, 641, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 0, 0, 0, 0, 650, 651, - 652, 0, 0, 0, 653, 632, 633, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, + 0, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 669, 670, 0, 0, 998, 0, 0, 0, 0, + 0, 0, 0, 638, 639, 640, 641, 642, 0, 0, + 643, 644, 645, 646, 0, 647, 648, 649, 650, 651, + 0, 652, 653, 0, 0, 0, 0, 654, 655, 656, + 0, 0, 0, 657, 638, 639, 640, 641, 642, 636, + 637, 643, 644, 645, 646, 0, 647, 648, 649, 650, + 651, 0, 652, 653, 0, 0, 0, 0, 654, 655, + 656, 0, 0, 0, 657, 0, 0, 0, 658, 0, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 669, 670, 0, 0, 999, 0, 0, 0, 0, 658, + 0, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 669, 670, 0, 0, 1000, 0, 0, 0, 0, + 0, 636, 637, 638, 639, 640, 641, 642, 0, 0, + 643, 644, 645, 646, 0, 647, 648, 649, 650, 651, + 0, 652, 653, 0, 0, 0, 0, 654, 655, 656, + 0, 0, 0, 657, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 0, 0, 1067, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 0, 0, 0, 0, - 650, 651, 652, 0, 0, 0, 653, 632, 633, 634, - 635, 636, 637, 638, 0, 0, 639, 640, 641, 642, - 0, 643, 644, 645, 646, 647, 0, 648, 649, 0, - 0, 0, 0, 650, 651, 652, 0, 0, 0, 653, - 0, 654, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 665, 666, 0, 0, 1070, 0, 0, - 0, 0, 0, 0, 654, 0, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, - 1096, 634, 635, 636, 637, 638, 632, 633, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 0, 0, - 0, 653, 0, 0, 0, 0, 0, 632, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 0, 0, 1163, 0, 0, 0, 0, 0, 0, 0, - 634, 635, 636, 637, 638, 0, 0, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 0, 0, 0, 0, 650, 651, 652, 0, 0, 0, - 653, 634, 635, 636, 637, 638, 632, 633, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 0, 0, - 0, 653, 0, 0, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 0, - 0, 1171, 0, 0, 0, 0, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 0, 0, 1211, 0, 0, 0, 0, 0, 632, 633, - 634, 635, 636, 637, 638, 0, 0, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 0, 0, 0, 0, 650, 651, 652, 0, 0, 0, - 653, 632, 633, 0, 0, 0, 0, 0, 0, 0, + 669, 670, 0, 0, 1075, 638, 639, 640, 641, 642, + 0, 0, 643, 644, 645, 646, 0, 647, 648, 649, + 650, 651, 0, 652, 653, 0, 0, 0, 0, 654, + 655, 656, 0, 0, 0, 657, 636, 637, 638, 639, + 640, 641, 642, 0, 0, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 0, + 658, 0, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 669, 670, 0, 0, 1078, 0, 0, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 0, 0, 1081, + 638, 639, 640, 641, 642, 636, 637, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 0, 0, 0, 654, 655, 656, 0, 0, 0, + 657, 0, 0, 0, 0, 0, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 0, - 0, 1212, 634, 635, 636, 637, 638, 0, 0, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 650, 651, 652, 0, - 0, 0, 653, 632, 633, 634, 635, 636, 637, 638, - 0, 0, 639, 640, 641, 642, 0, 643, 644, 645, - 646, 647, 0, 648, 649, 0, 0, 0, 0, 650, - 651, 652, 0, 0, 0, 653, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 0, 0, 1215, 0, 0, 0, 0, 0, 0, - 654, 0, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 665, 666, 0, 0, 1232, 634, 635, 636, - 637, 638, 632, 633, 639, 640, 641, 642, 0, 643, - 644, 645, 646, 647, 0, 648, 649, 0, 0, 0, - 0, 650, 651, 652, 0, 0, 0, 653, 0, 0, - 0, 0, 0, 632, 633, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 658, 0, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 0, + 0, 1106, 0, 0, 0, 0, 0, 0, 0, 638, + 639, 640, 641, 642, 0, 0, 643, 644, 645, 646, + 0, 647, 648, 649, 650, 651, 0, 652, 653, 0, + 0, 0, 0, 654, 655, 656, 0, 0, 0, 657, + 638, 639, 640, 641, 642, 636, 637, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 0, 0, 0, 654, 655, 656, 0, 0, 0, + 657, 0, 0, 0, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 0, 0, + 1174, 0, 0, 0, 0, 658, 0, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 0, + 0, 1182, 0, 0, 0, 0, 0, 636, 637, 638, + 639, 640, 641, 642, 0, 0, 643, 644, 645, 646, + 0, 647, 648, 649, 650, 651, 0, 652, 653, 0, + 0, 0, 0, 654, 655, 656, 0, 0, 0, 657, + 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 654, 0, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, 666, 0, 0, 1234, 0, - 0, 0, 0, 0, 0, 0, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 0, 0, 0, 0, - 650, 651, 652, 0, 0, 0, 653, 634, 635, 636, - 637, 638, 632, 633, 639, 640, 641, 642, 0, 643, - 644, 645, 646, 647, 0, 648, 649, 0, 0, 0, - 0, 650, 651, 652, 0, 0, 0, 653, 0, 0, - 0, 654, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 665, 666, 0, 0, 1236, 0, 0, - 0, 0, 654, 0, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, 666, 0, 0, 1240, 0, - 0, 0, 0, 0, 632, 633, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 0, 0, 0, 0, - 650, 651, 652, 0, 0, 0, 653, 632, 633, 0, + 0, 0, 0, 0, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 0, 0, + 1223, 638, 639, 640, 641, 642, 0, 0, 643, 644, + 645, 646, 0, 647, 648, 649, 650, 651, 0, 652, + 653, 0, 0, 0, 0, 654, 655, 656, 0, 0, + 0, 657, 636, 637, 638, 639, 640, 641, 642, 0, + 0, 643, 644, 645, 646, 0, 647, 648, 649, 650, + 651, 0, 652, 653, 0, 0, 0, 0, 654, 655, + 656, 0, 0, 0, 657, 0, 658, 0, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 669, 670, + 0, 0, 1224, 0, 0, 0, 0, 0, 0, 658, + 0, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 669, 670, 0, 0, 1227, 638, 639, 640, 641, + 642, 636, 637, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 0, 0, 0, 0, + 654, 655, 656, 0, 0, 0, 657, 0, 0, 0, + 0, 0, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 669, 670, 0, 0, 1244, 0, 0, + 0, 0, 0, 0, 0, 638, 639, 640, 641, 642, + 0, 0, 643, 644, 645, 646, 0, 647, 648, 649, + 650, 651, 0, 652, 653, 0, 0, 0, 0, 654, + 655, 656, 0, 0, 0, 657, 638, 639, 640, 641, + 642, 636, 637, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 0, 0, 0, 0, + 654, 655, 656, 0, 0, 0, 657, 0, 0, 0, + 658, 0, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 669, 670, 0, 0, 1246, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 669, 670, 0, 0, 1248, 0, 0, + 0, 0, 0, 636, 637, 638, 639, 640, 641, 642, + 0, 0, 643, 644, 645, 646, 0, 647, 648, 649, + 650, 651, 0, 652, 653, 0, 0, 0, 0, 654, + 655, 656, 0, 0, 0, 657, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 654, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 665, 666, 0, 0, 1254, 634, 635, - 636, 637, 638, 0, 0, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 0, 0, - 0, 0, 650, 651, 652, 0, 0, 0, 653, 632, - 633, 634, 635, 636, 637, 638, 0, 0, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 0, 0, - 0, 653, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 665, 666, 0, 0, 1304, - 0, 0, 0, 0, 0, 0, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 0, 0, 1305, 634, 635, 636, 637, 638, 632, 633, - 639, 640, 641, 642, 0, 643, 644, 645, 646, 647, - 0, 648, 649, 0, 0, 0, 0, 650, 651, 652, - 0, 0, 0, 653, 0, 0, 0, 0, 0, 632, - 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 665, 666, 0, 0, 1306, 0, 0, 0, 0, 0, - 0, 0, 634, 635, 636, 637, 638, 0, 0, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 650, 651, 652, 0, - 0, 0, 653, 634, 635, 636, 637, 638, 632, 633, - 639, 640, 641, 642, 0, 643, 644, 645, 646, 647, - 0, 648, 649, 0, 0, 0, 0, 650, 651, 652, - 0, 0, 0, 653, 0, 0, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 0, 0, 1329, 0, 0, 0, 0, 654, 0, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 658, 0, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 669, 670, 0, 0, 1252, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, + 0, 654, 655, 656, 0, 0, 0, 657, 636, 637, + 638, 639, 640, 641, 642, 0, 0, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 0, 0, 0, 654, 655, 656, 0, 0, 0, + 657, 0, 658, 0, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 0, 0, 1266, 0, + 0, 0, 0, 0, 0, 658, 0, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 0, + 0, 1317, 638, 639, 640, 641, 642, 636, 637, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 0, + 652, 653, 0, 0, 0, 0, 654, 655, 656, 0, + 0, 0, 657, 0, 0, 0, 0, 0, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 665, 666, 0, 0, 1340, 0, 0, 0, 0, 0, - 632, 633, 634, 635, 636, 637, 638, 0, 0, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 650, 651, 652, 0, - 0, 0, 653, 632, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 658, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, + 670, 0, 0, 1318, 0, 0, 0, 0, 0, 0, + 0, 638, 639, 640, 641, 642, 0, 0, 643, 644, + 645, 646, 0, 647, 648, 649, 650, 651, 0, 652, + 653, 0, 0, 0, 0, 654, 655, 656, 0, 0, + 0, 657, 638, 639, 640, 641, 642, 636, 637, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 0, + 652, 653, 0, 0, 0, 0, 654, 655, 656, 0, + 0, 0, 657, 0, 0, 0, 658, 0, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 669, 670, + 0, 0, 1319, 0, 0, 0, 0, 658, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, + 670, 0, 0, 1341, 0, 0, 0, 0, 0, 636, + 637, 638, 639, 640, 641, 642, 0, 0, 643, 644, + 645, 646, 0, 647, 648, 649, 650, 651, 0, 652, + 653, 0, 0, 0, 0, 654, 655, 656, 0, 0, + 0, 657, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 0, 0, 1350, 634, 635, 636, 637, 638, 0, - 0, 639, 640, 641, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 0, 0, 0, 0, 650, 651, - 652, 0, 0, 0, 653, 632, 633, 634, 635, 636, - 637, 638, 0, 0, 639, 640, 641, 642, 0, 643, - 644, 645, 646, 647, 0, 648, 649, 0, 0, 0, - 0, 650, 651, 652, 0, 0, 0, 653, 0, 654, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 0, 0, 1383, 0, 0, 0, 0, - 0, 0, 654, 0, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, 666, 632, 633, 1393, 634, - 635, 636, 637, 638, 0, 0, 639, 640, 641, 642, - 0, 643, 644, 645, 646, 647, 0, 648, 649, 0, - 0, 0, 0, 650, 651, 652, 0, 632, 633, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 658, 0, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 669, 670, + 0, 0, 1352, 638, 639, 640, 641, 642, 0, 0, + 643, 644, 645, 646, 0, 647, 648, 649, 650, 651, + 0, 652, 653, 0, 0, 0, 0, 654, 655, 656, + 0, 0, 0, 657, 636, 637, 638, 639, 640, 641, + 642, 0, 0, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 0, 0, 0, 0, + 654, 655, 656, 0, 0, 0, 657, 0, 658, 0, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 669, 670, 0, 0, 1362, 0, 0, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 669, 670, 0, 0, 1396, 638, 639, + 640, 641, 642, 636, 637, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 0, + 0, 0, 0, 0, 636, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 654, 0, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 665, 666, 689, 0, - 634, 635, 636, 637, 638, 0, 0, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 0, 0, 0, 0, 650, 651, 652, 632, 633, 0, - 653, 634, 635, 636, 637, 638, 0, 0, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 632, 633, - 0, 653, 0, 0, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 897, - 0, 0, 0, 0, 0, 0, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 1026, 634, 635, 636, 637, 638, 0, 0, 639, 640, - 641, 642, 0, 643, 644, 645, 646, 647, 0, 648, - 649, 0, 0, 0, 0, 650, 651, 652, 632, 633, - 0, 653, 634, 635, 636, 637, 638, 0, 0, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 650, 651, 652, 0, - 0, 0, 653, 0, 0, 0, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, - 1041, 0, 0, 0, 0, 0, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 1151, 634, 635, 636, 637, 638, 632, 633, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 650, 651, 652, 0, - 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 0, 0, 1406, + 0, 0, 0, 0, 0, 0, 0, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, + 0, 654, 655, 656, 636, 637, 0, 657, 638, 639, + 640, 641, 642, 0, 0, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 636, 637, 0, 657, 0, + 0, 0, 658, 0, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 693, 0, 0, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 903, 638, 639, + 640, 641, 642, 0, 0, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 636, 637, 0, 657, 638, + 639, 640, 641, 642, 0, 0, 643, 644, 645, 646, + 0, 647, 648, 649, 650, 651, 0, 652, 653, 0, + 0, 0, 0, 654, 655, 656, 636, 637, 0, 657, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 1036, 0, 0, + 0, 0, 0, 0, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 1051, 638, + 639, 640, 641, 642, 0, 0, 643, 644, 645, 646, + 0, 647, 648, 649, 650, 651, 0, 652, 653, 0, + 0, 0, 0, 654, 655, 656, 0, 0, 0, 657, + 638, 639, 640, 641, 642, 636, 637, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 0, 0, 0, 654, 655, 656, 0, 0, 0, + 657, 0, 0, 0, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 1162, 0, + 0, 0, 0, 0, 0, 658, 0, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 1167, + 0, 740, 741, 742, 743, 744, 745, 746, 747, 638, + 639, 640, 641, 642, 748, 749, 643, 644, 645, 646, + 750, 647, 648, 649, 650, 651, 751, 652, 653, 752, + 753, 267, 268, 654, 655, 656, 754, 755, 756, 657, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 1156, 0, 736, 737, 738, 739, 740, 741, 742, - 743, 634, 635, 636, 637, 638, 744, 745, 639, 640, - 641, 642, 746, 643, 644, 645, 646, 647, 747, 648, - 649, 748, 749, 267, 268, 650, 651, 652, 750, 751, - 752, 653, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 632, 633, 0, 0, -315, 0, - 0, 0, 0, 0, 0, 753, 654, 0, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, + 0, 0, 636, 637, 0, 0, -317, 0, 0, 0, + 0, 0, 0, 757, 658, 0, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 669, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 0, 0, 288, - 289, 290, 0, 0, 291, 292, 293, 294, 295, 0, - 0, 296, 297, 298, 299, 300, 301, 302, 634, 635, - 636, 637, 638, 632, 633, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 0, 0, - 804, 0, 650, 651, 652, 0, 0, 0, 653, 0, - 0, 0, 303, 0, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 0, 0, 314, 315, 0, 0, - 0, 0, 0, 0, 316, 317, 0, 0, 0, 0, - 0, 0, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 665, 666, 0, 0, 0, - 0, 0, 632, 633, 0, 0, 0, 634, 635, 636, - 637, 638, 0, 0, 639, 640, 641, 642, 0, 643, - 644, 645, 646, 647, 0, 648, 649, 0, 0, 0, - 0, 650, 651, 652, 632, 633, 0, 653, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 0, 0, 288, 289, 290, + 0, 0, 291, 292, 293, 294, 295, 0, 0, 296, + 297, 298, 299, 300, 301, 302, 638, 639, 640, 641, + 642, 636, 637, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 0, 0, 809, 0, + 654, 655, 656, 0, 0, 0, 657, 0, 0, 0, + 303, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 0, 0, 314, 315, 0, 0, 0, 0, + 0, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 669, 670, 0, 0, 0, 0, 0, + 636, 637, 0, 0, 0, 638, 639, 640, 641, 642, + 0, 0, 643, 644, 645, 646, 0, 647, 648, 649, + 650, 651, 0, 652, 653, 0, 0, 0, 0, 654, + 655, 656, 636, 637, 0, 657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 954, 0, 0, 0, 0, 0, - 0, 0, 654, 0, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, 666, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 632, 633, 0, 0, - 650, 651, 652, 0, 0, 0, 653, 0, 634, 635, - 636, 637, 638, 0, 0, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 632, 633, - 0, 0, 650, 651, 652, 0, 0, 0, 653, 0, - 0, 654, 1031, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 665, 666, 1086, 0, 0, 0, 0, - 0, 0, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 634, 635, 636, 637, 638, 665, 666, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 632, 633, 0, 0, 650, 651, 652, 0, 0, 0, - 653, 0, 634, 635, 636, 637, 638, 0, 0, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 1117, 632, 633, 650, 651, 652, 0, - 0, 0, 653, 0, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 1322, - 0, 0, 0, 0, 0, 0, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 634, 635, 636, 637, 638, 665, - 666, 639, 640, 641, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 0, 0, 632, 633, 650, 651, - 652, 0, 0, 0, 653, 0, 0, 0, 634, 635, - 636, 637, 638, 0, 0, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 0, 0, - 0, 1341, 650, 651, 652, 0, 0, 0, 653, 654, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 0, 0, 1358, 0, 0, 0, 0, - 0, 0, 0, 654, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 632, 633, 0, 0, 0, - 634, 635, 636, 637, 638, 665, 666, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 0, 0, 0, 0, 650, 651, 652, 0, 0, 0, - 653, 632, 633, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 960, 0, 0, 0, 0, 0, 0, 0, + 658, 0, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 669, 670, 638, 639, 640, 641, 642, 0, + 0, 643, 644, 645, 646, 0, 647, 648, 649, 650, + 651, 0, 652, 653, 636, 637, 0, 0, 654, 655, + 656, 0, 0, 0, 657, 0, 638, 639, 640, 641, + 642, 0, 0, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 636, 637, 0, 0, + 654, 655, 656, 0, 0, 0, 657, 0, 0, 658, + 1041, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 669, 670, 1097, 0, 0, 0, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 638, 639, + 640, 641, 642, 669, 670, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 636, 637, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 0, + 638, 639, 640, 641, 642, 0, 0, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 0, 1127, 636, 637, 654, 655, 656, 0, 0, 0, + 657, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 1335, 0, 0, + 0, 0, 0, 0, 0, 658, 0, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 638, 639, 640, 641, 642, 669, 670, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 0, + 652, 653, 0, 0, 636, 637, 654, 655, 656, 0, + 0, 0, 657, 0, 0, 0, 638, 639, 640, 641, + 642, 0, 0, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 0, 0, 0, 1353, + 654, 655, 656, 0, 0, 0, 657, 658, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, + 670, 0, 0, 1370, 0, 0, 0, 0, 0, 0, + 0, 658, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 636, 637, 0, 0, 0, 638, 639, + 640, 641, 642, 669, 670, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, + 0, 0, 654, 655, 656, 0, 0, 0, 657, 636, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1385, 0, 0, - 0, 0, 0, 0, 0, 654, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 665, 666, 634, - 635, 636, 637, 638, 0, 0, 639, 640, 641, 642, - 0, 643, 644, 645, 646, 647, 0, 648, 649, 0, - 0, 0, 0, 650, 651, 652, 0, 0, 0, 653, - 632, 633, 0, 0, 0, 634, 635, 636, 637, 638, - 0, 0, 639, 640, 641, 642, 0, 643, 644, 645, - 646, 647, 0, 648, 649, 0, 1406, 0, 0, 650, - 651, 652, 632, 633, 654, 653, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, + 0, 0, 0, 0, 0, 1398, 0, 0, 0, 0, + 0, 0, 0, 658, 0, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 669, 670, 638, 639, 640, + 641, 642, 0, 0, 643, 644, 645, 646, 0, 647, + 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, + 0, 654, 655, 656, 0, 0, 0, 657, 636, 637, + 0, 0, 0, 638, 639, 640, 641, 642, 0, 0, + 643, 644, 645, 646, 0, 647, 648, 649, 650, 651, + 0, 652, 653, 0, 1417, 0, 0, 654, 655, 656, + 636, 637, 658, 657, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 669, 670, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 654, 0, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 665, 666, 634, 635, 636, 637, 638, 0, - 0, 639, 640, 641, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 632, 633, 0, 0, 650, 651, - 652, 0, 0, 0, -677, 0, 634, 635, 636, 637, - 638, 0, 0, 639, 640, 641, 642, 0, 643, 644, - 645, 646, 647, 0, 648, 649, 632, 633, 0, 0, - 650, 651, 652, 0, 0, 0, 0, 0, 0, 654, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 0, 0, 0, 0, 0, 0, 0, - 0, 654, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 0, 0, 0, 0, 0, 634, 635, - 636, 637, 638, 665, 666, 639, 640, 641, 642, 0, - 643, 644, 645, 646, 647, 0, 648, 649, 632, 633, + 669, 670, 638, 639, 640, 641, 642, 0, 0, 643, + 644, 645, 646, 0, 647, 648, 649, 650, 651, 0, + 652, 653, 636, 637, 0, 0, 654, 655, 656, 0, + 0, 0, -684, 0, 638, 639, 640, 641, 642, 0, + 0, 643, 644, 645, 646, 0, 647, 648, 649, 650, + 651, 0, 652, 653, 636, 637, 0, 0, 654, 0, + 656, 0, 0, 0, 0, 0, 0, 658, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, + 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 0, 0, 0, 0, 0, 638, 639, 640, 641, + 642, 669, 670, 643, 644, 645, 646, 0, 647, 648, + 649, 650, 651, 0, 652, 653, 636, 637, 0, 0, + 654, 0, 0, 0, 0, 0, 0, 0, 638, 639, + 640, 641, 642, 0, 0, 643, 644, 645, 646, 0, + 647, 648, 649, 650, 651, 0, 652, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 634, 635, 636, 637, 638, 0, 0, 639, 640, 641, - 642, 0, 643, 644, 645, 646, 647, 0, 648, 649, - 632, 633, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 665, 666, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 0, 0, 0, - 0, 0, 634, 635, 636, 637, 638, 665, 666, 639, - 640, 641, 642, 0, 643, 644, 645, 646, 647, 0, - 648, 649, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 634, 635, 636, 637, 638, 0, - 0, 639, 0, 0, 642, 0, 643, 644, 645, 646, - 647, 0, 648, 649, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 0, 0, 0, 0, 0, 835, 0, + 0, 0, 0, 669, 670, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 0, 0, 0, 0, 0, + 638, 639, 640, 641, 642, 669, 670, 643, 644, 645, + 646, 0, 647, 648, 649, 650, 651, 0, 652, 653, + 221, 222, 223, 0, 225, 226, 227, 228, 229, 419, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 0, 243, 244, 245, 0, 0, 248, 249, 250, + 251, 0, 0, 0, 0, 0, 839, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, + 662, 663, 664, 665, 666, 667, 668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 669, 670, 1037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 829, 658, 659, 660, 661, 662, 663, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, - 666, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 833, 0, 658, 659, 660, 661, 662, 663, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 665, 666, 221, 222, 223, 0, 225, 226, 227, - 228, 229, 418, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 0, 243, 244, 245, 0, 0, - 248, 249, 250, 251, 221, 222, 223, 0, 225, 226, - 227, 228, 229, 418, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 0, 243, 244, 245, 0, - 0, 248, 249, 250, 251, 0, 0, 0, 0, 0, - 1027, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 830, 0, 0, 0, 0, - 0, 0, 0, 0, 831, 0, 0, 0, 0, 0, + 0, 0, 836, 0, 0, 0, 0, 0, 221, 222, + 223, 837, 225, 226, 227, 228, 229, 419, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 243, 244, 245, 0, 0, 248, 249, 250, 251, 0, + 0, 221, 222, 223, 0, 225, 226, 227, 228, 229, + 419, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 0, 243, 244, 245, 0, 0, 248, 249, + 250, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 834, 171, 0, 0, - 0, 0, 221, 222, 223, 835, 225, 226, 227, 228, - 229, 418, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 0, 243, 244, 245, 0, 0, 248, - 249, 250, 251, 172, 0, 173, 0, 174, 175, 176, - 177, 178, 0, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 0, 190, 191, 192, 0, 0, - 193, 194, 195, 196, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, - 198, 0, 0, 0, 1028, 0, 0, 0, 0, 0, - 0, 0, 0, 1029, 0, 0, 0, 0, 0, 0, + 840, 0, 0, 0, 0, 0, 0, 0, 0, 841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 199 + 0, 0, 0, 1038, 0, 0, 0, 0, 0, 0, + 0, 0, 1039 }; static const yytype_int16 yycheck[] = { - 14, 15, 589, 704, 165, 152, 485, 527, 484, 626, - 566, 805, 771, 628, 562, 535, 77, 479, 927, 481, - 446, 483, 611, 0, 457, 675, 165, 677, 8, 679, - 7, 620, 368, 22, 20, 5, 33, 15, 16, 828, - 21, 22, 33, 19, 20, 20, 60, 61, 62, 1201, - 150, 20, 46, 30, 1289, 32, 1287, 34, 20, 395, - 162, 125, 488, 40, 128, 129, 614, 126, 57, 126, - 147, 5, 6, 50, 622, 132, 624, 164, 165, 56, - 128, 129, 128, 129, 150, 162, 100, 101, 102, 103, - 126, 25, 34, 1323, 162, 162, 132, 31, 139, 140, - 141, 155, 138, 80, 172, 207, 206, 153, 208, 15, - 16, 1346, 106, 1344, 1266, 1267, 162, 7, 707, 138, - 179, 63, 179, 182, 191, 102, 103, 184, 205, 1281, - 1360, 564, 102, 103, 68, 69, 117, 118, 202, 203, - 172, 170, 208, 179, 125, 172, 207, 128, 129, 130, - 131, 165, 126, 62, 202, 203, 202, 203, 132, 186, - 50, 587, 181, 172, 181, 206, 153, 184, 102, 103, - 596, 21, 22, 599, 206, 162, 205, 155, 1330, 1331, - 5, 6, 160, 8, 162, 163, 162, 184, 47, 131, - 182, 171, 178, 184, 186, 172, 138, 630, 987, 137, - 626, 190, 819, 178, 138, 179, 203, 368, 67, 178, - 371, 36, 209, 202, 191, 185, 178, 178, 205, 808, - 162, 202, 203, 203, 385, 179, 203, 205, 162, 178, - 126, 779, 170, 781, 395, 205, 170, 398, 399, 400, - 788, 255, 668, 791, 126, 206, 385, 178, 178, 155, - 132, 185, 588, 195, 160, 204, 162, 163, 126, 398, - 399, 400, 153, 205, 132, 601, 1175, 117, 118, 203, - 170, 162, 138, 204, 204, 125, 337, 127, 128, 129, - 130, 131, 178, 179, 178, 181, 138, 126, 184, 126, - 172, 1327, 178, 132, 126, 132, 126, 179, 178, 178, - 132, 1337, 132, 147, 172, 920, 178, 207, 208, 178, - 162, 179, 206, 474, 475, 206, 178, 478, 162, 480, - 206, 482, 178, 484, 181, 181, 206, 206, 184, 186, - 178, 1367, 1368, 178, 206, 474, 475, 206, 178, 478, - 179, 480, 179, 482, 206, 771, 963, 179, 205, 179, - 138, 178, 202, 203, 368, 178, 138, 371, 206, 147, - 181, 1062, 172, 825, 152, 147, 206, 1017, 60, 61, - 62, 385, 181, 162, 162, 389, 186, 186, 12, 206, - 162, 395, 181, 206, 398, 399, 400, 186, 57, 23, - 24, 405, 406, 913, 63, 172, 205, 185, 21, 22, - 75, 185, 185, 1162, 79, 182, 205, 172, 100, 101, - 102, 103, 891, 889, 1208, 181, 185, 185, 93, 94, - 186, 205, 205, 98, 99, 100, 101, 588, 202, 185, - 1131, 767, 768, 21, 22, 162, 205, 205, 172, 205, - 601, 172, 778, 172, 172, 162, 162, 783, 784, 205, - 786, 787, 186, 789, 790, 186, 792, 186, 186, 178, - 474, 475, 181, 162, 478, 184, 480, 153, 482, 153, - 484, 632, 633, 153, 1124, 153, 162, 172, 162, 153, - 205, 57, 162, 178, 162, 57, 647, 63, 162, 1139, - 155, 63, 115, 116, 117, 118, 119, 57, 162, 122, - 123, 124, 125, 63, 127, 128, 129, 130, 131, 57, - 133, 134, 1129, 57, 1215, 63, 139, 1104, 141, 63, - 57, 172, 1078, 162, 685, 172, 63, 178, 172, 117, - 118, 178, 164, 694, 178, 162, 697, 125, 162, 127, - 128, 129, 130, 131, 1064, 1007, 685, 1067, 21, 22, - 1070, 57, 182, 162, 179, 694, 186, 1019, 697, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 995, - 170, 182, 182, 999, 588, 186, 186, 182, 182, 202, - 203, 186, 186, 170, 182, 182, 182, 601, 186, 186, - 186, 170, 182, 182, 164, 1115, 186, 186, 1024, 187, - 188, 189, 190, 191, 139, 766, 767, 768, 769, 106, - 1036, 625, 759, 774, 202, 203, 181, 778, 1138, 164, - 165, 1177, 783, 784, 208, 786, 787, 766, 789, 790, - 769, 792, 968, 969, 970, 774, 139, 973, 141, 1065, - 164, 165, 166, 167, 117, 118, 35, 35, 1196, 1350, - 205, 170, 125, 170, 127, 128, 129, 130, 131, 139, - 140, 141, 164, 165, 166, 1282, 10, 11, 12, 162, - 1006, 685, 208, 162, 185, 185, 185, 205, 185, 205, - 694, 185, 205, 697, 185, 185, 185, 1274, 162, 185, - 1116, 185, 182, 185, 1120, 162, 857, 162, 162, 204, - 22, 1257, 162, 181, 33, 181, 204, 170, 162, 178, - 1230, 162, 203, 132, 162, 1332, 189, 190, 191, 205, - 162, 205, 205, 185, 185, 206, 1246, 1247, 889, 202, - 203, 60, 61, 185, 205, 185, 1162, 205, 185, 185, - 185, 1077, 185, 172, 1361, 185, 907, 205, 162, 205, - 205, 162, 766, 767, 768, 769, 205, 162, 171, 181, - 774, 205, 1318, 172, 778, 203, 205, 208, 907, 783, - 784, 204, 786, 787, 171, 789, 790, 205, 792, 205, - 205, 162, 172, 155, 37, 1333, 1334, 172, 1336, 172, - 205, 10, 1409, 172, 123, 172, 172, 172, 127, 172, - 66, 172, 172, 205, 1140, 179, 186, 968, 969, 970, - 178, 205, 973, 178, 13, 1363, 185, 178, 185, 185, - 4, 208, 162, 178, 206, 171, 43, 205, 14, 179, - 181, 21, 22, 170, 155, 8, 70, 162, 186, 171, - 178, 205, 204, 206, 185, 1006, 205, 1273, 205, 205, - 185, 1, 206, 1279, 162, 184, 205, 162, 187, 186, - 189, 162, 205, 1383, 43, 162, 205, 1387, 186, 205, - 186, 205, 205, 171, 203, 889, 67, 205, 172, 205, - 209, 205, 186, 186, 186, 43, 206, 206, 345, 206, - 186, 186, 206, 907, 186, 186, 1057, 186, 355, 186, - 206, 186, 185, 162, 162, 205, 205, 162, 365, 186, - 186, 186, 205, 186, 186, 205, 1077, 205, 1057, 205, - 1256, 21, 22, 162, 206, 115, 116, 117, 118, 119, - 387, 205, 122, 123, 124, 125, 206, 127, 128, 129, - 130, 131, 162, 133, 134, 12, 162, 162, 162, 162, - 43, 33, 206, 205, 968, 969, 970, 205, 186, 973, - 205, 205, 205, 205, 205, 422, 423, 205, 186, 172, - 162, 206, 205, 205, 186, 205, 205, 172, 53, 1140, - 206, 1142, 439, 440, 441, 442, 443, 444, 171, 178, - 172, 610, 1006, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 206, 1142, 204, 206, 76, 1, 206, 206, - 206, 204, 202, 203, 42, 115, 116, 117, 118, 119, - 129, 206, 122, 123, 124, 125, 206, 127, 128, 129, - 130, 131, 206, 133, 134, 205, 80, 206, 206, 139, - 497, 1405, 1252, 1057, 99, 1252, 213, 1252, 1252, 21, - 22, 1252, 1, 1225, 464, 1180, 513, 1183, 1264, 1082, - 51, 755, 1265, 1077, 517, 1332, 963, -1, 525, -1, - -1, 528, -1, -1, 405, 405, 1237, 534, -1, 536, - -1, -1, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, -1, -1, -1, 1256, -1, -1, 1237, -1, - -1, -1, 202, 203, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 570, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1140, -1, 1142, -1, - -1, -1, 589, 590, -1, -1, 593, -1, -1, -1, - -1, -1, -1, 115, 116, 117, 118, 604, 605, 606, - 607, 608, 609, 125, -1, 127, 128, 129, 130, 131, - -1, 133, 134, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 634, 635, -1, - -1, 638, 639, 640, 641, -1, 643, -1, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, -1, 666, - -1, -1, -1, -1, -1, 187, 188, 189, 190, 191, - -1, -1, -1, 1237, -1, -1, -1, -1, -1, -1, - 202, 203, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1256, -1, -1, -1, -1, -1, -1, 706, - -1, 708, -1, -1, 711, -1, 713, -1, -1, -1, - -1, -1, -1, 720, -1, -1, -1, -1, 725, -1, - -1, -1, -1, -1, -1, 1289, -1, -1, -1, 736, - 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, - 747, 748, 749, 750, 751, 752, 753, 754, -1, -1, - -1, -1, -1, -1, 761, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 773, -1, -1, 19, - -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, - -1, 31, 1346, -1, -1, -1, -1, -1, -1, -1, - -1, 41, -1, -1, 801, -1, -1, 804, 805, 49, - -1, -1, 809, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 64, -1, -1, -1, -1, 826, - -1, 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, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 870, -1, -1, -1, 874, 19, -1, - -1, -1, 21, 22, 25, -1, -1, -1, -1, -1, - 31, -1, -1, -1, -1, -1, -1, -1, 138, 896, - 41, -1, -1, -1, -1, 902, -1, -1, 49, -1, - -1, 151, 909, -1, -1, -1, -1, -1, -1, 916, - -1, -1, 162, 64, -1, 922, -1, -1, -1, -1, - 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, -1, -1, -1, -1, 207, -1, 209, - -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, - 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, - 129, 130, 131, -1, 133, 134, -1, 138, -1, -1, - 139, 140, 141, -1, -1, -1, 145, 1004, 1005, -1, - 151, 1008, 1009, 1010, -1, 1012, -1, -1, -1, -1, - -1, 162, -1, -1, 1021, -1, 1023, -1, 1025, -1, - -1, 172, -1, -1, 1031, -1, -1, -1, 1035, -1, - -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, -1, -1, -1, 19, -1, -1, -1, - -1, -1, 25, 202, 203, -1, 207, 206, 31, -1, - -1, -1, 1069, -1, -1, 1072, -1, -1, 41, -1, - -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, + 14, 15, 630, 165, 530, 569, 368, 708, 775, 480, + 152, 482, 538, 484, 165, 679, 485, 681, 632, 683, + 78, 810, 565, 933, 486, 5, 8, 20, 0, 446, + 447, 33, 615, 395, 22, 7, 21, 22, 440, 125, + 372, 624, 128, 129, 458, 1213, 60, 61, 62, 20, + 834, 150, 46, 20, 20, 147, 15, 16, 30, 162, + 32, 822, 34, 1336, 162, 170, 126, 137, 40, 57, + 162, 150, 19, 20, 181, 618, 172, 184, 50, 1302, + 1300, 128, 129, 626, 56, 628, 100, 101, 102, 103, + 128, 129, 155, 191, 5, 6, 139, 140, 141, 1372, + 170, 126, 207, 208, 207, 33, 153, 132, 80, 208, + 1278, 1279, 106, 205, 25, 162, 202, 203, 178, 179, + 31, 181, 102, 103, 184, 126, 1294, 206, 711, 208, + 102, 103, 117, 118, 170, 1358, 1356, 7, 15, 16, + 125, 153, 127, 128, 129, 130, 131, 47, 691, 207, + 162, 165, 138, 567, 179, 202, 203, 68, 69, 184, + 138, 21, 22, 206, 202, 203, 57, 67, 172, 205, + 62, 126, 63, 590, 506, 1343, 1344, 132, 179, 511, + 50, 182, 184, 600, 162, 178, 603, 34, 172, 171, + 592, 102, 103, 205, 822, 181, 155, 825, 21, 22, + 172, 160, 190, 162, 163, 185, 368, 178, 969, 371, + 994, 178, 178, 630, 202, 162, 63, 202, 203, 191, + 634, 203, 206, 385, 179, 205, 170, 138, 178, 591, + 813, 203, 178, 395, 385, 153, 398, 399, 400, 178, + 783, 255, 785, 605, 162, 577, 205, 398, 399, 400, + 793, 162, 178, 796, 204, 672, 184, 117, 118, 170, + 206, 205, 178, 178, 178, 125, 179, 206, 128, 129, + 130, 131, 178, 153, 185, 203, 1186, 181, 155, 337, + 206, 209, 162, 160, 131, 162, 163, 126, 206, 204, + 206, 138, 203, 132, 117, 118, 5, 6, 185, 8, + 206, 162, 125, 178, 127, 128, 129, 130, 131, 33, + 178, 178, 926, 475, 476, 162, 126, 479, 205, 481, + 178, 483, 132, 485, 475, 476, 206, 36, 479, 126, + 481, 206, 483, 172, 178, 132, 60, 61, 206, 206, + 179, 969, 202, 203, 126, 126, 204, 172, 195, 178, + 132, 132, 138, 685, 368, 687, 138, 371, 205, 178, + 831, 178, 172, 1027, 187, 188, 189, 190, 191, 179, + 126, 385, 1073, 178, 1340, 389, 132, 206, 162, 202, + 203, 395, 179, 1349, 398, 399, 400, 206, 162, 206, + 162, 405, 406, 919, 21, 22, 126, 179, 179, 123, + 172, 206, 132, 127, 147, 1172, 178, 162, 825, 771, + 772, 57, 162, 181, 1380, 1381, 181, 63, 186, 162, + 782, 186, 205, 179, 185, 787, 788, 896, 790, 591, + 792, 1220, 794, 795, 181, 797, 898, 205, 155, 186, + 205, 1142, 181, 605, 205, 57, 182, 186, 138, 179, + 186, 63, 784, 60, 61, 62, 180, 147, 205, 138, + 184, 475, 476, 187, 185, 479, 205, 481, 147, 483, + 1134, 485, 162, 152, 636, 637, 57, 185, 172, 203, + 164, 165, 63, 162, 205, 209, 1150, 185, 202, 651, + 117, 118, 186, 100, 101, 102, 103, 205, 125, 12, + 127, 128, 129, 130, 131, 75, 185, 205, 172, 79, + 23, 24, 1140, 178, 178, 57, 181, 162, 1285, 184, + 162, 63, 186, 93, 94, 1089, 1227, 689, 98, 99, + 100, 101, 162, 153, 172, 172, 698, 153, 689, 701, + 178, 178, 162, 1014, 153, 182, 162, 698, 186, 1075, + 701, 172, 1078, 162, 172, 1081, 164, 178, 1029, 162, + 178, 153, 189, 190, 191, 186, 172, 899, 186, 153, + 162, 162, 178, 57, 179, 202, 203, 591, 162, 63, + 186, 178, 172, 57, 181, 1002, 57, 184, 178, 1006, + 172, 605, 63, 182, 172, 172, 178, 186, 170, 1125, + 178, 178, 182, 182, 164, 165, 186, 186, 770, 771, + 772, 773, 974, 975, 976, 629, 778, 1034, 980, 770, + 782, 763, 773, 1149, 1188, 787, 788, 778, 790, 1046, + 792, 164, 794, 795, 182, 797, 182, 182, 186, 971, + 186, 186, 182, 182, 182, 182, 186, 186, 186, 186, + 170, 1013, 164, 165, 166, 167, 139, 140, 141, 1076, + 139, 1362, 141, 170, 1207, 181, 139, 1295, 164, 165, + 166, 10, 11, 12, 106, 689, 208, 35, 35, 205, + 170, 170, 162, 208, 698, 162, 185, 701, 185, 204, + 21, 22, 185, 185, 205, 205, 205, 185, 185, 185, + 185, 863, 162, 185, 185, 1269, 182, 185, 162, 1126, + 162, 162, 22, 1130, 162, 181, 1242, 1345, 181, 162, + 170, 178, 162, 1140, 132, 162, 1088, 21, 22, 204, + 185, 203, 1258, 1259, 896, 205, 162, 205, 185, 185, + 185, 185, 203, 205, 185, 1373, 205, 185, 206, 185, + 185, 913, 205, 162, 171, 162, 770, 771, 772, 773, + 162, 181, 913, 205, 778, 171, 205, 1331, 782, 162, + 155, 205, 205, 787, 788, 205, 790, 208, 792, 204, + 794, 795, 205, 797, 115, 116, 117, 118, 119, 1151, + 205, 122, 1420, 205, 125, 205, 127, 128, 129, 130, + 131, 205, 133, 134, 172, 1348, 37, 172, 172, 205, + 10, 172, 974, 975, 976, 66, 172, 172, 980, 172, + 172, 115, 116, 117, 118, 119, 172, 172, 122, 123, + 124, 125, 1375, 127, 128, 129, 130, 131, 179, 133, + 134, 178, 186, 205, 178, 139, 140, 141, 13, 185, + 185, 1013, 185, 178, 185, 186, 187, 188, 189, 190, + 191, 4, 205, 162, 171, 205, 208, 43, 206, 14, + 1396, 202, 203, 179, 1400, 1292, 181, 155, 170, 205, + 8, 70, 896, 162, 186, 171, 180, 35, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 206, 913, + 204, 178, 205, 185, 205, 205, 1268, 1069, 202, 203, + 206, 185, 205, 1, 21, 22, 205, 205, 1069, 162, + 205, 205, 205, 71, 205, 73, 1088, 75, 76, 77, + 78, 79, 186, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 186, 93, 94, 95, 186, 162, + 98, 99, 100, 101, 162, 205, 43, 162, 67, 171, + 974, 975, 976, 172, 345, 186, 980, 186, 186, 117, + 118, 206, 206, 205, 355, 186, 206, 206, 206, 186, + 186, 205, 186, 186, 365, 186, 206, 186, 185, 1151, + 205, 1153, 43, 162, 162, 205, 162, 12, 186, 1013, + 162, 186, 1153, 205, 186, 186, 387, 205, 115, 116, + 117, 118, 119, 206, 162, 122, 123, 124, 125, 205, + 127, 128, 129, 130, 131, 186, 133, 134, 206, 162, + 205, 162, 139, 140, 141, 162, 162, 162, 145, 43, + 33, 205, 423, 424, 186, 205, 205, 186, 206, 205, + 205, 205, 205, 205, 186, 1069, 206, 172, 162, 440, + 441, 442, 443, 444, 445, 205, 172, 205, 205, 205, + 53, 206, 206, 180, 1088, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 206, 206, 1249, 171, 178, + 204, 172, 614, 206, 206, 202, 203, 205, 1249, 206, + 77, 206, 1, 206, 206, 204, 1268, 42, 206, 206, + 129, 80, 1416, 213, 1264, 99, 1288, 498, 1264, 1264, + 1264, 1264, 1, 1237, 1191, 1194, 520, 1276, 1093, 1277, + 51, 759, 405, 465, 405, 516, 1345, 1151, -1, 1153, + -1, -1, -1, 21, 22, -1, -1, 528, -1, -1, + 531, -1, -1, -1, -1, -1, 537, -1, 539, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 64, -1, -1, -1, -1, -1, 1104, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1148, -1, 1150, -1, -1, -1, -1, 1155, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1165, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, 1178, -1, -1, -1, -1, -1, -1, 151, -1, - -1, -1, 1189, -1, -1, -1, -1, -1, -1, 162, - 1197, 1198, 1199, -1, -1, -1, -1, 1204, -1, -1, - -1, 1208, 1209, -1, -1, -1, -1, -1, -1, -1, - -1, 1218, 1219, 1220, -1, -1, -1, -1, -1, -1, - 1227, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1252, -1, -1, -1, -1, - -1, -1, -1, 1260, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1274, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1288, -1, -1, 1291, 1292, -1, -1, -1, -1, - -1, 1298, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1310, -1, -1, -1, -1, -1, -1, - -1, -1, 1319, -1, -1, -1, -1, -1, -1, -1, - -1, 1328, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, 5, 6, 7, -1, 9, 10, 11, -1, - 13, -1, 15, 16, 17, 18, 19, -1, -1, 1356, - -1, -1, 25, 26, 27, 28, 29, -1, 31, -1, - -1, -1, -1, -1, -1, 38, 39, -1, 1375, 42, - -1, 44, 45, 1380, 1381, 48, -1, 50, 51, 52, - -1, 54, 55, -1, -1, 58, 59, -1, -1, -1, - -1, -1, 65, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, 171, 172, + -1, -1, 573, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, -1, -1, -1, -1, - 203, -1, 205, 1, 207, 208, -1, 5, 6, 7, - -1, 9, 10, 11, -1, 13, -1, 15, 16, 17, - 18, 19, -1, -1, -1, -1, -1, 25, 26, 27, - 28, 29, -1, 31, -1, -1, -1, -1, -1, -1, - 38, 39, -1, -1, 42, -1, 44, 45, -1, -1, - 48, -1, 50, 51, 52, -1, 54, 55, -1, -1, - 58, 59, -1, -1, -1, -1, -1, 65, -1, -1, - 68, 69, -1, 71, 72, 73, -1, 75, 76, 77, + -1, 592, 593, -1, -1, 596, -1, 598, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 608, 609, 610, + 611, 612, 613, -1, -1, 1249, -1, 115, 116, 117, + 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, + 128, 129, 130, 131, 1268, 133, 134, 638, 639, -1, + -1, 642, 643, 644, 645, -1, 647, -1, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 1302, 670, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, -1, -1, -1, 710, + -1, 712, -1, -1, 715, -1, 717, -1, -1, -1, + -1, -1, -1, 724, 1358, -1, -1, -1, 729, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, -1, -1, + -1, -1, -1, -1, 765, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 777, -1, -1, -1, + 19, -1, -1, -1, -1, -1, 25, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 41, -1, -1, 806, -1, -1, 809, 810, + 49, -1, -1, 814, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, + -1, 832, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 876, -1, -1, -1, 880, + 19, -1, -1, -1, -1, -1, 25, -1, 21, 22, + -1, -1, 31, -1, -1, -1, -1, -1, -1, 138, + -1, -1, 41, -1, -1, -1, -1, 908, -1, -1, + 49, -1, 151, -1, 915, -1, -1, -1, -1, -1, + -1, 922, -1, 162, -1, 64, -1, 928, -1, -1, + -1, -1, 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, -1, -1, -1, 207, -1, + 209, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, + 123, 124, 125, -1, 127, 128, 129, 130, 131, 138, + 133, 134, -1, -1, -1, -1, -1, -1, -1, -1, + 1011, 1012, 151, -1, -1, -1, -1, 1018, 1019, 1020, + -1, 1022, -1, 162, -1, -1, -1, -1, -1, -1, + 1031, -1, 1033, 172, 1035, -1, -1, -1, -1, 178, + 1041, -1, -1, -1, 1045, -1, -1, -1, -1, -1, + -1, 1052, 185, 186, 187, 188, 189, 190, 191, -1, + -1, 19, -1, -1, -1, -1, -1, 25, 207, 202, + 203, -1, -1, 31, 115, 116, 117, 118, -1, 1080, + -1, -1, 1083, 41, 125, -1, 127, 128, 129, 130, + 131, 49, 133, 134, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, + -1, -1, 1113, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, - 98, 99, 100, 101, 102, 103, 104, 105, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, - 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 187, 188, 189, 190, + 191, -1, -1, -1, -1, -1, -1, -1, 1159, -1, + 1161, 202, 203, -1, -1, 1166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1176, -1, -1, -1, -1, + 138, -1, -1, -1, -1, -1, -1, -1, 1189, -1, + -1, -1, -1, 151, -1, -1, -1, -1, 1199, -1, + -1, -1, -1, -1, 162, -1, -1, -1, 1209, 1210, + 1211, -1, -1, -1, -1, 1216, -1, -1, -1, 1220, + 1221, -1, -1, -1, -1, -1, -1, -1, -1, 1230, + 1231, 1232, -1, -1, -1, -1, -1, -1, 1239, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 138, -1, -1, -1, -1, -1, -1, -1, 146, 147, - 148, 149, 150, -1, 152, -1, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, -1, -1, -1, -1, - -1, -1, 170, 171, 172, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 187, - 188, 189, -1, 191, -1, -1, 194, 195, -1, -1, - -1, -1, -1, -1, -1, 203, -1, 205, 1, 207, - 208, -1, 5, 6, 7, -1, 9, 10, 11, -1, - 13, -1, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, 26, 27, 28, 29, -1, 31, -1, - -1, -1, -1, -1, -1, 38, 39, -1, -1, 42, - -1, 44, 45, -1, -1, 48, -1, 50, 51, 52, - -1, 54, 55, -1, -1, 58, 59, -1, -1, -1, - -1, -1, 65, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, + -1, -1, -1, 1264, -1, -1, -1, -1, -1, -1, + -1, 1272, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1288, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1301, -1, -1, 1304, 1305, -1, -1, -1, -1, -1, + 1311, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1323, -1, -1, -1, -1, -1, -1, -1, + -1, 1332, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1342, -1, -1, -1, -1, -1, 1, -1, -1, + -1, 5, 6, 7, -1, 9, 10, 11, -1, 13, + -1, 15, 16, 17, 18, 19, -1, 1368, -1, -1, + -1, 25, 26, 27, 28, 29, -1, 31, -1, -1, + -1, -1, -1, -1, 38, 39, -1, 1388, 42, -1, + 44, 45, 1393, 1394, 48, -1, 50, 51, 52, -1, + 54, 55, -1, -1, 58, 59, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, 105, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, 171, 172, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, 171, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, 5, 6, -1, -1, - 203, -1, 205, -1, 207, 208, 15, 16, 17, 18, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, -1, -1, -1, -1, 203, + -1, 205, 1, 207, 208, -1, 5, 6, 7, -1, + 9, 10, 11, -1, 13, -1, 15, 16, 17, 18, 19, -1, -1, -1, -1, -1, 25, 26, 27, 28, - -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, - -1, -1, 51, 52, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + 29, -1, 31, -1, -1, -1, -1, -1, -1, 38, + 39, -1, -1, 42, -1, 44, 45, -1, -1, 48, + -1, 50, 51, 52, -1, 54, 55, -1, -1, 58, + 59, -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, @@ -2938,750 +2916,738 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, -1, -1, -1, - -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 170, 171, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, 194, 195, -1, -1, -1, - -1, -1, 5, 6, 203, -1, 205, -1, 207, 208, - 13, -1, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, - -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 45, -1, -1, 48, 49, -1, 51, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, -1, -1, 5, 6, - 203, -1, 205, -1, 207, 208, 13, -1, 15, 16, - 17, 18, 19, -1, -1, -1, -1, -1, 25, -1, - 27, -1, -1, -1, 31, -1, -1, -1, -1, -1, - -1, -1, 39, -1, -1, -1, -1, -1, 45, -1, - -1, 48, 49, -1, 51, -1, -1, -1, 55, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 68, 69, -1, 71, 72, 73, -1, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, - -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 138, -1, -1, -1, -1, -1, -1, -1, 146, - 147, 148, 149, 150, -1, 152, -1, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, -1, -1, - -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 187, 188, 189, -1, 191, -1, -1, 194, 195, -1, - -1, -1, 5, 6, -1, -1, 203, -1, 205, -1, - 207, 208, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, - -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 45, -1, -1, 48, -1, -1, 51, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, + -1, -1, -1, -1, 203, -1, 205, 1, 207, 208, + -1, 5, 6, 7, -1, 9, 10, 11, -1, 13, + -1, 15, 16, 17, 18, 19, -1, -1, -1, -1, + -1, 25, 26, 27, 28, 29, -1, 31, -1, -1, + -1, -1, -1, -1, 38, 39, -1, -1, 42, -1, + 44, 45, -1, -1, 48, -1, 50, 51, 52, -1, + 54, 55, -1, -1, 58, 59, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, 105, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, 171, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, 5, 6, -1, -1, - 203, -1, 205, 206, 207, 208, 15, 16, 17, 18, - 19, -1, -1, -1, -1, -1, 25, -1, 27, -1, - -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, - -1, -1, 51, -1, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, - 69, -1, 71, 72, 73, -1, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, - 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, - -1, -1, -1, -1, -1, -1, -1, 146, 147, 148, - 149, 150, -1, 152, -1, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, -1, -1, -1, -1, - -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, - 189, -1, 191, -1, -1, 194, 195, -1, -1, -1, - -1, -1, 5, 6, 203, 204, 205, -1, 207, 208, - 13, -1, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, - -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 45, -1, -1, 48, -1, -1, 51, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, 5, 6, -1, -1, 203, + -1, 205, -1, 207, 208, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 25, 26, 27, 28, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, 51, 52, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, 105, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, 5, + 6, -1, -1, 203, -1, 205, -1, 207, 208, 15, + 16, 17, 18, 19, -1, -1, -1, -1, -1, 25, + -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, 51, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, + -1, -1, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, -1, 93, 94, 95, + -1, -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, 5, 6, -1, -1, - 203, -1, 205, -1, 207, 208, 15, 16, 17, 18, - 19, -1, -1, -1, -1, -1, 25, -1, 27, -1, - -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, - -1, -1, 51, -1, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, - 69, -1, 71, 72, 73, -1, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, - 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, + -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, - -1, -1, -1, -1, -1, -1, -1, 146, 147, 148, - 149, 150, -1, 152, -1, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, -1, -1, -1, -1, - -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, - 189, -1, 191, -1, -1, 194, 195, -1, -1, -1, - 5, 6, -1, -1, 203, 204, 205, -1, 207, 208, - 15, 16, 17, 18, 19, -1, -1, -1, -1, -1, - 25, -1, 27, -1, -1, -1, 31, -1, -1, -1, - -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - 45, -1, -1, 48, -1, -1, 51, -1, -1, -1, - 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 68, 69, -1, 71, 72, 73, -1, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, -1, 93, 94, - 95, -1, -1, 98, 99, 100, 101, 102, 103, 104, + -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, + 146, 147, 148, 149, 150, -1, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, + -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, - -1, 126, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, - -1, 146, 147, 148, 149, 150, -1, 152, -1, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, + -1, 187, 188, 189, -1, 191, -1, -1, 194, 195, + -1, -1, -1, -1, -1, 5, 6, 203, -1, 205, + 206, 207, 208, 13, -1, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 25, -1, 27, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, 49, + -1, 51, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 187, 188, 189, -1, 191, -1, -1, 194, - 195, -1, -1, -1, 5, 6, -1, -1, 203, -1, - 205, -1, 207, 208, 15, 16, 17, 18, 19, -1, - -1, -1, -1, -1, 25, -1, 27, -1, -1, -1, - 31, -1, -1, -1, -1, -1, -1, -1, 39, -1, - -1, -1, -1, -1, 45, -1, -1, 48, -1, -1, - 51, -1, -1, -1, 55, -1, -1, -1, -1, -1, - 61, -1, -1, -1, -1, -1, -1, 68, 69, -1, - 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, -1, 93, 94, 95, -1, -1, 98, 99, 100, - 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, -1, + -1, 5, 6, 203, -1, 205, -1, 207, 208, 13, + -1, 15, 16, 17, 18, 19, -1, -1, -1, -1, + -1, 25, -1, 27, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, 49, -1, 51, -1, -1, + -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 138, -1, -1, - -1, -1, -1, -1, -1, 146, 147, 148, 149, 150, - -1, 152, -1, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, -1, -1, -1, -1, -1, 170, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 187, 188, 189, -1, - 191, -1, -1, 194, 195, -1, -1, -1, 5, 6, - -1, -1, 203, -1, 205, -1, 207, 208, 15, 16, - 17, 18, 19, -1, -1, -1, -1, -1, 25, -1, - 27, -1, -1, -1, 31, -1, -1, -1, -1, -1, - -1, -1, 39, -1, -1, -1, -1, -1, 45, -1, - -1, 48, -1, -1, 51, -1, -1, -1, 55, -1, - -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 68, 69, -1, 71, 72, 73, -1, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, - -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, 5, 6, -1, -1, 203, + -1, 205, -1, 207, 208, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 25, -1, 27, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, 51, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, -1, + -1, 5, 6, 203, 204, 205, -1, 207, 208, 13, + -1, 15, 16, 17, 18, 19, -1, -1, -1, -1, + -1, 25, -1, 27, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, 51, -1, -1, + -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 138, -1, -1, -1, -1, -1, -1, -1, 146, - 147, 148, 149, 150, -1, 152, -1, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, -1, -1, - -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 187, 188, 189, -1, 191, -1, -1, 194, 195, -1, - -1, -1, 5, 6, -1, -1, 203, -1, 205, -1, - 207, 208, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, - -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 45, -1, -1, 48, -1, -1, 51, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, - -1, -1, -1, 126, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, 5, 6, -1, -1, 203, + -1, 205, -1, 207, 208, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 25, -1, 27, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, 51, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, 5, 6, -1, -1, - 203, -1, 205, -1, 207, 208, 15, 16, 17, 18, - 19, -1, -1, 22, -1, -1, 25, -1, 27, -1, - -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, - -1, -1, 51, -1, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, - 69, -1, 71, 72, 73, -1, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, - 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, 5, + 6, -1, -1, 203, 204, 205, -1, 207, 208, 15, + 16, 17, 18, 19, -1, -1, -1, -1, -1, 25, + -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, 51, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, + -1, -1, 68, 69, -1, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, -1, 93, 94, 95, + -1, -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, - -1, -1, -1, -1, -1, -1, -1, 146, 147, 148, - 149, 150, -1, 152, -1, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, -1, -1, -1, -1, - -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, - 189, -1, 191, -1, -1, 194, 195, -1, -1, -1, - 5, 6, -1, -1, 203, -1, 205, -1, 207, 208, - 15, 16, 17, 18, 19, -1, -1, -1, -1, -1, - 25, -1, 27, -1, -1, -1, 31, -1, -1, -1, - -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - 45, -1, -1, 48, -1, -1, 51, -1, -1, -1, - 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 68, 69, -1, 71, 72, 73, -1, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, -1, 93, 94, - 95, -1, -1, 98, 99, 100, 101, 102, 103, 104, + -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, + 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, + 146, 147, 148, 149, 150, -1, 152, -1, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, + -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, + -1, 187, 188, 189, -1, 191, -1, -1, 194, 195, + -1, -1, -1, 5, 6, -1, -1, 203, -1, 205, + -1, 207, 208, 15, 16, 17, 18, 19, -1, -1, + -1, -1, -1, 25, -1, 27, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, + -1, -1, -1, 45, -1, -1, 48, -1, -1, 51, + -1, -1, -1, 55, -1, -1, -1, -1, -1, 61, + -1, -1, -1, 65, -1, -1, 68, 69, -1, 71, + 72, 73, -1, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + -1, 93, 94, 95, -1, -1, 98, 99, 100, 101, + 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, - -1, 146, 147, 148, 149, 150, -1, 152, -1, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 138, -1, -1, -1, + -1, -1, -1, -1, 146, 147, 148, 149, 150, -1, + 152, -1, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 187, 188, 189, -1, 191, -1, -1, 194, - 195, -1, -1, -1, 5, 6, -1, -1, 203, -1, - 205, 206, 207, 208, 15, 16, 17, 18, 19, -1, - -1, -1, -1, -1, 25, -1, 27, -1, -1, -1, - 31, -1, -1, -1, -1, -1, -1, -1, 39, -1, - -1, -1, -1, -1, 45, -1, -1, 48, -1, -1, - 51, -1, -1, -1, 55, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, - 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, -1, 93, 94, 95, -1, -1, 98, 99, 100, - 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, + -1, -1, -1, -1, -1, 187, 188, 189, -1, 191, + -1, -1, 194, 195, -1, -1, -1, 5, 6, -1, + -1, 203, -1, 205, -1, 207, 208, 15, 16, 17, + 18, 19, -1, -1, -1, -1, -1, 25, -1, 27, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, 39, -1, -1, -1, -1, -1, 45, -1, -1, + 48, -1, -1, 51, -1, -1, -1, 55, -1, -1, + 58, -1, -1, -1, -1, -1, -1, 65, -1, -1, + 68, 69, -1, 71, 72, 73, -1, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, + 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, + 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 138, -1, -1, - -1, -1, -1, -1, -1, 146, 147, 148, 149, 150, - -1, 152, -1, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, -1, -1, -1, -1, -1, 170, + 138, -1, -1, -1, -1, -1, -1, -1, 146, 147, + 148, 149, 150, -1, 152, -1, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, -1, -1, -1, -1, + -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 187, + 188, 189, -1, 191, -1, -1, 194, 195, -1, -1, + -1, 5, 6, -1, -1, 203, -1, 205, -1, 207, + 208, 15, 16, 17, 18, 19, -1, -1, -1, -1, + -1, 25, -1, 27, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, 51, -1, -1, + -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, + -1, -1, 126, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 187, 188, 189, -1, - 191, -1, -1, 194, 195, -1, -1, -1, 5, 6, - -1, -1, 203, -1, 205, 206, 207, 208, 15, 16, - 17, 18, 19, -1, -1, -1, -1, -1, 25, -1, - 27, -1, -1, -1, 31, -1, -1, -1, -1, -1, - -1, -1, 39, -1, -1, -1, -1, -1, 45, -1, - -1, 48, -1, -1, 51, -1, -1, -1, 55, -1, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, 5, 6, -1, -1, 203, + -1, 205, -1, 207, 208, 15, 16, 17, 18, 19, + -1, -1, 22, -1, -1, 25, -1, 27, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, 51, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 68, 69, -1, 71, 72, 73, -1, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, - -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, 5, + 6, -1, -1, 203, -1, 205, -1, 207, 208, 15, + 16, 17, 18, 19, -1, -1, -1, -1, -1, 25, + -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, 51, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, + -1, -1, 68, 69, -1, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, -1, 93, 94, 95, + -1, -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 138, -1, -1, -1, -1, -1, -1, -1, 146, - 147, 148, 149, 150, -1, 152, -1, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, -1, -1, - -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, + -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, + 146, 147, 148, 149, 150, -1, 152, -1, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, + -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 187, 188, 189, -1, 191, -1, -1, 194, 195, -1, - -1, -1, 5, 6, -1, -1, 203, -1, 205, 206, - 207, 208, 15, 16, 17, 18, 19, -1, -1, -1, - -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, - -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 45, -1, -1, 48, -1, -1, 51, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68, 69, -1, 71, 72, - 73, -1, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, - 93, 94, 95, -1, -1, 98, 99, 100, 101, 102, - 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, + -1, 187, 188, 189, -1, 191, -1, -1, 194, 195, + -1, -1, -1, 5, 6, -1, -1, 203, -1, 205, + 206, 207, 208, 15, 16, 17, 18, 19, -1, -1, + -1, -1, -1, 25, -1, 27, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, + -1, -1, -1, 45, -1, -1, 48, -1, -1, 51, + -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 65, -1, -1, 68, 69, -1, 71, + 72, 73, -1, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + -1, 93, 94, 95, -1, -1, 98, 99, 100, 101, + 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, - -1, -1, -1, 146, 147, 148, 149, 150, -1, 152, - -1, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, + -1, -1, -1, -1, -1, -1, 138, -1, -1, -1, + -1, -1, -1, -1, 146, 147, 148, 149, 150, -1, + 152, -1, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 187, 188, 189, -1, 191, -1, - -1, 194, 195, -1, -1, -1, 5, 6, -1, -1, - 203, -1, 205, 206, 207, 208, 15, 16, 17, 18, - 19, -1, -1, -1, -1, -1, 25, -1, 27, -1, - -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, - -1, -1, 51, -1, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, - 69, -1, 71, 72, 73, -1, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, - 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, + -1, -1, -1, -1, -1, 187, 188, 189, -1, 191, + -1, -1, 194, 195, -1, -1, -1, 5, 6, -1, + -1, 203, -1, 205, 206, 207, 208, 15, 16, 17, + 18, 19, -1, -1, -1, -1, -1, 25, -1, 27, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, 39, -1, -1, -1, -1, -1, 45, -1, -1, + 48, -1, -1, 51, -1, -1, -1, 55, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, -1, -1, + 68, 69, -1, 71, 72, 73, -1, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, + 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, + 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, - -1, -1, -1, -1, -1, -1, -1, 146, 147, 148, - 149, 150, -1, 152, -1, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, -1, -1, -1, -1, - -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, - 189, -1, 191, -1, -1, 194, 195, -1, -1, -1, - 5, 6, -1, -1, 203, -1, 205, 206, 207, 208, - 15, 16, 17, 18, 19, -1, -1, -1, -1, -1, - 25, -1, 27, -1, -1, -1, 31, -1, -1, -1, - -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - 45, -1, -1, 48, -1, -1, 51, -1, -1, -1, - 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 68, 69, -1, 71, 72, 73, -1, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, -1, 93, 94, - 95, -1, -1, 98, 99, 100, 101, 102, 103, 104, + 138, -1, -1, -1, -1, -1, -1, -1, 146, 147, + 148, 149, 150, -1, 152, -1, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, -1, -1, -1, -1, + -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 187, + 188, 189, -1, 191, -1, -1, 194, 195, -1, -1, + -1, 5, 6, -1, -1, 203, -1, 205, 206, 207, + 208, 15, 16, 17, 18, 19, -1, -1, -1, -1, + -1, 25, -1, 27, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, 51, -1, -1, + -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, -1, 93, + 94, 95, -1, -1, 98, 99, 100, 101, 102, 103, + 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, - -1, 126, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, - -1, 146, 147, 148, 149, 150, -1, 152, -1, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, + -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, + -1, -1, 146, 147, 148, 149, 150, -1, 152, -1, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 187, 188, 189, -1, 191, -1, -1, 194, - 195, -1, -1, -1, 5, 6, -1, -1, 203, -1, - 205, -1, 207, 208, 15, 16, 17, 18, 19, -1, - -1, -1, -1, -1, 25, -1, 27, -1, -1, -1, - 31, -1, -1, -1, -1, -1, -1, -1, 39, -1, - -1, -1, -1, -1, 45, -1, -1, 48, -1, -1, - 51, -1, -1, -1, 55, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, - 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, -1, 93, 94, 95, -1, -1, 98, 99, 100, - 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, + -1, -1, -1, 187, 188, 189, -1, 191, -1, -1, + 194, 195, -1, -1, -1, 5, 6, -1, -1, 203, + -1, 205, 206, 207, 208, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 25, -1, 27, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, 51, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 65, -1, -1, 68, 69, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 138, -1, -1, - -1, -1, -1, -1, -1, 146, 147, 148, 149, 150, - -1, 152, -1, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, -1, -1, -1, -1, -1, 170, + -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, -1, -1, 146, 147, 148, 149, + 150, -1, 152, -1, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, -1, -1, -1, -1, -1, -1, + 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 187, 188, 189, + -1, 191, -1, -1, 194, 195, -1, -1, -1, 5, + 6, -1, -1, 203, -1, 205, 206, 207, 208, 15, + 16, 17, 18, 19, -1, -1, -1, -1, -1, 25, + -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, 51, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, + -1, -1, 68, 69, -1, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, -1, 93, 94, 95, + -1, -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 187, 188, 189, -1, - 191, -1, -1, 194, 195, -1, -1, -1, 5, 6, - -1, -1, 203, -1, 205, -1, 207, 208, 15, 16, - 17, 18, 19, -1, -1, -1, -1, -1, 25, -1, - 27, -1, -1, -1, 31, -1, -1, -1, -1, -1, - -1, -1, 39, -1, -1, -1, -1, -1, 45, -1, - -1, 48, -1, -1, 51, -1, -1, -1, 55, -1, + -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, + 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, + 146, 147, 148, 149, 150, -1, 152, -1, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, + -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 68, 69, -1, 71, 72, 73, -1, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, - -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, + -1, 187, 188, 189, -1, 191, -1, -1, 194, 195, + -1, -1, -1, 5, 6, -1, -1, 203, -1, 205, + -1, 207, 208, 15, 16, 17, 18, 19, -1, -1, + -1, -1, -1, 25, -1, 27, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, + -1, -1, -1, 45, -1, -1, 48, -1, -1, 51, + -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 65, -1, -1, 68, 69, -1, 71, + 72, 73, -1, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + -1, 93, 94, 95, -1, -1, 98, 99, 100, 101, + 102, 103, 104, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 138, -1, -1, -1, + -1, -1, -1, -1, 146, 147, 148, 149, 150, -1, + 152, -1, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 138, -1, -1, -1, -1, -1, -1, -1, 146, - 147, 148, 149, 150, -1, 152, -1, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 21, 22, -1, - -1, 19, -1, 170, -1, -1, -1, 25, -1, -1, + -1, -1, -1, -1, -1, 187, 188, 189, -1, 191, + -1, -1, 194, 195, -1, -1, -1, 5, 6, -1, + -1, 203, -1, 205, -1, 207, 208, 15, 16, 17, + 18, 19, -1, -1, -1, -1, -1, 25, -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, - 187, 188, 189, 41, 191, -1, -1, 194, 195, -1, - -1, 49, -1, 21, 22, -1, 203, -1, 205, -1, - 207, 208, -1, -1, -1, -1, 64, -1, -1, -1, - -1, -1, -1, 71, 72, 73, 74, 75, 76, 77, + -1, 39, -1, -1, -1, -1, -1, 45, -1, -1, + 48, -1, -1, 51, -1, -1, -1, 55, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, -1, -1, + 68, 69, -1, 71, 72, 73, -1, 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, -1, -1, -1, -1, - -1, 115, 116, 117, 118, 119, -1, -1, 122, 123, - 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, - 138, 145, -1, -1, -1, 21, 22, 115, 116, 117, - 118, 119, -1, 151, 122, 123, 124, 125, -1, 127, - 128, 129, 130, 131, 162, 133, 134, -1, -1, -1, - -1, 139, 140, 141, -1, -1, 180, 145, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - -1, -1, 206, -1, -1, -1, -1, -1, -1, 207, - -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, 203, -1, -1, 206, 115, - 116, 117, 118, 119, 21, 22, 122, 123, 124, 125, - -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, - -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, - -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, + 98, 99, 100, 101, 102, 103, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, + 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, - 206, -1, -1, -1, -1, -1, -1, -1, 115, 116, - 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, + 138, -1, -1, -1, -1, -1, -1, -1, 146, 147, + 148, 149, 150, -1, 152, -1, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 21, 22, -1, -1, + 19, -1, 170, -1, -1, -1, 25, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, 187, + 188, 189, 41, 191, -1, -1, 194, 195, -1, -1, + 49, -1, 21, 22, -1, 203, -1, 205, -1, 207, + 208, -1, -1, -1, -1, 64, -1, -1, -1, -1, + -1, -1, 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, -1, -1, -1, -1, -1, + 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, + 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, + -1, -1, -1, -1, 139, 140, 141, -1, -1, 138, + 145, -1, -1, -1, 21, 22, 115, 116, 117, 118, + 119, -1, 151, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, 162, 133, 134, -1, -1, -1, -1, + 139, 140, 141, -1, -1, 180, 145, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, + -1, 206, -1, -1, -1, -1, -1, -1, 207, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, 203, -1, -1, 206, 115, 116, + 117, 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, - -1, -1, 139, 140, 141, -1, -1, -1, 145, 115, - 116, 117, 118, 119, 21, 22, 122, 123, 124, 125, - -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, - -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, + -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, + -1, -1, -1, -1, 21, 22, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, 206, - -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, - 206, -1, -1, -1, -1, -1, 21, 22, 115, 116, - 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, + -1, -1, -1, -1, -1, -1, -1, 115, 116, 117, + 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, + 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, + -1, 139, 140, 141, -1, -1, -1, 145, 115, 116, + 117, 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, - -1, -1, 139, 140, 141, -1, -1, -1, 145, 21, - 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, + -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, 206, - 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, - 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, - 145, 21, 22, 115, 116, 117, 118, 119, -1, -1, - 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, - -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, - -1, -1, -1, 145, -1, 180, -1, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, - -1, 206, -1, -1, -1, -1, -1, -1, 180, -1, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + -1, -1, -1, -1, -1, 21, 22, 115, 116, 117, + 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, + 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, + -1, 139, 140, 141, -1, -1, -1, 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 202, 203, -1, -1, 206, 115, 116, 117, 118, 119, - 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, - 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, - 140, 141, -1, -1, -1, 145, -1, -1, -1, -1, - -1, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, - -1, -1, -1, -1, 115, 116, 117, 118, 119, -1, - -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, + -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, -1, -1, 206, 115, + 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, + -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, + -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, + 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, + 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, + 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, + -1, -1, 145, -1, 180, -1, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, + 206, -1, -1, -1, -1, -1, -1, 180, -1, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, + 203, -1, -1, 206, 115, 116, 117, 118, 119, 21, + 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, 140, - 141, -1, -1, -1, 145, 115, 116, 117, 118, 119, - 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, - 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, - 140, 141, -1, -1, -1, 145, -1, -1, -1, 180, + 141, -1, -1, -1, 145, -1, -1, -1, -1, -1, + 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, -1, - 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, - -1, -1, 21, 22, 115, 116, 117, 118, 119, -1, - -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, + -1, -1, -1, 115, 116, 117, 118, 119, -1, -1, + 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, + -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, + -1, -1, -1, 145, 115, 116, 117, 118, 119, 21, + 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, 140, - 141, -1, -1, -1, 145, 21, 22, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 141, -1, -1, -1, 145, -1, -1, -1, 180, -1, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 202, 203, -1, -1, 206, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 202, 203, -1, -1, 206, 115, 116, 117, 118, - 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, - 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, - 139, 140, 141, -1, -1, -1, 145, 21, 22, 115, - 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, - -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, - -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, - -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, - -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, - 206, 115, 116, 117, 118, 119, 21, 22, 122, 123, - 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, - -1, 145, -1, -1, -1, -1, -1, 21, 22, -1, + -1, 202, 203, -1, -1, 206, -1, -1, -1, -1, + -1, 21, 22, 115, 116, 117, 118, 119, -1, -1, + 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, + -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, + -1, -1, -1, 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - -1, -1, 206, -1, -1, -1, -1, -1, -1, -1, - 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, - 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, - 145, 115, 116, 117, 118, 119, 21, 22, 122, 123, - 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, - -1, 145, -1, -1, -1, 180, -1, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, - -1, 206, -1, -1, -1, -1, 180, -1, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - -1, -1, 206, -1, -1, -1, -1, -1, 21, 22, - 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, - 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, - 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, - -1, 206, 115, 116, 117, 118, 119, -1, -1, 122, - 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, - -1, -1, 145, 21, 22, 115, 116, 117, 118, 119, + 202, 203, -1, -1, 206, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, - 140, 141, -1, -1, -1, 145, -1, 180, -1, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, - 203, -1, -1, 206, -1, -1, -1, -1, -1, -1, - 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 202, 203, -1, -1, 206, 115, 116, 117, - 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, - 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, - -1, 139, 140, 141, -1, -1, -1, 145, -1, -1, - -1, -1, -1, 21, 22, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, 203, -1, -1, 206, -1, - -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, - 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, - 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, - 139, 140, 141, -1, -1, -1, 145, 115, 116, 117, - 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, - 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, - -1, 139, 140, 141, -1, -1, -1, 145, -1, -1, - -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, - -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, 203, -1, -1, 206, -1, - -1, -1, -1, -1, 21, 22, 115, 116, 117, 118, - 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, - 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, - 139, 140, 141, -1, -1, -1, 145, 21, 22, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 202, 203, -1, -1, 206, 115, 116, + 140, 141, -1, -1, -1, 145, 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, - -1, -1, 139, 140, 141, -1, -1, -1, 145, 21, - 22, 115, 116, 117, 118, 119, -1, -1, 122, 123, - 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, - -1, 145, -1, 180, -1, 182, 183, 184, 185, 186, + -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, + 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, + -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, 206, - -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - -1, -1, 206, 115, 116, 117, 118, 119, 21, 22, - 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, - -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, - -1, -1, -1, 145, -1, -1, -1, -1, -1, 21, - 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 115, 116, 117, 118, 119, 21, 22, 122, 123, 124, + 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, + -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, + 145, -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 202, 203, -1, -1, 206, -1, -1, -1, -1, -1, - -1, -1, 115, 116, 117, 118, 119, -1, -1, 122, - 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, - -1, -1, 145, 115, 116, 117, 118, 119, 21, 22, - 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, - -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, - -1, -1, -1, 145, -1, -1, -1, 180, -1, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, - 203, -1, -1, 206, -1, -1, -1, -1, 180, -1, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 202, 203, -1, -1, 206, -1, -1, -1, -1, -1, - 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, - 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, - -1, -1, 145, 21, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, + -1, 206, -1, -1, -1, -1, -1, -1, -1, 115, + 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, + -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, + -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, + 115, 116, 117, 118, 119, 21, 22, 122, 123, 124, + 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, + -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, + 145, -1, -1, -1, 180, -1, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, + 206, -1, -1, -1, -1, 180, -1, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, + -1, 206, -1, -1, -1, -1, -1, 21, 22, 115, + 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, + -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, + -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, + 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, - 203, -1, -1, 206, 115, 116, 117, 118, 119, -1, + -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, + 206, 115, 116, 117, 118, 119, -1, -1, 122, 123, + 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, + 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, + -1, 145, 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, 140, - 141, -1, -1, -1, 145, 21, 22, 115, 116, 117, - 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, - 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, - -1, 139, 140, 141, -1, -1, -1, 145, -1, 180, + 141, -1, -1, -1, 145, -1, 180, -1, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, + -1, -1, 206, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 202, 203, -1, -1, 206, -1, -1, -1, -1, - -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, 203, 21, 22, 206, 115, - 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, - -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, - -1, -1, -1, 139, 140, 141, -1, 21, 22, 145, + -1, 202, 203, -1, -1, 206, 115, 116, 117, 118, + 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, + 139, 140, 141, -1, -1, -1, 145, -1, -1, -1, + -1, -1, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, + -1, -1, -1, -1, -1, 115, 116, 117, 118, 119, + -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, + 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, + 140, 141, -1, -1, -1, 145, 115, 116, 117, 118, + 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, + 139, 140, 141, -1, -1, -1, 145, -1, -1, -1, + 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 202, 203, -1, -1, 206, -1, -1, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, 203, -1, -1, 206, -1, -1, + -1, -1, -1, 21, 22, 115, 116, 117, 118, 119, + -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, + 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, + 140, 141, -1, -1, -1, 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 202, 203, 204, -1, + 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 202, 203, -1, -1, 206, 115, 116, 117, + 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, + 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, + -1, 139, 140, 141, -1, -1, -1, 145, 21, 22, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - -1, -1, -1, -1, 139, 140, 141, 21, 22, -1, - 145, 115, 116, 117, 118, 119, -1, -1, 122, 123, - 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, 21, 22, - -1, 145, -1, -1, -1, 180, -1, 182, 183, 184, + -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, + 145, -1, 180, -1, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, -1, -1, 206, -1, + -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, 204, - -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - 204, 115, 116, 117, 118, 119, -1, -1, 122, 123, + -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, + -1, 206, 115, 116, 117, 118, 119, 21, 22, 122, + 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, + 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, + -1, -1, 145, -1, -1, -1, -1, -1, 21, 22, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, + 203, -1, -1, 206, -1, -1, -1, -1, -1, -1, + -1, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, - 134, -1, -1, -1, -1, 139, 140, 141, 21, 22, - -1, 145, 115, 116, 117, 118, 119, -1, -1, 122, + 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, + -1, 145, 115, 116, 117, 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, - 204, -1, -1, -1, -1, -1, -1, 180, -1, 182, + -1, -1, 206, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, - 203, 204, 115, 116, 117, 118, 119, 21, 22, 122, - 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, - -1, -1, 145, -1, -1, -1, -1, -1, -1, -1, + 203, -1, -1, 206, -1, -1, -1, -1, -1, 21, + 22, 115, 116, 117, 118, 119, -1, -1, 122, 123, + 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, + 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, + -1, 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, - 203, 204, -1, 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, 21, 22, 139, 140, 141, 142, 143, - 144, 145, -1, -1, -1, -1, -1, -1, -1, -1, - 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 21, 22, -1, -1, 172, -1, - -1, -1, -1, -1, -1, 179, 180, -1, 182, 183, + -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, + -1, -1, 206, 115, 116, 117, 118, 119, -1, -1, + 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, + -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, + -1, -1, -1, 145, 21, 22, 115, 116, 117, 118, + 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, + 139, 140, 141, -1, -1, -1, 145, -1, 180, -1, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, -1, -1, 127, - 128, 129, -1, -1, 132, 133, 134, 135, 136, -1, - -1, 139, 140, 141, 142, 143, 144, 145, 115, 116, + 202, 203, -1, -1, 206, -1, -1, -1, -1, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, 203, -1, -1, 206, 115, 116, 117, 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, - 137, -1, 139, 140, 141, -1, -1, -1, 145, -1, - -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, -1, -1, 194, 195, -1, -1, - -1, -1, -1, -1, 202, 203, -1, -1, -1, -1, + -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, + -1, -1, -1, -1, 21, 22, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 202, 203, -1, -1, -1, - -1, -1, 21, 22, -1, -1, -1, 115, 116, 117, + -1, -1, -1, -1, -1, 202, 203, -1, -1, 206, + -1, -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, - -1, 139, 140, 141, 21, 22, -1, 145, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 172, -1, -1, -1, -1, -1, + -1, 139, 140, 141, 21, 22, -1, 145, 115, 116, + 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, + 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, + -1, -1, 139, 140, 141, 21, 22, -1, 145, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, 203, 115, 116, 117, 118, - 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, - 129, 130, 131, -1, 133, 134, 21, 22, -1, -1, - 139, 140, 141, -1, -1, -1, 145, -1, 115, 116, - 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, - 127, 128, 129, 130, 131, -1, 133, 134, 21, 22, - -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, - -1, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 202, 203, 172, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, 204, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, - 115, 116, 117, 118, 119, 202, 203, 122, 123, 124, - 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - 21, 22, -1, -1, 139, 140, 141, -1, -1, -1, - 145, -1, 115, 116, 117, 118, 119, -1, -1, 122, - 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, 168, 21, 22, 139, 140, 141, -1, - -1, -1, 145, -1, -1, 180, -1, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, 172, - -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, - -1, -1, -1, -1, 115, 116, 117, 118, 119, 202, - 203, 122, 123, 124, 125, -1, 127, 128, 129, 130, - 131, -1, 133, 134, -1, -1, 21, 22, 139, 140, - 141, -1, -1, -1, 145, -1, -1, -1, 115, 116, + -1, -1, -1, -1, -1, 202, 203, 204, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, - -1, 172, 139, 140, 141, -1, -1, -1, 145, 180, - -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 202, 203, -1, -1, 172, -1, -1, -1, -1, + -1, -1, 139, 140, 141, 21, 22, -1, 145, 115, + 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, + -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, + -1, -1, -1, 139, 140, 141, 21, 22, -1, 145, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 21, 22, -1, -1, -1, - 115, 116, 117, 118, 119, 202, 203, 122, 123, 124, + 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 202, 203, 204, -1, -1, + -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 202, 203, 204, 115, + 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, + -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, + -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, + 115, 116, 117, 118, 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, 140, 141, -1, -1, -1, - 145, 21, 22, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 172, -1, -1, + 145, -1, -1, -1, 180, -1, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 202, 203, 204, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 202, 203, 115, - 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, - -1, 127, 128, 129, 130, 131, -1, 133, 134, -1, - -1, -1, -1, 139, 140, 141, -1, -1, -1, 145, - 21, 22, -1, -1, -1, 115, 116, 117, 118, 119, - -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, - 130, 131, -1, 133, 134, -1, 172, -1, -1, 139, - 140, 141, 21, 22, 180, 145, 182, 183, 184, 185, + -1, -1, -1, -1, -1, -1, -1, 202, 203, 204, + -1, 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, 21, 22, 139, 140, 141, 142, 143, 144, 145, + -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 21, 22, -1, -1, 172, -1, -1, -1, + -1, -1, -1, 179, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, -1, -1, 127, 128, 129, + -1, -1, 132, 133, 134, 135, 136, -1, -1, 139, + 140, 141, 142, 143, 144, 145, 115, 116, 117, 118, + 119, 21, 22, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, -1, -1, 137, -1, + 139, 140, 141, -1, -1, -1, 145, -1, -1, -1, + 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, -1, -1, 194, 195, -1, -1, -1, -1, + -1, -1, 202, 203, -1, -1, -1, -1, -1, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, 203, -1, -1, -1, -1, -1, + 21, 22, -1, -1, -1, 115, 116, 117, 118, 119, + -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, + 130, 131, -1, 133, 134, -1, -1, -1, -1, 139, + 140, 141, 21, 22, -1, 145, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 172, -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, 115, 116, 117, 118, 119, -1, @@ -3690,60 +3656,103 @@ static const yytype_int16 yycheck[] = 141, -1, -1, -1, 145, -1, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, 21, 22, -1, -1, - 139, 140, 141, -1, -1, -1, -1, -1, -1, 180, - -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 139, 140, 141, -1, -1, -1, 145, -1, -1, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 202, 203, -1, -1, -1, -1, -1, -1, -1, + -1, 202, 203, 172, -1, -1, -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, 115, 116, 117, 118, 119, 202, 203, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, 21, 22, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 139, 140, 141, -1, -1, -1, 145, -1, 115, 116, 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, - 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 182, 183, 184, 185, 186, + -1, 168, 21, 22, 139, 140, 141, -1, -1, -1, + 145, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 202, 203, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 184, + -1, -1, -1, -1, -1, 202, 203, 172, -1, -1, + -1, -1, -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, 115, 116, 117, 118, 119, 202, 203, 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, - 133, 134, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 115, 116, 117, 118, 119, -1, - -1, 122, -1, -1, 125, -1, 127, 128, 129, 130, - 131, -1, 133, 134, -1, -1, -1, -1, -1, -1, + 133, 134, -1, -1, 21, 22, 139, 140, 141, -1, + -1, -1, 145, -1, -1, -1, 115, 116, 117, 118, + 119, -1, -1, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, -1, -1, -1, 172, + 139, 140, 141, -1, -1, -1, 145, 180, -1, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, + 203, -1, -1, 172, -1, -1, -1, -1, -1, -1, + -1, 180, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 21, 22, -1, -1, -1, 115, 116, + 117, 118, 119, 202, 203, 122, 123, 124, 125, -1, + 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, + -1, -1, 139, 140, 141, -1, -1, -1, 145, 21, + 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 172, -1, -1, -1, -1, + -1, -1, -1, 180, -1, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 202, 203, 115, 116, 117, + 118, 119, -1, -1, 122, 123, 124, 125, -1, 127, + 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, + -1, 139, 140, 141, -1, -1, -1, 145, 21, 22, + -1, -1, -1, 115, 116, 117, 118, 119, -1, -1, + 122, 123, 124, 125, -1, 127, 128, 129, 130, 131, + -1, 133, 134, -1, 172, -1, -1, 139, 140, 141, + 21, 22, 180, 145, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 202, 203, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 19, 185, 186, 187, 188, 189, 190, 191, -1, + 202, 203, 115, 116, 117, 118, 119, -1, -1, 122, + 123, 124, 125, -1, 127, 128, 129, 130, 131, -1, + 133, 134, 21, 22, -1, -1, 139, 140, 141, -1, + -1, -1, 145, -1, 115, 116, 117, 118, 119, -1, + -1, 122, 123, 124, 125, -1, 127, 128, 129, 130, + 131, -1, 133, 134, 21, 22, -1, -1, 139, -1, + 141, -1, -1, -1, -1, -1, -1, 180, -1, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 202, 203, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 19, -1, 185, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 202, 203, 71, 72, 73, -1, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, - 98, 99, 100, 101, 71, 72, 73, -1, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, -1, 93, 94, 95, -1, - -1, 98, 99, 100, 101, -1, -1, -1, -1, -1, - 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 153, -1, -1, -1, -1, - -1, -1, -1, -1, 162, -1, -1, -1, -1, -1, + -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, -1, -1, -1, -1, -1, 115, 116, 117, 118, + 119, 202, 203, 122, 123, 124, 125, -1, 127, 128, + 129, 130, 131, -1, 133, 134, 21, 22, -1, -1, + 139, -1, -1, -1, -1, -1, -1, -1, 115, 116, + 117, 118, 119, -1, -1, 122, 123, 124, 125, -1, + 127, 128, 129, 130, 131, -1, 133, 134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 153, 35, -1, -1, - -1, -1, 71, 72, 73, 162, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, -1, 93, 94, 95, -1, -1, 98, - 99, 100, 101, 71, -1, 73, -1, 75, 76, 77, - 78, 79, -1, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, -1, 93, 94, 95, -1, -1, - 98, 99, 100, 101, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, - 118, -1, -1, -1, 153, -1, -1, -1, -1, -1, - -1, -1, -1, 162, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, -1, -1, -1, -1, -1, 19, -1, + -1, -1, -1, 202, 203, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 183, 184, 185, 186, + 187, 188, 189, 190, 191, -1, -1, -1, -1, -1, + 115, 116, 117, 118, 119, 202, 203, 122, 123, 124, + 125, -1, 127, 128, 129, 130, 131, -1, 133, 134, + 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, -1, 93, 94, 95, -1, -1, 98, 99, 100, + 101, -1, -1, -1, -1, -1, 19, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 184, + 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 202, 203, 19, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 153, -1, -1, -1, -1, -1, 71, 72, + 73, 162, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, -1, + 93, 94, 95, -1, -1, 98, 99, 100, 101, -1, + -1, 71, 72, 73, -1, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, -1, 93, 94, 95, -1, -1, 98, 99, + 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 162 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -3752,146 +3761,147 @@ static const yytype_int16 yystos[] = { 0, 211, 0, 7, 30, 32, 34, 40, 50, 56, 80, 102, 103, 172, 191, 203, 212, 215, 221, 223, - 224, 228, 254, 258, 281, 355, 362, 366, 375, 420, - 424, 428, 19, 20, 162, 246, 247, 248, 155, 229, - 230, 162, 191, 225, 226, 57, 63, 359, 360, 162, - 207, 214, 359, 359, 359, 138, 162, 269, 34, 63, - 131, 195, 205, 250, 251, 252, 253, 269, 172, 5, - 6, 8, 36, 372, 62, 353, 179, 178, 181, 172, - 178, 225, 22, 57, 190, 202, 227, 162, 172, 353, + 224, 228, 254, 258, 282, 356, 363, 367, 376, 422, + 426, 430, 19, 20, 162, 246, 247, 248, 155, 229, + 230, 162, 191, 225, 226, 57, 63, 360, 361, 162, + 207, 214, 360, 360, 360, 138, 162, 270, 34, 63, + 131, 195, 205, 250, 251, 252, 253, 270, 172, 172, + 5, 6, 8, 36, 373, 62, 354, 179, 178, 181, + 178, 225, 22, 57, 190, 202, 227, 162, 172, 354, 162, 162, 162, 162, 138, 222, 252, 252, 252, 205, 139, 140, 141, 178, 204, 57, 63, 259, 261, 57, - 63, 363, 57, 63, 373, 57, 63, 354, 15, 16, + 63, 364, 57, 63, 374, 57, 63, 355, 15, 16, 155, 160, 162, 163, 205, 217, 247, 155, 230, 162, - 162, 162, 361, 57, 63, 213, 429, 421, 425, 162, + 162, 162, 362, 57, 63, 213, 431, 423, 427, 162, 164, 220, 206, 248, 252, 252, 252, 252, 262, 162, - 364, 376, 356, 164, 165, 216, 15, 16, 155, 160, + 365, 377, 357, 164, 165, 216, 15, 16, 155, 160, 162, 217, 244, 245, 227, 179, 170, 170, 170, 164, 206, 35, 71, 73, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 93, 94, 95, 98, 99, 100, 101, 117, 118, 162, - 257, 260, 181, 365, 106, 370, 371, 208, 249, 327, + 257, 260, 181, 366, 106, 371, 372, 208, 249, 328, 164, 165, 166, 178, 206, 19, 25, 31, 41, 49, 64, 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, 151, 207, 269, 379, 381, 382, - 385, 390, 391, 419, 430, 422, 426, 21, 22, 38, + 100, 101, 102, 103, 151, 207, 270, 380, 382, 383, + 386, 392, 393, 421, 432, 424, 428, 21, 22, 38, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 127, 128, 129, 132, 133, 134, 135, 136, 139, 140, 141, 142, 143, 144, 145, 180, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 194, 195, 202, 203, 35, 35, 205, 255, 170, 263, 75, 79, 93, 94, 98, 99, - 100, 101, 380, 170, 162, 377, 247, 208, 162, 350, - 352, 244, 185, 185, 185, 205, 185, 185, 205, 185, - 185, 185, 185, 185, 185, 205, 269, 33, 60, 61, - 123, 127, 184, 187, 189, 203, 209, 389, 182, 162, - 384, 341, 344, 162, 162, 162, 204, 22, 162, 204, - 150, 206, 327, 337, 338, 181, 256, 266, 367, 181, - 369, 170, 374, 247, 178, 181, 184, 348, 392, 397, - 399, 5, 6, 15, 16, 17, 18, 19, 25, 27, - 31, 39, 45, 48, 51, 55, 68, 69, 80, 102, - 103, 104, 117, 118, 146, 147, 148, 149, 150, 152, - 154, 155, 156, 157, 158, 159, 160, 161, 163, 170, - 187, 188, 189, 194, 195, 203, 205, 207, 208, 219, - 221, 264, 269, 274, 286, 293, 296, 299, 303, 305, - 307, 308, 310, 315, 318, 319, 326, 379, 432, 439, - 449, 452, 464, 467, 401, 395, 162, 386, 403, 405, - 407, 409, 411, 413, 415, 417, 319, 185, 205, 33, - 184, 33, 184, 203, 209, 204, 319, 203, 209, 390, - 178, 466, 162, 172, 339, 419, 423, 162, 172, 342, - 427, 162, 132, 205, 7, 50, 280, 172, 206, 419, - 1, 9, 10, 11, 13, 26, 28, 29, 38, 42, - 44, 52, 54, 58, 59, 65, 105, 171, 172, 231, - 232, 235, 237, 238, 239, 240, 241, 242, 243, 265, - 270, 275, 276, 277, 278, 279, 281, 285, 306, 319, - 162, 357, 358, 269, 333, 162, 390, 126, 132, 179, - 347, 419, 419, 388, 419, 185, 185, 185, 271, 381, - 432, 269, 185, 5, 102, 103, 185, 205, 185, 205, - 205, 185, 185, 205, 185, 185, 205, 185, 185, 205, - 185, 185, 319, 319, 205, 205, 205, 205, 205, 205, - 218, 13, 319, 448, 463, 319, 319, 319, 319, 319, - 13, 49, 297, 319, 297, 208, 205, 254, 170, 208, - 299, 304, 21, 22, 115, 116, 117, 118, 119, 122, - 123, 124, 125, 127, 128, 129, 130, 131, 133, 134, - 139, 140, 141, 145, 180, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 202, 203, 206, 205, 419, - 419, 206, 162, 383, 419, 255, 419, 255, 419, 255, - 339, 340, 342, 343, 206, 394, 267, 297, 204, 204, - 204, 319, 162, 431, 181, 172, 171, 181, 172, 171, - 319, 147, 162, 346, 378, 337, 205, 205, 126, 319, - 263, 61, 319, 205, 162, 172, 155, 58, 319, 263, - 126, 319, 37, 172, 172, 205, 10, 172, 172, 172, - 172, 172, 172, 66, 282, 172, 107, 108, 109, 110, - 111, 112, 113, 114, 120, 121, 126, 132, 135, 136, - 142, 143, 144, 179, 179, 178, 466, 171, 254, 334, - 172, 347, 319, 186, 186, 186, 172, 440, 442, 272, - 205, 205, 185, 205, 294, 185, 185, 185, 459, 297, - 390, 463, 319, 287, 289, 319, 291, 461, 297, 446, - 450, 297, 444, 390, 319, 319, 319, 319, 319, 319, - 166, 167, 216, 378, 137, 178, 466, 378, 13, 178, - 466, 466, 147, 152, 185, 269, 309, 153, 162, 203, - 206, 297, 433, 435, 4, 302, 266, 208, 254, 19, - 153, 162, 379, 19, 153, 162, 379, 319, 319, 319, - 319, 319, 319, 162, 319, 153, 162, 319, 319, 319, - 379, 319, 319, 319, 319, 319, 319, 22, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 128, - 129, 153, 162, 202, 203, 316, 319, 206, 297, 186, - 186, 172, 186, 186, 256, 186, 256, 186, 256, 172, - 186, 172, 186, 268, 419, 206, 178, 204, 171, 419, - 419, 206, 205, 43, 126, 178, 179, 181, 184, 345, - 319, 378, 319, 14, 319, 319, 179, 181, 155, 319, - 170, 319, 205, 147, 162, 205, 284, 349, 351, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 357, 368, - 8, 327, 332, 319, 172, 393, 398, 400, 419, 390, - 390, 419, 70, 438, 267, 162, 319, 419, 453, 455, - 457, 390, 466, 172, 186, 466, 206, 390, 390, 206, - 390, 390, 466, 390, 390, 466, 390, 186, 206, 206, - 206, 206, 206, 206, 319, 20, 319, 448, 171, 20, - 378, 319, 204, 206, 205, 205, 311, 313, 205, 132, - 345, 433, 178, 206, 178, 206, 205, 255, 171, 302, + 100, 101, 381, 170, 162, 378, 247, 208, 162, 351, + 353, 244, 185, 185, 185, 205, 185, 185, 205, 185, + 185, 185, 185, 185, 185, 205, 270, 33, 60, 61, + 123, 127, 180, 184, 187, 203, 209, 391, 182, 162, + 385, 342, 345, 162, 162, 162, 204, 22, 162, 204, + 150, 206, 328, 338, 339, 181, 256, 266, 368, 181, + 370, 170, 375, 247, 178, 181, 184, 349, 394, 399, + 401, 5, 6, 15, 16, 17, 18, 19, 25, 27, + 31, 39, 45, 48, 51, 55, 65, 68, 69, 80, + 102, 103, 104, 117, 118, 146, 147, 148, 149, 150, + 152, 154, 155, 156, 157, 158, 159, 160, 161, 163, + 170, 187, 188, 189, 194, 195, 203, 205, 207, 208, + 219, 221, 264, 270, 275, 287, 294, 297, 300, 304, + 306, 308, 309, 311, 316, 319, 320, 327, 380, 434, + 442, 452, 455, 467, 470, 403, 397, 162, 387, 405, + 407, 409, 411, 413, 415, 417, 419, 320, 185, 205, + 33, 184, 33, 184, 203, 209, 204, 320, 203, 209, + 392, 178, 469, 162, 172, 178, 340, 389, 421, 425, + 162, 343, 389, 429, 162, 132, 205, 7, 50, 281, + 172, 206, 421, 1, 9, 10, 11, 13, 26, 28, + 29, 38, 42, 44, 52, 54, 58, 59, 65, 105, + 171, 172, 231, 232, 235, 237, 238, 239, 240, 241, + 242, 243, 265, 271, 276, 277, 278, 279, 280, 282, + 286, 307, 320, 162, 358, 359, 270, 334, 162, 392, + 126, 132, 179, 348, 421, 421, 390, 421, 185, 185, + 185, 272, 382, 434, 270, 185, 5, 102, 103, 185, + 205, 185, 205, 205, 185, 185, 205, 185, 205, 185, + 205, 185, 185, 205, 185, 185, 320, 320, 205, 205, + 205, 205, 205, 205, 218, 13, 320, 451, 466, 320, + 320, 320, 320, 320, 13, 49, 298, 320, 298, 208, + 205, 254, 170, 208, 300, 305, 21, 22, 115, 116, + 117, 118, 119, 122, 123, 124, 125, 127, 128, 129, + 130, 131, 133, 134, 139, 140, 141, 145, 180, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 202, + 203, 206, 205, 421, 421, 206, 162, 384, 421, 255, + 421, 255, 421, 255, 340, 341, 343, 344, 206, 396, + 267, 298, 204, 204, 204, 320, 162, 433, 181, 389, + 171, 181, 389, 171, 320, 147, 162, 347, 379, 338, + 205, 205, 126, 320, 263, 61, 320, 205, 162, 172, + 155, 58, 320, 263, 126, 320, 37, 172, 172, 205, + 10, 172, 172, 172, 172, 172, 172, 66, 283, 172, + 107, 108, 109, 110, 111, 112, 113, 114, 120, 121, + 126, 132, 135, 136, 142, 143, 144, 179, 179, 178, + 469, 171, 254, 335, 172, 348, 320, 186, 186, 186, + 389, 443, 445, 273, 205, 205, 185, 205, 295, 185, + 185, 185, 462, 298, 392, 466, 320, 288, 290, 320, + 292, 320, 464, 298, 449, 453, 298, 447, 392, 320, + 320, 320, 320, 320, 320, 166, 167, 216, 379, 137, + 178, 469, 379, 13, 178, 469, 469, 147, 152, 185, + 270, 310, 70, 153, 162, 203, 206, 298, 435, 437, + 4, 303, 266, 208, 254, 19, 153, 162, 380, 19, + 153, 162, 380, 320, 320, 320, 320, 320, 320, 162, + 320, 153, 162, 320, 320, 320, 380, 320, 320, 320, + 320, 320, 320, 22, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 128, 129, 153, 162, 202, + 203, 317, 320, 206, 298, 186, 186, 172, 186, 186, + 256, 186, 256, 186, 256, 186, 389, 186, 389, 269, + 421, 206, 469, 204, 171, 421, 421, 206, 205, 43, + 126, 178, 179, 181, 184, 346, 320, 379, 320, 14, + 320, 320, 179, 181, 155, 320, 170, 320, 205, 147, + 162, 205, 285, 350, 352, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 358, 369, 8, 328, 333, 320, + 172, 395, 400, 402, 421, 392, 392, 421, 70, 441, + 267, 162, 320, 421, 456, 458, 460, 392, 469, 186, + 389, 469, 206, 392, 392, 206, 392, 206, 392, 469, + 392, 392, 469, 392, 186, 206, 206, 206, 206, 206, + 206, 320, 20, 320, 451, 171, 20, 379, 320, 204, + 206, 205, 205, 312, 314, 162, 206, 437, 205, 132, + 346, 435, 178, 206, 178, 206, 205, 255, 171, 303, 185, 205, 185, 205, 205, 205, 204, 19, 153, 162, - 379, 181, 153, 162, 319, 205, 205, 153, 162, 319, - 1, 204, 206, 402, 396, 162, 387, 404, 186, 408, - 186, 412, 186, 339, 416, 342, 418, 172, 186, 319, - 162, 162, 419, 319, 206, 20, 263, 206, 319, 266, - 206, 319, 205, 43, 162, 283, 178, 181, 348, 171, - 57, 63, 330, 67, 331, 172, 172, 186, 186, 186, - 162, 206, 435, 206, 172, 186, 206, 186, 390, 390, - 390, 186, 206, 390, 205, 206, 186, 186, 186, 186, - 206, 186, 186, 206, 186, 302, 205, 168, 297, 297, - 20, 319, 319, 390, 255, 319, 319, 319, 204, 203, - 153, 162, 126, 132, 179, 184, 300, 301, 256, 255, - 320, 319, 322, 319, 206, 297, 319, 185, 205, 319, - 205, 204, 319, 206, 297, 205, 204, 317, 406, 410, - 414, 419, 205, 206, 43, 345, 263, 297, 263, 171, - 263, 206, 319, 162, 178, 206, 162, 390, 347, 47, - 331, 46, 106, 328, 441, 443, 273, 206, 162, 205, - 295, 186, 186, 186, 460, 186, 463, 288, 290, 292, - 462, 447, 451, 445, 205, 263, 206, 297, 172, 172, - 297, 206, 206, 186, 256, 206, 206, 433, 205, 132, - 345, 162, 162, 162, 162, 178, 206, 137, 263, 298, - 256, 390, 206, 419, 206, 206, 206, 324, 319, 319, - 206, 206, 319, 267, 162, 319, 206, 12, 23, 24, - 233, 234, 12, 236, 206, 162, 181, 348, 43, 172, - 347, 319, 33, 329, 328, 330, 205, 205, 186, 319, - 454, 456, 458, 205, 205, 466, 319, 319, 319, 205, - 438, 205, 205, 206, 319, 206, 448, 319, 172, 312, - 186, 132, 345, 204, 319, 319, 319, 300, 126, 319, - 263, 186, 186, 419, 206, 206, 206, 206, 263, 263, - 205, 237, 275, 276, 277, 278, 319, 172, 390, 347, - 162, 319, 172, 335, 329, 346, 438, 438, 205, 206, - 205, 205, 205, 297, 463, 206, 297, 438, 433, 434, - 206, 172, 465, 465, 319, 309, 314, 319, 319, 206, - 206, 319, 321, 323, 186, 319, 347, 319, 172, 260, - 336, 205, 433, 436, 437, 437, 319, 438, 438, 434, - 466, 466, 466, 437, 206, 53, 171, 204, 465, 309, - 132, 345, 325, 206, 319, 172, 172, 260, 433, 178, - 466, 206, 206, 206, 437, 437, 206, 206, 206, 206, - 206, 319, 204, 319, 319, 263, 172, 263, 206, 205, - 206, 206, 234, 433, 206 + 380, 181, 153, 162, 320, 205, 205, 153, 162, 320, + 1, 204, 178, 206, 404, 398, 162, 388, 406, 186, + 410, 186, 414, 186, 418, 340, 420, 343, 186, 389, + 320, 162, 162, 421, 320, 206, 20, 263, 206, 320, + 266, 206, 320, 205, 43, 162, 284, 178, 181, 349, + 171, 57, 63, 331, 67, 332, 172, 172, 186, 186, + 186, 206, 437, 206, 186, 389, 206, 186, 392, 392, + 392, 186, 206, 205, 392, 206, 186, 186, 186, 186, + 206, 186, 186, 206, 186, 303, 205, 168, 298, 298, + 20, 320, 320, 392, 255, 206, 320, 320, 320, 204, + 203, 153, 162, 126, 132, 179, 184, 301, 302, 256, + 255, 321, 320, 323, 320, 206, 298, 320, 185, 205, + 320, 205, 204, 320, 206, 298, 205, 204, 318, 408, + 412, 416, 205, 421, 206, 43, 346, 263, 298, 263, + 171, 263, 206, 320, 162, 178, 206, 162, 392, 348, + 47, 332, 46, 106, 329, 444, 446, 274, 206, 205, + 162, 296, 186, 186, 186, 463, 268, 466, 186, 289, + 291, 293, 465, 450, 454, 448, 205, 263, 206, 298, + 172, 172, 298, 206, 206, 186, 256, 206, 206, 435, + 205, 132, 346, 162, 162, 162, 162, 178, 206, 137, + 263, 299, 256, 392, 206, 421, 206, 206, 206, 325, + 320, 320, 206, 206, 320, 267, 162, 320, 206, 12, + 23, 24, 233, 234, 12, 236, 206, 162, 181, 349, + 43, 172, 348, 320, 33, 330, 329, 331, 205, 205, + 320, 186, 457, 459, 461, 205, 206, 469, 205, 320, + 320, 320, 205, 441, 205, 205, 206, 320, 206, 451, + 320, 172, 313, 186, 132, 346, 204, 320, 320, 320, + 301, 126, 320, 263, 186, 186, 421, 206, 206, 206, + 206, 263, 263, 205, 237, 276, 277, 278, 279, 320, + 172, 392, 348, 162, 320, 172, 336, 330, 347, 441, + 441, 206, 205, 205, 205, 205, 267, 268, 298, 441, + 435, 436, 206, 172, 468, 468, 320, 310, 315, 320, + 320, 206, 206, 320, 322, 324, 186, 320, 348, 320, + 172, 260, 337, 205, 435, 438, 439, 440, 440, 320, + 441, 441, 436, 206, 206, 469, 440, 206, 53, 171, + 204, 468, 310, 132, 346, 326, 206, 320, 172, 172, + 260, 435, 178, 469, 206, 206, 206, 440, 440, 206, + 206, 206, 320, 204, 320, 320, 263, 172, 263, 206, + 205, 206, 206, 234, 435, 206 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -3921,69 +3931,70 @@ static const yytype_int16 yyr1[] = 262, 261, 263, 263, 264, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 267, 267, 268, 268, - 269, 269, 269, 270, 270, 272, 273, 271, 274, 274, - 274, 274, 274, 275, 276, 277, 277, 277, 278, 278, - 279, 280, 280, 280, 281, 281, 282, 282, 283, 283, - 284, 284, 285, 285, 287, 288, 286, 289, 290, 286, - 291, 292, 286, 294, 295, 293, 296, 296, 296, 297, - 297, 298, 298, 298, 299, 299, 299, 300, 300, 300, - 300, 301, 301, 302, 302, 303, 304, 304, 305, 305, - 305, 305, 305, 305, 305, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 307, 307, 308, 308, 309, 309, - 310, 311, 312, 310, 313, 314, 310, 315, 315, 315, - 315, 316, 317, 315, 318, 318, 318, 318, 318, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 320, 321, 319, 319, - 319, 319, 322, 323, 319, 319, 319, 324, 325, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 327, 327, - 328, 328, 328, 329, 329, 330, 330, 330, 331, 331, - 332, 333, 334, 333, 335, 333, 336, 333, 337, 337, - 338, 338, 339, 339, 340, 340, 341, 341, 341, 342, - 343, 343, 344, 344, 344, 345, 345, 346, 346, 346, - 346, 346, 347, 347, 347, 348, 348, 349, 349, 349, - 349, 349, 350, 350, 351, 351, 351, 352, 352, 352, - 353, 353, 354, 354, 354, 356, 355, 357, 357, 358, - 358, 358, 359, 359, 359, 361, 360, 362, 363, 363, - 363, 364, 365, 365, 367, 368, 366, 369, 369, 370, - 370, 371, 372, 372, 373, 373, 373, 374, 374, 376, - 377, 375, 378, 378, 378, 378, 378, 379, 379, 379, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 379, 379, 379, 380, 380, 380, 380, 380, 380, - 380, 380, 381, 382, 382, 382, 383, 383, 384, 384, - 384, 386, 387, 385, 388, 388, 389, 389, 389, 389, - 390, 390, 391, 391, 391, 391, 392, 393, 391, 391, - 391, 394, 391, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 395, 396, 391, 391, 397, - 398, 391, 399, 400, 391, 401, 402, 391, 391, 403, - 404, 391, 405, 406, 391, 391, 407, 408, 391, 409, - 410, 391, 391, 411, 412, 391, 413, 414, 391, 415, - 416, 391, 417, 418, 391, 419, 419, 419, 421, 422, - 423, 420, 425, 426, 427, 424, 429, 430, 431, 428, - 432, 432, 432, 432, 432, 433, 433, 433, 433, 433, - 433, 433, 433, 434, 435, 436, 436, 437, 437, 438, - 438, 440, 441, 439, 442, 443, 439, 444, 445, 439, - 446, 447, 439, 448, 448, 449, 450, 451, 449, 452, - 453, 454, 452, 455, 456, 452, 457, 458, 452, 452, - 459, 460, 452, 452, 461, 462, 452, 463, 463, 464, - 464, 464, 464, 465, 465, 466, 466, 467, 467, 467 + 269, 269, 270, 270, 270, 271, 271, 273, 274, 272, + 275, 275, 275, 275, 275, 276, 277, 278, 278, 278, + 279, 279, 280, 281, 281, 281, 282, 282, 283, 283, + 284, 284, 285, 285, 286, 286, 288, 289, 287, 290, + 291, 287, 292, 293, 287, 295, 296, 294, 297, 297, + 297, 298, 298, 299, 299, 299, 300, 300, 300, 301, + 301, 301, 301, 302, 302, 303, 303, 304, 305, 305, + 306, 306, 306, 306, 306, 306, 306, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 308, 308, 309, 309, + 310, 310, 311, 312, 313, 311, 314, 315, 311, 316, + 316, 316, 316, 317, 318, 316, 319, 319, 319, 319, + 319, 319, 319, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 321, 322, 320, 320, 320, 320, 323, 324, 320, 320, + 320, 325, 326, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 327, 327, 327, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 327, 327, 327, 328, 328, 329, 329, 329, 330, 330, + 331, 331, 331, 332, 332, 333, 334, 335, 334, 336, + 334, 337, 334, 338, 338, 339, 339, 340, 340, 341, + 341, 342, 342, 342, 343, 344, 344, 345, 345, 345, + 346, 346, 347, 347, 347, 347, 347, 348, 348, 348, + 349, 349, 350, 350, 350, 350, 350, 351, 351, 352, + 352, 352, 353, 353, 353, 354, 354, 355, 355, 355, + 357, 356, 358, 358, 359, 359, 359, 360, 360, 360, + 362, 361, 363, 364, 364, 364, 365, 366, 366, 368, + 369, 367, 370, 370, 371, 371, 372, 373, 373, 374, + 374, 374, 375, 375, 377, 378, 376, 379, 379, 379, + 379, 379, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 381, + 381, 381, 381, 381, 381, 381, 381, 382, 383, 383, + 383, 384, 384, 385, 385, 385, 387, 388, 386, 389, + 389, 390, 390, 391, 391, 391, 391, 392, 392, 393, + 393, 393, 393, 394, 395, 393, 393, 393, 396, 393, + 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, + 393, 393, 397, 398, 393, 393, 399, 400, 393, 401, + 402, 393, 403, 404, 393, 393, 405, 406, 393, 407, + 408, 393, 393, 409, 410, 393, 411, 412, 393, 393, + 413, 414, 393, 415, 416, 393, 417, 418, 393, 419, + 420, 393, 421, 421, 421, 423, 424, 425, 422, 427, + 428, 429, 426, 431, 432, 433, 430, 434, 434, 434, + 434, 434, 435, 435, 435, 435, 435, 435, 435, 435, + 436, 437, 438, 438, 439, 439, 440, 440, 441, 441, + 443, 444, 442, 445, 446, 442, 447, 448, 442, 449, + 450, 442, 451, 451, 452, 453, 454, 452, 455, 456, + 457, 455, 458, 459, 455, 460, 461, 455, 455, 462, + 463, 455, 455, 464, 465, 455, 466, 466, 467, 467, + 467, 467, 468, 468, 469, 469, 470, 470, 470 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, + 3, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 4, 1, 1, 2, 2, 3, 0, 2, 4, 3, 1, 2, 0, 4, 2, 2, 1, - 2, 3, 3, 2, 4, 0, 1, 3, 1, 3, + 2, 3, 3, 2, 4, 0, 1, 2, 1, 3, 1, 3, 3, 3, 2, 1, 1, 0, 2, 6, 1, 1, 0, 2, 1, 1, 1, 1, 1, 6, 7, 7, 2, 5, 5, 4, 1, 1, 1, 1, @@ -4002,60 +4013,61 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 3, 0, 1, 1, 3, 0, 4, 3, 7, 2, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, - 2, 2, 2, 0, 2, 2, 0, 1, 1, 3, - 1, 3, 2, 2, 3, 0, 0, 5, 2, 5, - 5, 6, 2, 1, 1, 1, 2, 3, 2, 3, - 4, 1, 1, 0, 1, 1, 1, 0, 1, 3, - 8, 7, 3, 3, 0, 0, 7, 0, 0, 7, - 0, 0, 7, 0, 0, 6, 5, 8, 10, 1, - 3, 1, 2, 3, 1, 1, 2, 2, 2, 2, - 2, 1, 3, 0, 4, 6, 6, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, + 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, + 1, 3, 1, 3, 2, 2, 3, 0, 0, 5, + 2, 5, 5, 6, 2, 1, 1, 1, 2, 3, + 2, 3, 4, 1, 1, 0, 1, 1, 1, 0, + 1, 3, 8, 7, 3, 3, 0, 0, 7, 0, + 0, 7, 0, 0, 7, 0, 0, 6, 5, 8, + 10, 1, 3, 1, 2, 3, 1, 1, 2, 2, + 2, 2, 2, 1, 3, 0, 4, 6, 6, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 6, 8, 5, 6, 1, 4, - 3, 0, 0, 8, 0, 0, 9, 3, 4, 5, - 6, 0, 0, 5, 3, 4, 4, 3, 4, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 6, 8, 5, 6, + 1, 4, 3, 0, 0, 8, 0, 0, 9, 3, + 4, 5, 6, 0, 0, 5, 3, 4, 4, 5, + 4, 3, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 2, 4, - 4, 5, 4, 5, 3, 4, 1, 1, 2, 4, - 4, 7, 8, 6, 3, 5, 0, 0, 8, 3, - 3, 3, 0, 0, 8, 3, 4, 0, 0, 9, - 4, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 1, 4, 4, 4, 4, 4, 1, 6, 7, - 6, 6, 7, 7, 6, 7, 6, 6, 0, 1, - 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, - 5, 0, 0, 4, 0, 9, 0, 10, 3, 4, - 1, 3, 1, 3, 1, 3, 0, 2, 3, 3, - 1, 3, 0, 2, 3, 1, 1, 1, 2, 3, - 5, 3, 1, 1, 1, 0, 1, 1, 4, 3, - 3, 5, 1, 3, 4, 6, 5, 4, 6, 5, - 0, 1, 0, 1, 1, 0, 6, 1, 3, 0, - 1, 3, 0, 1, 1, 0, 5, 3, 0, 1, - 1, 1, 0, 2, 0, 0, 11, 0, 2, 0, - 1, 3, 1, 1, 0, 1, 1, 0, 3, 0, - 0, 7, 1, 4, 3, 3, 5, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 2, 2, 2, 4, 4, 5, 4, 5, 3, 4, + 1, 1, 2, 4, 4, 7, 8, 6, 3, 5, + 0, 0, 8, 3, 3, 3, 0, 0, 8, 3, + 4, 0, 0, 9, 4, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 1, 4, 4, 4, 4, + 4, 4, 1, 6, 7, 6, 6, 7, 7, 6, + 7, 6, 6, 0, 1, 0, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 5, 0, 0, 4, 0, + 9, 0, 10, 3, 4, 1, 3, 1, 3, 1, + 3, 0, 2, 3, 3, 1, 3, 0, 2, 3, + 1, 1, 1, 2, 3, 5, 3, 1, 1, 1, + 0, 1, 1, 4, 3, 3, 5, 1, 3, 4, + 6, 5, 4, 6, 5, 0, 1, 0, 1, 1, + 0, 6, 1, 3, 0, 1, 3, 0, 1, 1, + 0, 5, 3, 0, 1, 1, 1, 0, 2, 0, + 0, 11, 0, 2, 0, 1, 3, 1, 1, 0, + 1, 1, 0, 3, 0, 0, 7, 1, 4, 3, + 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 4, 1, 3, 0, 1, - 3, 0, 0, 6, 1, 3, 3, 2, 4, 3, - 1, 2, 1, 1, 1, 1, 0, 0, 6, 4, - 5, 0, 9, 4, 2, 2, 3, 2, 3, 2, - 2, 3, 3, 3, 2, 0, 0, 6, 2, 0, - 0, 6, 0, 0, 6, 0, 0, 6, 1, 0, - 0, 6, 0, 0, 7, 1, 0, 0, 6, 0, - 0, 7, 1, 0, 0, 6, 0, 0, 7, 0, - 0, 6, 0, 0, 6, 1, 3, 3, 0, 0, - 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, - 1, 1, 1, 1, 1, 3, 3, 5, 5, 6, - 6, 8, 8, 1, 1, 3, 5, 1, 2, 0, - 1, 0, 0, 10, 0, 0, 10, 0, 0, 9, - 0, 0, 7, 3, 1, 5, 0, 0, 10, 4, - 0, 0, 11, 0, 0, 11, 0, 0, 10, 5, - 0, 0, 10, 5, 0, 0, 10, 1, 3, 4, - 5, 8, 10, 0, 3, 0, 1, 9, 10, 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 1, 3, 0, 1, 3, 0, 0, 6, 1, + 1, 1, 3, 3, 2, 4, 3, 1, 2, 1, + 1, 1, 1, 0, 0, 6, 4, 5, 0, 9, + 4, 2, 2, 3, 2, 3, 2, 2, 3, 3, + 3, 2, 0, 0, 6, 2, 0, 0, 6, 0, + 0, 6, 0, 0, 6, 1, 0, 0, 6, 0, + 0, 7, 1, 0, 0, 6, 0, 0, 7, 1, + 0, 0, 6, 0, 0, 7, 0, 0, 6, 0, + 0, 6, 1, 3, 3, 0, 0, 0, 9, 0, + 0, 0, 9, 0, 0, 0, 10, 1, 1, 1, + 1, 1, 3, 3, 5, 5, 6, 6, 8, 8, + 1, 1, 3, 5, 1, 2, 1, 0, 0, 1, + 0, 0, 10, 0, 0, 10, 0, 0, 9, 0, + 0, 7, 3, 1, 5, 0, 0, 10, 4, 0, + 0, 11, 0, 0, 11, 0, 0, 10, 5, 0, + 0, 9, 5, 0, 0, 10, 1, 3, 4, 5, + 7, 9, 0, 3, 0, 1, 9, 10, 9 }; @@ -4776,6 +4788,10 @@ yydestruct (const char *yymsg, { delete ((*yyvaluep).pExpression); } break; + case YYSYMBOL_optional_expr_map_tuple_list: /* optional_expr_map_tuple_list */ + { delete ((*yyvaluep).pExpression); } + break; + case YYSYMBOL_type_declaration_no_options_list: /* type_declaration_no_options_list */ { deleteTypeDeclarationList(((*yyvaluep).pTypeDeclList)); } break; @@ -5060,6 +5076,10 @@ yydestruct (const char *yymsg, { delete ((*yyvaluep).pExpression); } break; + case YYSYMBOL_optional_make_struct_dim_decl: /* optional_make_struct_dim_decl */ + { delete ((*yyvaluep).pExpression); } + break; + case YYSYMBOL_make_struct_decl: /* make_struct_decl */ { delete ((*yyvaluep).pExpression); } break; @@ -6621,29 +6641,37 @@ YYLTYPE yylloc = yyloc_default; { (yyval.pExpression) = nullptr; } break; - case 237: /* optional_expr_list: expr_list */ - { (yyval.pExpression) = (yyvsp[0].pExpression); } + case 237: /* optional_expr_list: expr_list optional_comma */ + { (yyval.pExpression) = (yyvsp[-1].pExpression); } + break; + + case 238: /* optional_expr_map_tuple_list: %empty */ + { (yyval.pExpression) = nullptr; } + break; + + case 239: /* optional_expr_map_tuple_list: expr_map_tuple_list optional_comma */ + { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 238: /* type_declaration_no_options_list: type_declaration */ + case 240: /* type_declaration_no_options_list: type_declaration */ { (yyval.pTypeDeclList) = new vector(); (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; - case 239: /* type_declaration_no_options_list: type_declaration_no_options_list "end of expression" type_declaration */ - { + case 241: /* type_declaration_no_options_list: type_declaration_no_options_list c_or_s type_declaration */ + { (yyval.pTypeDeclList) = (yyvsp[-2].pTypeDeclList); (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; - case 240: /* name_in_namespace: "name" */ + case 242: /* name_in_namespace: "name" */ { (yyval.s) = (yyvsp[0].s); } break; - case 241: /* name_in_namespace: "name" "::" "name" */ + case 243: /* name_in_namespace: "name" "::" "name" */ { auto ita = yyextra->das_module_alias.find(*(yyvsp[-2].s)); if ( ita == yyextra->das_module_alias.end() ) { @@ -6657,17 +6685,17 @@ YYLTYPE yylloc = yyloc_default; } break; - case 242: /* name_in_namespace: "::" "name" */ + case 244: /* name_in_namespace: "::" "name" */ { *(yyvsp[0].s) = "::" + *(yyvsp[0].s); (yyval.s) = (yyvsp[0].s); } break; - case 243: /* expression_delete: "delete" expr */ + case 245: /* expression_delete: "delete" expr */ { (yyval.pExpression) = new ExprDelete(tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 244: /* expression_delete: "delete" "explicit" expr */ + case 246: /* expression_delete: "delete" "explicit" expr */ { auto delExpr = new ExprDelete(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[0].pExpression))); delExpr->native = true; @@ -6675,41 +6703,41 @@ YYLTYPE yylloc = yyloc_default; } break; - case 245: /* $@3: %empty */ + case 247: /* $@3: %empty */ { yyextra->das_arrow_depth ++; } break; - case 246: /* $@4: %empty */ + case 248: /* $@4: %empty */ { yyextra->das_arrow_depth --; } break; - case 247: /* new_type_declaration: '<' $@3 type_declaration '>' $@4 */ + case 249: /* new_type_declaration: '<' $@3 type_declaration '>' $@4 */ { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 248: /* expr_new: "new" structure_type_declaration */ + case 250: /* expr_new: "new" structure_type_declaration */ { (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-1])),TypeDeclPtr((yyvsp[0].pTypeDecl)),true); } break; - case 249: /* expr_new: "new" structure_type_declaration '(' optional_expr_list ')' */ + case 251: /* expr_new: "new" structure_type_declaration '(' optional_expr_list ')' */ { auto pNew = new ExprNew(tokAt(scanner,(yylsp[-4])),TypeDeclPtr((yyvsp[-3].pTypeDecl)),true); (yyval.pExpression) = parseFunctionArguments(pNew,(yyvsp[-1].pExpression)); } break; - case 250: /* expr_new: "new" new_type_declaration '(' use_initializer ')' */ + case 252: /* expr_new: "new" new_type_declaration '(' use_initializer ')' */ { (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-4])),TypeDeclPtr((yyvsp[-3].pTypeDecl)),true); ((ExprNew *)(yyval.pExpression))->initializer = (yyvsp[-1].b); } break; - case 251: /* expr_new: "new" new_type_declaration '(' use_initializer make_struct_single ')' */ + case 253: /* expr_new: "new" new_type_declaration '(' use_initializer make_struct_single ')' */ { ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-4].pTypeDecl); @@ -6719,33 +6747,33 @@ YYLTYPE yylloc = yyloc_default; } break; - case 252: /* expr_new: "new" make_decl */ + case 254: /* expr_new: "new" make_decl */ { (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 253: /* expression_break: "break" */ + case 255: /* expression_break: "break" */ { (yyval.pExpression) = new ExprBreak(tokAt(scanner,(yylsp[0]))); } break; - case 254: /* expression_continue: "continue" */ + case 256: /* expression_continue: "continue" */ { (yyval.pExpression) = new ExprContinue(tokAt(scanner,(yylsp[0]))); } break; - case 255: /* expression_return: "return" */ + case 257: /* expression_return: "return" */ { (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[0])),nullptr); } break; - case 256: /* expression_return: "return" expr */ + case 258: /* expression_return: "return" expr */ { (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; - case 257: /* expression_return: "return" "<-" expr */ + case 259: /* expression_return: "return" "<-" expr */ { auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); pRet->moveSemantics = true; @@ -6753,13 +6781,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 258: /* expression_yield: "yield" expr */ + case 260: /* expression_yield: "yield" expr */ { (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 259: /* expression_yield: "yield" "<-" expr */ + case 261: /* expression_yield: "yield" "<-" expr */ { auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[0].pExpression))); pRet->moveSemantics = true; @@ -6767,41 +6795,41 @@ YYLTYPE yylloc = yyloc_default; } break; - case 260: /* expression_try_catch: "try" expression_block "recover" expression_block */ + case 262: /* expression_try_catch: "try" expression_block "recover" expression_block */ { (yyval.pExpression) = new ExprTryCatch(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 261: /* kwd_let_var_or_nothing: "let" */ + case 263: /* kwd_let_var_or_nothing: "let" */ { (yyval.b) = true; } break; - case 262: /* kwd_let_var_or_nothing: "var" */ + case 264: /* kwd_let_var_or_nothing: "var" */ { (yyval.b) = false; } break; - case 263: /* kwd_let_var_or_nothing: %empty */ + case 265: /* kwd_let_var_or_nothing: %empty */ { (yyval.b) = true; } break; - case 264: /* kwd_let: "let" */ + case 266: /* kwd_let: "let" */ { (yyval.b) = true; } break; - case 265: /* kwd_let: "var" */ + case 267: /* kwd_let: "var" */ { (yyval.b) = false; } break; - case 266: /* optional_in_scope: "inscope" */ + case 268: /* optional_in_scope: "inscope" */ { (yyval.b) = true; } break; - case 267: /* optional_in_scope: %empty */ + case 269: /* optional_in_scope: %empty */ { (yyval.b) = false; } break; - case 268: /* tuple_expansion: "name" */ + case 270: /* tuple_expansion: "name" */ { (yyval.pNameList) = new vector(); (yyval.pNameList)->push_back(*(yyvsp[0].s)); @@ -6809,7 +6837,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 269: /* tuple_expansion: tuple_expansion ',' "name" */ + case 271: /* tuple_expansion: tuple_expansion ',' "name" */ { (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); delete (yyvsp[0].s); @@ -6817,7 +6845,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 270: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 272: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -6826,7 +6854,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 271: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' optional_ref copy_or_move_or_clone expr "end of expression" */ + case 273: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-5])); @@ -6838,41 +6866,41 @@ YYLTYPE yylloc = yyloc_default; } break; - case 272: /* expression_let: kwd_let optional_in_scope let_variable_declaration */ + case 274: /* expression_let: kwd_let optional_in_scope let_variable_declaration */ { (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; - case 273: /* expression_let: kwd_let optional_in_scope tuple_expansion_variable_declaration */ + case 275: /* expression_let: kwd_let optional_in_scope tuple_expansion_variable_declaration */ { (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; - case 274: /* $@5: %empty */ + case 276: /* $@5: %empty */ { yyextra->das_arrow_depth ++; } break; - case 275: /* $@6: %empty */ + case 277: /* $@6: %empty */ { yyextra->das_arrow_depth --; } break; - case 276: /* expr_cast: "cast" '<' $@5 type_declaration_no_options '>' $@6 expr */ + case 278: /* expr_cast: "cast" '<' $@5 type_declaration_no_options '>' $@6 expr */ { (yyval.pExpression) = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); } break; - case 277: /* $@7: %empty */ + case 279: /* $@7: %empty */ { yyextra->das_arrow_depth ++; } break; - case 278: /* $@8: %empty */ + case 280: /* $@8: %empty */ { yyextra->das_arrow_depth --; } break; - case 279: /* expr_cast: "upcast" '<' $@7 type_declaration_no_options '>' $@8 expr */ + case 281: /* expr_cast: "upcast" '<' $@7 type_declaration_no_options '>' $@8 expr */ { auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); pCast->upcast = true; @@ -6880,15 +6908,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 280: /* $@9: %empty */ + case 282: /* $@9: %empty */ { yyextra->das_arrow_depth ++; } break; - case 281: /* $@10: %empty */ + case 283: /* $@10: %empty */ { yyextra->das_arrow_depth --; } break; - case 282: /* expr_cast: "reinterpret" '<' $@9 type_declaration_no_options '>' $@10 expr */ + case 284: /* expr_cast: "reinterpret" '<' $@9 type_declaration_no_options '>' $@10 expr */ { auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); pCast->reinterpret = true; @@ -6896,21 +6924,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 283: /* $@11: %empty */ + case 285: /* $@11: %empty */ { yyextra->das_arrow_depth ++; } break; - case 284: /* $@12: %empty */ + case 286: /* $@12: %empty */ { yyextra->das_arrow_depth --; } break; - case 285: /* expr_type_decl: "type" '<' $@11 type_declaration '>' $@12 */ + case 287: /* expr_type_decl: "type" '<' $@11 type_declaration '>' $@12 */ { (yyval.pExpression) = new ExprTypeDecl(tokAt(scanner,(yylsp[-5])),TypeDeclPtr((yyvsp[-2].pTypeDecl))); } break; - case 286: /* expr_type_info: "typeinfo" name_in_namespace '(' expr ')' */ + case 288: /* expr_type_info: "typeinfo" name_in_namespace '(' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -6923,7 +6951,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 287: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" '>' '(' expr ')' */ + case 289: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" '>' '(' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -6937,8 +6965,8 @@ YYLTYPE yylloc = yyloc_default; } break; - case 288: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" "end of expression" "name" '>' '(' expr ')' */ - { + case 290: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" c_or_s "name" '>' '(' expr ')' */ + { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-8].s),ptd->typeexpr,*(yyvsp[-6].s),*(yyvsp[-4].s)); @@ -6952,23 +6980,23 @@ YYLTYPE yylloc = yyloc_default; } break; - case 289: /* expr_list: expr */ + case 291: /* expr_list: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 290: /* expr_list: expr_list ',' expr */ + case 292: /* expr_list: expr_list ',' expr */ { (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 291: /* block_or_simple_block: expression_block */ + case 293: /* block_or_simple_block: expression_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 292: /* block_or_simple_block: "=>" expr */ + case 294: /* block_or_simple_block: "=>" expr */ { auto retE = make_smart(tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[0].pExpression))); auto blkE = new ExprBlock(); @@ -6978,7 +7006,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 293: /* block_or_simple_block: "=>" "<-" expr */ + case 295: /* block_or_simple_block: "=>" "<-" expr */ { auto retE = make_smart(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[0].pExpression))); retE->moveSemantics = true; @@ -6989,35 +7017,35 @@ YYLTYPE yylloc = yyloc_default; } break; - case 294: /* block_or_lambda: '$' */ + case 296: /* block_or_lambda: '$' */ { (yyval.i) = 0; /* block */ } break; - case 295: /* block_or_lambda: '@' */ + case 297: /* block_or_lambda: '@' */ { (yyval.i) = 1; /* lambda */ } break; - case 296: /* block_or_lambda: '@' '@' */ + case 298: /* block_or_lambda: '@' '@' */ { (yyval.i) = 2; /* local function */ } break; - case 297: /* capture_entry: '&' "name" */ + case 299: /* capture_entry: '&' "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_reference); delete (yyvsp[0].s); } break; - case 298: /* capture_entry: '=' "name" */ + case 300: /* capture_entry: '=' "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_copy); delete (yyvsp[0].s); } break; - case 299: /* capture_entry: "<-" "name" */ + case 301: /* capture_entry: "<-" "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_move); delete (yyvsp[0].s); } break; - case 300: /* capture_entry: ":=" "name" */ + case 302: /* capture_entry: ":=" "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_clone); delete (yyvsp[0].s); } break; - case 301: /* capture_list: capture_entry */ + case 303: /* capture_list: capture_entry */ { (yyval.pCaptList) = new vector(); (yyval.pCaptList)->push_back(*(yyvsp[0].pCapt)); @@ -7025,7 +7053,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 302: /* capture_list: capture_list ',' capture_entry */ + case 304: /* capture_list: capture_list ',' capture_entry */ { (yyvsp[-2].pCaptList)->push_back(*(yyvsp[0].pCapt)); delete (yyvsp[0].pCapt); @@ -7033,137 +7061,137 @@ YYLTYPE yylloc = yyloc_default; } break; - case 303: /* optional_capture_list: %empty */ + case 305: /* optional_capture_list: %empty */ { (yyval.pCaptList) = nullptr; } break; - case 304: /* optional_capture_list: "capture" '(' capture_list ')' */ + case 306: /* optional_capture_list: "capture" '(' capture_list ')' */ { (yyval.pCaptList) = (yyvsp[-1].pCaptList); } break; - case 305: /* expr_full_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ + case 307: /* expr_full_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ { (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4]))); } break; - case 306: /* expr_full_block_assumed_piped: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type expression_block */ + case 308: /* expr_full_block_assumed_piped: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type expression_block */ { (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4]))); } break; - case 307: /* expr_full_block_assumed_piped: "begin of code block" expressions "end of code block" */ + case 309: /* expr_full_block_assumed_piped: "begin of code block" expressions "end of code block" */ { (yyval.pExpression) = ast_makeBlock(scanner,0,nullptr,nullptr,nullptr,new TypeDecl(Type::autoinfer),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-1])),tokAt(scanner,(yylsp[-1]))); } break; - case 308: /* expr_numeric_const: "integer constant" */ + case 310: /* expr_numeric_const: "integer constant" */ { (yyval.pExpression) = new ExprConstInt(tokAt(scanner,(yylsp[0])),(int32_t)(yyvsp[0].i)); } break; - case 309: /* expr_numeric_const: "unsigned integer constant" */ + case 311: /* expr_numeric_const: "unsigned integer constant" */ { (yyval.pExpression) = new ExprConstUInt(tokAt(scanner,(yylsp[0])),(uint32_t)(yyvsp[0].ui)); } break; - case 310: /* expr_numeric_const: "long integer constant" */ + case 312: /* expr_numeric_const: "long integer constant" */ { (yyval.pExpression) = new ExprConstInt64(tokAt(scanner,(yylsp[0])),(int64_t)(yyvsp[0].i64)); } break; - case 311: /* expr_numeric_const: "unsigned long integer constant" */ + case 313: /* expr_numeric_const: "unsigned long integer constant" */ { (yyval.pExpression) = new ExprConstUInt64(tokAt(scanner,(yylsp[0])),(uint64_t)(yyvsp[0].ui64)); } break; - case 312: /* expr_numeric_const: "unsigned int8 constant" */ + case 314: /* expr_numeric_const: "unsigned int8 constant" */ { (yyval.pExpression) = new ExprConstUInt8(tokAt(scanner,(yylsp[0])),(uint8_t)(yyvsp[0].ui)); } break; - case 313: /* expr_numeric_const: "floating point constant" */ + case 315: /* expr_numeric_const: "floating point constant" */ { (yyval.pExpression) = new ExprConstFloat(tokAt(scanner,(yylsp[0])),(float)(yyvsp[0].fd)); } break; - case 314: /* expr_numeric_const: "double constant" */ + case 316: /* expr_numeric_const: "double constant" */ { (yyval.pExpression) = new ExprConstDouble(tokAt(scanner,(yylsp[0])),(double)(yyvsp[0].d)); } break; - case 315: /* expr_assign: expr */ + case 317: /* expr_assign: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 316: /* expr_assign: expr '=' expr */ + case 318: /* expr_assign: expr '=' expr */ { (yyval.pExpression) = new ExprCopy(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 317: /* expr_assign: expr "<-" expr */ + case 319: /* expr_assign: expr "<-" expr */ { (yyval.pExpression) = new ExprMove(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 318: /* expr_assign: expr ":=" expr */ + case 320: /* expr_assign: expr ":=" expr */ { (yyval.pExpression) = new ExprClone(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 319: /* expr_assign: expr "&=" expr */ + case 321: /* expr_assign: expr "&=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 320: /* expr_assign: expr "|=" expr */ + case 322: /* expr_assign: expr "|=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"|=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 321: /* expr_assign: expr "^=" expr */ + case 323: /* expr_assign: expr "^=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 322: /* expr_assign: expr "&&=" expr */ + case 324: /* expr_assign: expr "&&=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 323: /* expr_assign: expr "||=" expr */ + case 325: /* expr_assign: expr "||=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"||=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 324: /* expr_assign: expr "^^=" expr */ + case 326: /* expr_assign: expr "^^=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 325: /* expr_assign: expr "+=" expr */ + case 327: /* expr_assign: expr "+=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"+=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 326: /* expr_assign: expr "-=" expr */ + case 328: /* expr_assign: expr "-=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"-=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 327: /* expr_assign: expr "*=" expr */ + case 329: /* expr_assign: expr "*=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"*=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 328: /* expr_assign: expr "/=" expr */ + case 330: /* expr_assign: expr "/=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"/=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 329: /* expr_assign: expr "%=" expr */ + case 331: /* expr_assign: expr "%=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"%=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 330: /* expr_assign: expr "<<=" expr */ + case 332: /* expr_assign: expr "<<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 331: /* expr_assign: expr ">>=" expr */ + case 333: /* expr_assign: expr ">>=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 332: /* expr_assign: expr "<<<=" expr */ + case 334: /* expr_assign: expr "<<<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 333: /* expr_assign: expr ">>>=" expr */ + case 335: /* expr_assign: expr ">>>=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 334: /* expr_named_call: name_in_namespace '(' '[' make_struct_fields ']' ')' */ + case 336: /* expr_named_call: name_in_namespace '(' '[' make_struct_fields ']' ')' */ { auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); nc->arguments = *(yyvsp[-2].pMakeStruct); @@ -7173,7 +7201,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 335: /* expr_named_call: name_in_namespace '(' expr_list ',' '[' make_struct_fields ']' ')' */ + case 337: /* expr_named_call: name_in_namespace '(' expr_list ',' '[' make_struct_fields ']' ')' */ { auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-7])),*(yyvsp[-7].s)); nc->nonNamedArguments = sequenceToList((yyvsp[-5].pExpression)); @@ -7184,7 +7212,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 336: /* expr_method_call: expr "->" "name" '(' ')' */ + case 338: /* expr_method_call: expr "->" "name" '(' ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); delete (yyvsp[-2].s); @@ -7192,7 +7220,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 337: /* expr_method_call: expr "->" "name" '(' expr_list ')' */ + case 339: /* expr_method_call: expr "->" "name" '(' expr_list ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); auto callArgs = sequenceToList((yyvsp[-1].pExpression)); @@ -7202,35 +7230,35 @@ YYLTYPE yylloc = yyloc_default; } break; - case 338: /* func_addr_name: name_in_namespace */ + case 340: /* func_addr_name: name_in_namespace */ { (yyval.pExpression) = new ExprAddr(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 339: /* func_addr_name: "$i" '(' expr ')' */ + case 341: /* func_addr_name: "$i" '(' expr ')' */ { auto expr = new ExprAddr(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``ADDR``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression), expr, "i"); } break; - case 340: /* func_addr_expr: '@' '@' func_addr_name */ + case 342: /* func_addr_expr: '@' '@' func_addr_name */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 341: /* $@13: %empty */ + case 343: /* $@13: %empty */ { yyextra->das_arrow_depth ++; } break; - case 342: /* $@14: %empty */ + case 344: /* $@14: %empty */ { yyextra->das_arrow_depth --; } break; - case 343: /* func_addr_expr: '@' '@' '<' $@13 type_declaration_no_options '>' $@14 func_addr_name */ + case 345: /* func_addr_expr: '@' '@' '<' $@13 type_declaration_no_options '>' $@14 func_addr_name */ { auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value.get())); expr->funcType = TypeDeclPtr((yyvsp[-3].pTypeDecl)); @@ -7238,15 +7266,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 344: /* $@15: %empty */ + case 346: /* $@15: %empty */ { yyextra->das_arrow_depth ++; } break; - case 345: /* $@16: %empty */ + case 347: /* $@16: %empty */ { yyextra->das_arrow_depth --; } break; - case 346: /* func_addr_expr: '@' '@' '<' $@15 optional_function_argument_list optional_function_type '>' $@16 func_addr_name */ + case 348: /* func_addr_expr: '@' '@' '<' $@15 optional_function_argument_list optional_function_type '>' $@16 func_addr_name */ { auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value.get())); expr->funcType = make_smart(Type::tFunction); @@ -7259,21 +7287,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 347: /* expr_field: expr '.' "name" */ + case 349: /* expr_field: expr '.' "name" */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-2].pExpression)), *(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 348: /* expr_field: expr '.' '.' "name" */ + case 350: /* expr_field: expr '.' '.' "name" */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-3].pExpression)), *(yyvsp[0].s), true); delete (yyvsp[0].s); } break; - case 349: /* expr_field: expr '.' "name" '(' ')' */ + case 351: /* expr_field: expr '.' "name" '(' ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); delete (yyvsp[-2].s); @@ -7281,7 +7309,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 350: /* expr_field: expr '.' "name" '(' expr_list ')' */ + case 352: /* expr_field: expr '.' "name" '(' expr_list ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); auto callArgs = sequenceToList((yyvsp[-1].pExpression)); @@ -7291,29 +7319,42 @@ YYLTYPE yylloc = yyloc_default; } break; - case 351: /* $@17: %empty */ + case 353: /* $@17: %empty */ { yyextra->das_suppress_errors=true; } break; - case 352: /* $@18: %empty */ + case 354: /* $@18: %empty */ { yyextra->das_suppress_errors=false; } break; - case 353: /* expr_field: expr '.' $@17 error $@18 */ + case 355: /* expr_field: expr '.' $@17 error $@18 */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-3])), ExpressionPtr((yyvsp[-4].pExpression)), ""); yyerrok; } break; - case 354: /* expr_call: name_in_namespace '(' ')' */ + case 356: /* expr_call: name_in_namespace '(' ')' */ { (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),*(yyvsp[-2].s)); delete (yyvsp[-2].s); } break; - case 355: /* expr_call: name_in_namespace '(' make_struct_single ')' */ + case 357: /* expr_call: name_in_namespace '(' "uninitialized" ')' */ + { + auto dd = new ExprMakeStruct(tokAt(scanner,(yylsp[-3]))); + dd->at = tokAt(scanner,(yylsp[-3])); + dd->makeType = new TypeDecl(Type::alias); + dd->makeType->alias = *(yyvsp[-3].s); + dd->useInitializer = false; + dd->alwaysUseInitializer = true; + delete (yyvsp[-3].s); + (yyval.pExpression) = dd; + } + break; + + case 358: /* expr_call: name_in_namespace '(' make_struct_single ')' */ { ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); @@ -7325,166 +7366,178 @@ YYLTYPE yylloc = yyloc_default; } break; - case 356: /* expr_call: name_in_namespace '(' expr_list ')' */ + case 359: /* expr_call: name_in_namespace '(' "uninitialized" make_struct_single ')' */ + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-4].s); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + delete (yyvsp[-4].s); + (yyval.pExpression) = (yyvsp[-1].pExpression); + } + break; + + case 360: /* expr_call: name_in_namespace '(' expr_list ')' */ { (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),*(yyvsp[-3].s)),(yyvsp[-1].pExpression)); delete (yyvsp[-3].s); } break; - case 357: /* expr_call: basic_type_declaration '(' ')' */ + case 361: /* expr_call: basic_type_declaration '(' ')' */ { (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-2].type))); } break; - case 358: /* expr_call: basic_type_declaration '(' expr_list ')' */ + case 362: /* expr_call: basic_type_declaration '(' expr_list ')' */ { (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-3].type))),(yyvsp[-1].pExpression)); } break; - case 359: /* expr: "null" */ + case 363: /* expr: "null" */ { (yyval.pExpression) = new ExprConstPtr(tokAt(scanner,(yylsp[0])),nullptr); } break; - case 360: /* expr: name_in_namespace */ + case 364: /* expr: name_in_namespace */ { (yyval.pExpression) = new ExprVar(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 361: /* expr: expr_numeric_const */ + case 365: /* expr: expr_numeric_const */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 362: /* expr: expr_reader */ + case 366: /* expr: expr_reader */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 363: /* expr: string_builder */ + case 367: /* expr: string_builder */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 364: /* expr: make_decl */ + case 368: /* expr: make_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 365: /* expr: "true" */ + case 369: /* expr: "true" */ { (yyval.pExpression) = new ExprConstBool(tokAt(scanner,(yylsp[0])),true); } break; - case 366: /* expr: "false" */ + case 370: /* expr: "false" */ { (yyval.pExpression) = new ExprConstBool(tokAt(scanner,(yylsp[0])),false); } break; - case 367: /* expr: expr_field */ + case 371: /* expr: expr_field */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 368: /* expr: expr_mtag */ + case 372: /* expr: expr_mtag */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 369: /* expr: '!' expr */ + case 373: /* expr: '!' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"!",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 370: /* expr: '~' expr */ + case 374: /* expr: '~' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"~",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 371: /* expr: '+' expr */ + case 375: /* expr: '+' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"+",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 372: /* expr: '-' expr */ + case 376: /* expr: '-' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"-",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 373: /* expr: expr "<<" expr */ + case 377: /* expr: expr "<<" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 374: /* expr: expr ">>" expr */ + case 378: /* expr: expr ">>" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 375: /* expr: expr "<<<" expr */ + case 379: /* expr: expr "<<<" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 376: /* expr: expr ">>>" expr */ + case 380: /* expr: expr ">>>" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>>", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 377: /* expr: expr '+' expr */ + case 381: /* expr: expr '+' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"+", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 378: /* expr: expr '-' expr */ + case 382: /* expr: expr '-' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"-", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 379: /* expr: expr '*' expr */ + case 383: /* expr: expr '*' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"*", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 380: /* expr: expr '/' expr */ + case 384: /* expr: expr '/' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"/", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 381: /* expr: expr '%' expr */ + case 385: /* expr: expr '%' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"%", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 382: /* expr: expr '<' expr */ + case 386: /* expr: expr '<' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 383: /* expr: expr '>' expr */ + case 387: /* expr: expr '>' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 384: /* expr: expr "==" expr */ + case 388: /* expr: expr "==" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"==", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 385: /* expr: expr "!=" expr */ + case 389: /* expr: expr "!=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"!=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 386: /* expr: expr "<=" expr */ + case 390: /* expr: expr "<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 387: /* expr: expr ">=" expr */ + case 391: /* expr: expr ">=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 388: /* expr: expr '&' expr */ + case 392: /* expr: expr '&' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 389: /* expr: expr '|' expr */ + case 393: /* expr: expr '|' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"|", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 390: /* expr: expr '^' expr */ + case 394: /* expr: expr '^' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 391: /* expr: expr "&&" expr */ + case 395: /* expr: expr "&&" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&&", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 392: /* expr: expr "||" expr */ + case 396: /* expr: expr "||" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"||", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 393: /* expr: expr "^^" expr */ + case 397: /* expr: expr "^^" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^^", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 394: /* expr: expr ".." expr */ + case 398: /* expr: expr ".." expr */ { auto itv = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-1])),"interval"); itv->arguments.push_back(ExpressionPtr((yyvsp[-2].pExpression))); @@ -7493,23 +7546,23 @@ YYLTYPE yylloc = yyloc_default; } break; - case 395: /* expr: "++" expr */ + case 399: /* expr: "++" expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"++", ExpressionPtr((yyvsp[0].pExpression))); } break; - case 396: /* expr: "--" expr */ + case 400: /* expr: "--" expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"--", ExpressionPtr((yyvsp[0].pExpression))); } break; - case 397: /* expr: expr "++" */ + case 401: /* expr: expr "++" */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[0])),"+++", ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 398: /* expr: expr "--" */ + case 402: /* expr: expr "--" */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[0])),"---", ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 399: /* expr: '(' expr_list optional_comma ')' */ + case 403: /* expr: '(' expr_list optional_comma ')' */ { if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); @@ -7525,63 +7578,63 @@ YYLTYPE yylloc = yyloc_default; } break; - case 400: /* expr: expr '[' expr ']' */ + case 404: /* expr: expr '[' expr ']' */ { (yyval.pExpression) = new ExprAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-3].pExpression)), ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 401: /* expr: expr '.' '[' expr ']' */ + case 405: /* expr: expr '.' '[' expr ']' */ { (yyval.pExpression) = new ExprAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-4].pExpression)), ExpressionPtr((yyvsp[-1].pExpression)), true); } break; - case 402: /* expr: expr "?[" expr ']' */ + case 406: /* expr: expr "?[" expr ']' */ { (yyval.pExpression) = new ExprSafeAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-3].pExpression)), ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 403: /* expr: expr '.' "?[" expr ']' */ + case 407: /* expr: expr '.' "?[" expr ']' */ { (yyval.pExpression) = new ExprSafeAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-4].pExpression)), ExpressionPtr((yyvsp[-1].pExpression)), true); } break; - case 404: /* expr: expr "?." "name" */ + case 408: /* expr: expr "?." "name" */ { (yyval.pExpression) = new ExprSafeField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-2].pExpression)), *(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 405: /* expr: expr '.' "?." "name" */ + case 409: /* expr: expr '.' "?." "name" */ { (yyval.pExpression) = new ExprSafeField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-3].pExpression)), *(yyvsp[0].s), true); delete (yyvsp[0].s); } break; - case 406: /* expr: func_addr_expr */ + case 410: /* expr: func_addr_expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 407: /* expr: expr_call */ + case 411: /* expr: expr_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 408: /* expr: '*' expr */ + case 412: /* expr: '*' expr */ { (yyval.pExpression) = new ExprPtr2Ref(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 409: /* expr: "deref" '(' expr ')' */ + case 413: /* expr: "deref" '(' expr ')' */ { (yyval.pExpression) = new ExprPtr2Ref(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 410: /* expr: "addr" '(' expr ')' */ + case 414: /* expr: "addr" '(' expr ')' */ { (yyval.pExpression) = new ExprRef2Ptr(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 411: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' ')' */ + case 415: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' ')' */ { (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-4].pTypeDecl),(yyvsp[-2].pCaptList),nullptr,tokAt(scanner,(yylsp[-6]))); } break; - case 412: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' expr ')' */ + case 416: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' expr ')' */ { (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-5].pTypeDecl),(yyvsp[-3].pCaptList),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-7]))); } break; - case 413: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list expression_block */ + case 417: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list expression_block */ { auto closure = new ExprMakeBlock(tokAt(scanner,(yylsp[0])),ExpressionPtr((yyvsp[0].pExpression))); ((ExprBlock *)(yyvsp[0].pExpression))->returnType = make_smart(Type::autoinfer); @@ -7589,31 +7642,31 @@ YYLTYPE yylloc = yyloc_default; } break; - case 414: /* expr: expr "??" expr */ + case 418: /* expr: expr "??" expr */ { (yyval.pExpression) = new ExprNullCoalescing(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 415: /* expr: expr '?' expr ':' expr */ + case 419: /* expr: expr '?' expr ':' expr */ { (yyval.pExpression) = new ExprOp3(tokAt(scanner,(yylsp[-3])),"?",ExpressionPtr((yyvsp[-4].pExpression)),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 416: /* $@19: %empty */ + case 420: /* $@19: %empty */ { yyextra->das_arrow_depth ++; } break; - case 417: /* $@20: %empty */ + case 421: /* $@20: %empty */ { yyextra->das_arrow_depth --; } break; - case 418: /* expr: expr "is" "type" '<' $@19 type_declaration_no_options '>' $@20 */ + case 422: /* expr: expr "is" "type" '<' $@19 type_declaration_no_options '>' $@20 */ { (yyval.pExpression) = new ExprIs(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-7].pExpression)),TypeDeclPtr((yyvsp[-2].pTypeDecl))); } break; - case 419: /* expr: expr "is" basic_type_declaration */ + case 423: /* expr: expr "is" basic_type_declaration */ { auto vdecl = new TypeDecl((yyvsp[0].type)); vdecl->at = tokAt(scanner,(yylsp[0])); @@ -7621,29 +7674,29 @@ YYLTYPE yylloc = yyloc_default; } break; - case 420: /* expr: expr "is" "name" */ + case 424: /* expr: expr "is" "name" */ { (yyval.pExpression) = new ExprIsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 421: /* expr: expr "as" "name" */ + case 425: /* expr: expr "as" "name" */ { (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 422: /* $@21: %empty */ + case 426: /* $@21: %empty */ { yyextra->das_arrow_depth ++; } break; - case 423: /* $@22: %empty */ + case 427: /* $@22: %empty */ { yyextra->das_arrow_depth --; } break; - case 424: /* expr: expr "as" "type" '<' $@21 type_declaration '>' $@22 */ + case 428: /* expr: expr "as" "type" '<' $@21 type_declaration '>' $@22 */ { auto vname = (yyvsp[-2].pTypeDecl)->describe(); (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-7].pExpression)),vname); @@ -7651,28 +7704,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 425: /* expr: expr "as" basic_type_declaration */ + case 429: /* expr: expr "as" basic_type_declaration */ { (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),das_to_string((yyvsp[0].type))); } break; - case 426: /* expr: expr '?' "as" "name" */ + case 430: /* expr: expr '?' "as" "name" */ { (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-3].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 427: /* $@23: %empty */ + case 431: /* $@23: %empty */ { yyextra->das_arrow_depth ++; } break; - case 428: /* $@24: %empty */ + case 432: /* $@24: %empty */ { yyextra->das_arrow_depth --; } break; - case 429: /* expr: expr '?' "as" "type" '<' $@23 type_declaration '>' $@24 */ + case 433: /* expr: expr '?' "as" "type" '<' $@23 type_declaration '>' $@24 */ { auto vname = (yyvsp[-2].pTypeDecl)->describe(); (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-8].pExpression)),vname); @@ -7680,202 +7733,210 @@ YYLTYPE yylloc = yyloc_default; } break; - case 430: /* expr: expr '?' "as" basic_type_declaration */ + case 434: /* expr: expr '?' "as" basic_type_declaration */ { (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-3].pExpression)),das_to_string((yyvsp[0].type))); } break; - case 431: /* expr: expr_type_info */ + case 435: /* expr: expr_type_info */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 432: /* expr: expr_type_decl */ + case 436: /* expr: expr_type_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 433: /* expr: expr_cast */ + case 437: /* expr: expr_cast */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 434: /* expr: expr_new */ + case 438: /* expr: expr_new */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 435: /* expr: expr_method_call */ + case 439: /* expr: expr_method_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 436: /* expr: expr_named_call */ + case 440: /* expr: expr_named_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 437: /* expr: expr_full_block */ + case 441: /* expr: expr_full_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 438: /* expr: expr "<|" expr */ + case 442: /* expr: expr "<|" expr */ { (yyval.pExpression) = ast_lpipe(scanner,(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-1]))); } break; - case 439: /* expr: expr "|>" expr */ + case 443: /* expr: expr "|>" expr */ { (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-1]))); } break; - case 440: /* expr: expr "|>" basic_type_declaration */ + case 444: /* expr: expr "|>" basic_type_declaration */ { auto fncall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[0].type))); (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),fncall,tokAt(scanner,(yylsp[-1]))); } break; - case 441: /* expr: expr_call_pipe */ + case 445: /* expr: expr_call_pipe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 442: /* expr_mtag: "$$" '(' expr ')' */ + case 446: /* expr: "unsafe" '(' expr ')' */ + { + (yyvsp[-1].pExpression)->alwaysSafe = true; + (yyvsp[-1].pExpression)->userSaidItsSafe = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); + } + break; + + case 447: /* expr_mtag: "$$" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"e"); } break; - case 443: /* expr_mtag: "$i" '(' expr ')' */ + case 448: /* expr_mtag: "$i" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"i"); } break; - case 444: /* expr_mtag: "$v" '(' expr ')' */ + case 449: /* expr_mtag: "$v" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"v"); } break; - case 445: /* expr_mtag: "$b" '(' expr ')' */ + case 450: /* expr_mtag: "$b" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"b"); } break; - case 446: /* expr_mtag: "$a" '(' expr ')' */ + case 451: /* expr_mtag: "$a" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"a"); } break; - case 447: /* expr_mtag: "..." */ + case 452: /* expr_mtag: "..." */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[0])),nullptr,"..."); } break; - case 448: /* expr_mtag: "$c" '(' expr ')' '(' ')' */ + case 453: /* expr_mtag: "$c" '(' expr ')' '(' ')' */ { auto ccall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-5])),(yyvsp[-3].pExpression),ccall,"c"); } break; - case 449: /* expr_mtag: "$c" '(' expr ')' '(' expr_list ')' */ + case 454: /* expr_mtag: "$c" '(' expr ')' '(' expr_list ')' */ { auto ccall = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"),(yyvsp[-1].pExpression)); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-6])),(yyvsp[-4].pExpression),ccall,"c"); } break; - case 450: /* expr_mtag: expr '.' "$f" '(' expr ')' */ + case 455: /* expr_mtag: expr '.' "$f" '(' expr ')' */ { auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-5].pExpression)), "``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 451: /* expr_mtag: expr "?." "$f" '(' expr ')' */ + case 456: /* expr_mtag: expr "?." "$f" '(' expr ')' */ { auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-5].pExpression)), "``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 452: /* expr_mtag: expr '.' '.' "$f" '(' expr ')' */ + case 457: /* expr_mtag: expr '.' '.' "$f" '(' expr ')' */ { auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-6].pExpression)), "``MACRO``TAG``FIELD``", true); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 453: /* expr_mtag: expr '.' "?." "$f" '(' expr ')' */ + case 458: /* expr_mtag: expr '.' "?." "$f" '(' expr ')' */ { auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-6].pExpression)), "``MACRO``TAG``FIELD``", true); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 454: /* expr_mtag: expr "as" "$f" '(' expr ')' */ + case 459: /* expr_mtag: expr "as" "$f" '(' expr ')' */ { auto cfield = new ExprAsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-5].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 455: /* expr_mtag: expr '?' "as" "$f" '(' expr ')' */ + case 460: /* expr_mtag: expr '?' "as" "$f" '(' expr ')' */ { auto cfield = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-6].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 456: /* expr_mtag: expr "is" "$f" '(' expr ')' */ + case 461: /* expr_mtag: expr "is" "$f" '(' expr ')' */ { auto cfield = new ExprIsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-5].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 457: /* expr_mtag: '@' '@' "$c" '(' expr ')' */ + case 462: /* expr_mtag: '@' '@' "$c" '(' expr ')' */ { auto ccall = new ExprAddr(tokAt(scanner,(yylsp[-4])),"``MACRO``TAG``ADDR``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-3])),(yyvsp[-1].pExpression),ccall,"c"); } break; - case 458: /* optional_field_annotation: %empty */ + case 463: /* optional_field_annotation: %empty */ { (yyval.aaList) = nullptr; } break; - case 459: /* optional_field_annotation: metadata_argument_list */ + case 464: /* optional_field_annotation: metadata_argument_list */ { (yyval.aaList) = (yyvsp[0].aaList); } break; - case 460: /* optional_override: %empty */ + case 465: /* optional_override: %empty */ { (yyval.i) = OVERRIDE_NONE; } break; - case 461: /* optional_override: "override" */ + case 466: /* optional_override: "override" */ { (yyval.i) = OVERRIDE_OVERRIDE; } break; - case 462: /* optional_override: "sealed" */ + case 467: /* optional_override: "sealed" */ { (yyval.i) = OVERRIDE_SEALED; } break; - case 463: /* optional_constant: %empty */ + case 468: /* optional_constant: %empty */ { (yyval.b) = false; } break; - case 464: /* optional_constant: "const" */ + case 469: /* optional_constant: "const" */ { (yyval.b) = true; } break; - case 465: /* optional_public_or_private_member_variable: %empty */ + case 470: /* optional_public_or_private_member_variable: %empty */ { (yyval.b) = false; } break; - case 466: /* optional_public_or_private_member_variable: "public" */ + case 471: /* optional_public_or_private_member_variable: "public" */ { (yyval.b) = false; } break; - case 467: /* optional_public_or_private_member_variable: "private" */ + case 472: /* optional_public_or_private_member_variable: "private" */ { (yyval.b) = true; } break; - case 468: /* optional_static_member_variable: %empty */ + case 473: /* optional_static_member_variable: %empty */ { (yyval.b) = false; } break; - case 469: /* optional_static_member_variable: "static" */ + case 474: /* optional_static_member_variable: "static" */ { (yyval.b) = true; } break; - case 470: /* structure_variable_declaration: optional_field_annotation optional_static_member_variable optional_override optional_public_or_private_member_variable variable_declaration */ + case 475: /* structure_variable_declaration: optional_field_annotation optional_static_member_variable optional_override optional_public_or_private_member_variable variable_declaration */ { (yyvsp[0].pVarDecl)->override = (yyvsp[-2].i) == OVERRIDE_OVERRIDE; (yyvsp[0].pVarDecl)->sealed = (yyvsp[-2].i) == OVERRIDE_SEALED; @@ -7886,13 +7947,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 471: /* struct_variable_declaration_list: %empty */ + case 476: /* struct_variable_declaration_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 472: /* $@25: %empty */ + case 477: /* $@25: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -7901,7 +7962,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 473: /* struct_variable_declaration_list: struct_variable_declaration_list $@25 structure_variable_declaration "end of expression" */ + case 478: /* struct_variable_declaration_list: struct_variable_declaration_list $@25 structure_variable_declaration "end of expression" */ { (yyval.pVarDeclList) = (yyvsp[-3].pVarDeclList); if ( (yyvsp[-1].pVarDecl) ) (yyvsp[-3].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); @@ -7917,7 +7978,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 474: /* $@26: %empty */ + case 479: /* $@26: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-2])); @@ -7926,7 +7987,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 475: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable "abstract" optional_constant $@26 function_declaration_header "end of expression" */ + case 480: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable "abstract" optional_constant $@26 function_declaration_header "end of expression" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -7936,7 +7997,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 476: /* $@27: %empty */ + case 481: /* $@27: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -7945,7 +8006,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 477: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable optional_static_member_variable optional_override optional_constant $@27 function_declaration_header expression_block */ + case 482: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable optional_static_member_variable optional_override optional_constant $@27 function_declaration_header expression_block */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -7955,7 +8016,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 478: /* function_argument_declaration: optional_field_annotation kwd_let_var_or_nothing variable_declaration */ + case 483: /* function_argument_declaration: optional_field_annotation kwd_let_var_or_nothing variable_declaration */ { (yyval.pVarDecl) = (yyvsp[0].pVarDecl); if ( (yyvsp[-1].b) ) { @@ -7967,7 +8028,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 479: /* function_argument_declaration: "$a" '(' expr ')' */ + case 484: /* function_argument_declaration: "$a" '(' expr ')' */ { auto na = new vector(); na->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1]))}); @@ -7977,21 +8038,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 480: /* function_argument_list: function_argument_declaration */ + case 485: /* function_argument_list: function_argument_declaration */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 481: /* function_argument_list: function_argument_list "end of expression" function_argument_declaration */ + case 486: /* function_argument_list: function_argument_list "end of expression" function_argument_declaration */ { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 482: /* tuple_type: type_declaration */ + case 487: /* tuple_type: type_declaration */ { (yyval.pVarDecl) = new VariableDeclaration(nullptr,(yyvsp[0].pTypeDecl),nullptr); } break; - case 483: /* tuple_type: "name" ':' type_declaration */ + case 488: /* tuple_type: "name" ':' type_declaration */ { auto na = new vector(); na->push_back(VariableNameAndPosition{*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2]))}); @@ -8000,28 +8061,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 484: /* tuple_type_list: tuple_type */ + case 489: /* tuple_type_list: tuple_type */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 485: /* tuple_type_list: tuple_type_list "end of expression" tuple_type */ + case 490: /* tuple_type_list: tuple_type_list c_or_s tuple_type */ { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 486: /* tuple_alias_type_list: %empty */ - { + case 491: /* tuple_alias_type_list: %empty */ + { (yyval.pVarDeclList) = new vector(); } break; - case 487: /* tuple_alias_type_list: tuple_alias_type_list "end of expression" */ - { + case 492: /* tuple_alias_type_list: tuple_alias_type_list c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 488: /* tuple_alias_type_list: tuple_alias_type_list tuple_type "end of expression" */ - { + case 493: /* tuple_alias_type_list: tuple_alias_type_list tuple_type c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); /* if ( !yyextra->g_CommentReaders.empty() ) { @@ -8036,7 +8097,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 489: /* variant_type: "name" ':' type_declaration */ + case 494: /* variant_type: "name" ':' type_declaration */ { auto na = new vector(); na->push_back(VariableNameAndPosition{*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2]))}); @@ -8045,28 +8106,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 490: /* variant_type_list: variant_type */ + case 495: /* variant_type_list: variant_type */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 491: /* variant_type_list: variant_type_list "end of expression" variant_type */ - { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } + case 496: /* variant_type_list: variant_type_list c_or_s variant_type */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 492: /* variant_alias_type_list: %empty */ + case 497: /* variant_alias_type_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 493: /* variant_alias_type_list: variant_alias_type_list "end of expression" */ - { + case 498: /* variant_alias_type_list: variant_alias_type_list c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 494: /* variant_alias_type_list: variant_alias_type_list variant_type "end of expression" */ - { + case 499: /* variant_alias_type_list: variant_alias_type_list variant_type c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); if ( !yyextra->g_CommentReaders.empty() ) { auto tokName = tokAt(scanner,(yylsp[-1])); @@ -8079,15 +8140,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 495: /* copy_or_move: '=' */ + case 500: /* copy_or_move: '=' */ { (yyval.b) = false; } break; - case 496: /* copy_or_move: "<-" */ + case 501: /* copy_or_move: "<-" */ { (yyval.b) = true; } break; - case 497: /* variable_declaration: variable_name_with_pos_list */ + case 502: /* variable_declaration: variable_name_with_pos_list */ { auto autoT = new TypeDecl(Type::autoinfer); autoT->at = tokAt(scanner,(yylsp[0])); @@ -8096,7 +8157,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 498: /* variable_declaration: variable_name_with_pos_list '&' */ + case 503: /* variable_declaration: variable_name_with_pos_list '&' */ { auto autoT = new TypeDecl(Type::autoinfer); autoT->at = tokAt(scanner,(yylsp[-1])); @@ -8105,20 +8166,20 @@ YYLTYPE yylloc = yyloc_default; } break; - case 499: /* variable_declaration: variable_name_with_pos_list ':' type_declaration */ + case 504: /* variable_declaration: variable_name_with_pos_list ':' type_declaration */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),(yyvsp[0].pTypeDecl),nullptr); } break; - case 500: /* variable_declaration: variable_name_with_pos_list ':' type_declaration copy_or_move expr */ + case 505: /* variable_declaration: variable_name_with_pos_list ':' type_declaration copy_or_move expr */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); } break; - case 501: /* variable_declaration: variable_name_with_pos_list copy_or_move expr */ + case 506: /* variable_declaration: variable_name_with_pos_list copy_or_move expr */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-2])); @@ -8127,27 +8188,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 502: /* copy_or_move_or_clone: '=' */ + case 507: /* copy_or_move_or_clone: '=' */ { (yyval.i) = CorM_COPY; } break; - case 503: /* copy_or_move_or_clone: "<-" */ + case 508: /* copy_or_move_or_clone: "<-" */ { (yyval.i) = CorM_MOVE; } break; - case 504: /* copy_or_move_or_clone: ":=" */ + case 509: /* copy_or_move_or_clone: ":=" */ { (yyval.i) = CorM_CLONE; } break; - case 505: /* optional_ref: %empty */ + case 510: /* optional_ref: %empty */ { (yyval.b) = false; } break; - case 506: /* optional_ref: '&' */ + case 511: /* optional_ref: '&' */ { (yyval.b) = true; } break; - case 507: /* let_variable_name_with_pos_list: "name" */ + case 512: /* let_variable_name_with_pos_list: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -8157,7 +8218,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 508: /* let_variable_name_with_pos_list: "$i" '(' expr ')' */ + case 513: /* let_variable_name_with_pos_list: "$i" '(' expr ')' */ { auto pSL = new vector(); pSL->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-1].pExpression))}); @@ -8165,7 +8226,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 509: /* let_variable_name_with_pos_list: "name" "aka" "name" */ + case 514: /* let_variable_name_with_pos_list: "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -8177,7 +8238,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 510: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" */ + case 515: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition{*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0]))}); @@ -8186,7 +8247,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 511: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" "aka" "name" */ + case 516: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -8197,7 +8258,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 512: /* global_let_variable_name_with_pos_list: "name" */ + case 517: /* global_let_variable_name_with_pos_list: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -8207,7 +8268,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 513: /* global_let_variable_name_with_pos_list: global_let_variable_name_with_pos_list ',' "name" */ + case 518: /* global_let_variable_name_with_pos_list: global_let_variable_name_with_pos_list ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition{*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0]))}); @@ -8216,13 +8277,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 514: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ + case 519: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),(yyvsp[-1].pTypeDecl),nullptr); } break; - case 515: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 520: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameWithPosList),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -8230,7 +8291,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 516: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ + case 521: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-4])); @@ -8241,13 +8302,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 517: /* global_let_variable_declaration: global_let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ + case 522: /* global_let_variable_declaration: global_let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),(yyvsp[-1].pTypeDecl),nullptr); } break; - case 518: /* global_let_variable_declaration: global_let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 523: /* global_let_variable_declaration: global_let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameWithPosList),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -8255,7 +8316,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 519: /* global_let_variable_declaration: global_let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ + case 524: /* global_let_variable_declaration: global_let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-4])); @@ -8266,27 +8327,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 520: /* optional_shared: %empty */ + case 525: /* optional_shared: %empty */ { (yyval.b) = false; } break; - case 521: /* optional_shared: "shared" */ + case 526: /* optional_shared: "shared" */ { (yyval.b) = true; } break; - case 522: /* optional_public_or_private_variable: %empty */ + case 527: /* optional_public_or_private_variable: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 523: /* optional_public_or_private_variable: "private" */ + case 528: /* optional_public_or_private_variable: "private" */ { (yyval.b) = false; } break; - case 524: /* optional_public_or_private_variable: "public" */ + case 529: /* optional_public_or_private_variable: "public" */ { (yyval.b) = true; } break; - case 525: /* $@28: %empty */ + case 530: /* $@28: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -8295,7 +8356,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 526: /* global_let: kwd_let optional_shared optional_public_or_private_variable $@28 optional_field_annotation global_let_variable_declaration */ + case 531: /* global_let: kwd_let optional_shared optional_public_or_private_variable $@28 optional_field_annotation global_let_variable_declaration */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -8308,27 +8369,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 527: /* enum_expression: "name" */ + case 532: /* enum_expression: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyval.pEnumPair) = new EnumPair((yyvsp[0].s),tokAt(scanner,(yylsp[0]))); } break; - case 528: /* enum_expression: "name" '=' expr */ + case 533: /* enum_expression: "name" '=' expr */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); (yyval.pEnumPair) = new EnumPair((yyvsp[-2].s),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-2]))); } break; - case 529: /* enum_list: %empty */ + case 534: /* enum_list: %empty */ { (yyval.pEnum) = new Enumeration(); } break; - case 530: /* enum_list: enum_expression */ + case 535: /* enum_list: enum_expression */ { (yyval.pEnum) = new Enumeration(); if ( !(yyval.pEnum)->add((yyvsp[0].pEnumPair)->name,(yyvsp[0].pEnumPair)->expr,(yyvsp[0].pEnumPair)->at) ) { @@ -8344,7 +8405,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 531: /* enum_list: enum_list ',' enum_expression */ + case 536: /* enum_list: enum_list ',' enum_expression */ { if ( !(yyvsp[-2].pEnum)->add((yyvsp[0].pEnumPair)->name,(yyvsp[0].pEnumPair)->expr,(yyvsp[0].pEnumPair)->at) ) { das2_yyerror(scanner,"enumeration already declared " + (yyvsp[0].pEnumPair)->name, (yyvsp[0].pEnumPair)->at, @@ -8360,19 +8421,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 532: /* optional_public_or_private_alias: %empty */ + case 537: /* optional_public_or_private_alias: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 533: /* optional_public_or_private_alias: "private" */ + case 538: /* optional_public_or_private_alias: "private" */ { (yyval.b) = false; } break; - case 534: /* optional_public_or_private_alias: "public" */ + case 539: /* optional_public_or_private_alias: "public" */ { (yyval.b) = true; } break; - case 535: /* $@29: %empty */ + case 540: /* $@29: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[0])); @@ -8381,7 +8442,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 536: /* single_alias: optional_public_or_private_alias "name" $@29 '=' type_declaration */ + case 541: /* single_alias: optional_public_or_private_alias "name" $@29 '=' type_declaration */ { das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); (yyvsp[0].pTypeDecl)->isPrivateAlias = !(yyvsp[-4].b); @@ -8402,19 +8463,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 538: /* optional_public_or_private_enum: %empty */ + case 543: /* optional_public_or_private_enum: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 539: /* optional_public_or_private_enum: "private" */ + case 544: /* optional_public_or_private_enum: "private" */ { (yyval.b) = false; } break; - case 540: /* optional_public_or_private_enum: "public" */ + case 545: /* optional_public_or_private_enum: "public" */ { (yyval.b) = true; } break; - case 541: /* enum_name: "name" */ + case 546: /* enum_name: "name" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[0])); @@ -8424,19 +8485,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 542: /* optional_enum_basic_type_declaration: %empty */ + case 547: /* optional_enum_basic_type_declaration: %empty */ { (yyval.type) = Type::tInt; } break; - case 543: /* optional_enum_basic_type_declaration: ':' enum_basic_type_declaration */ + case 548: /* optional_enum_basic_type_declaration: ':' enum_basic_type_declaration */ { (yyval.type) = (yyvsp[0].type); } break; - case 544: /* $@30: %empty */ + case 549: /* $@30: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-2])); @@ -8445,7 +8506,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 545: /* $@31: %empty */ + case 550: /* $@31: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -8454,7 +8515,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 546: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name optional_enum_basic_type_declaration "begin of code block" $@30 enum_list optional_comma $@31 "end of code block" */ + case 551: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name optional_enum_basic_type_declaration "begin of code block" $@30 enum_list optional_comma $@31 "end of code block" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[-3])); @@ -8464,61 +8525,61 @@ YYLTYPE yylloc = yyloc_default; } break; - case 547: /* optional_structure_parent: %empty */ + case 552: /* optional_structure_parent: %empty */ { (yyval.s) = nullptr; } break; - case 548: /* optional_structure_parent: ':' name_in_namespace */ + case 553: /* optional_structure_parent: ':' name_in_namespace */ { (yyval.s) = (yyvsp[0].s); } break; - case 549: /* optional_sealed: %empty */ + case 554: /* optional_sealed: %empty */ { (yyval.b) = false; } break; - case 550: /* optional_sealed: "sealed" */ + case 555: /* optional_sealed: "sealed" */ { (yyval.b) = true; } break; - case 551: /* structure_name: optional_sealed "name" optional_structure_parent */ + case 556: /* structure_name: optional_sealed "name" optional_structure_parent */ { (yyval.pStructure) = ast_structureName(scanner,(yyvsp[-2].b),(yyvsp[-1].s),tokAt(scanner,(yylsp[-1])),(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); } break; - case 552: /* class_or_struct: "class" */ + case 557: /* class_or_struct: "class" */ { (yyval.b) = true; } break; - case 553: /* class_or_struct: "struct" */ + case 558: /* class_or_struct: "struct" */ { (yyval.b) = false; } break; - case 554: /* optional_public_or_private_structure: %empty */ + case 559: /* optional_public_or_private_structure: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 555: /* optional_public_or_private_structure: "private" */ + case 560: /* optional_public_or_private_structure: "private" */ { (yyval.b) = false; } break; - case 556: /* optional_public_or_private_structure: "public" */ + case 561: /* optional_public_or_private_structure: "public" */ { (yyval.b) = true; } break; - case 557: /* optional_struct_variable_declaration_list: %empty */ + case 562: /* optional_struct_variable_declaration_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 558: /* optional_struct_variable_declaration_list: "begin of code block" struct_variable_declaration_list "end of code block" */ + case 563: /* optional_struct_variable_declaration_list: "begin of code block" struct_variable_declaration_list "end of code block" */ { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 559: /* $@32: %empty */ + case 564: /* $@32: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -8527,11 +8588,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 560: /* $@33: %empty */ + case 565: /* $@33: %empty */ { if ( (yyvsp[0].pStructure) ) { (yyvsp[0].pStructure)->isClass = (yyvsp[-3].b); (yyvsp[0].pStructure)->privateStructure = !(yyvsp[-2].b); } } break; - case 561: /* structure_declaration: optional_annotation_list class_or_struct optional_public_or_private_structure $@32 structure_name $@33 optional_struct_variable_declaration_list */ + case 566: /* structure_declaration: optional_annotation_list class_or_struct optional_public_or_private_structure $@32 structure_name $@33 optional_struct_variable_declaration_list */ { if ( (yyvsp[-2].pStructure) ) { ast_structureDeclaration ( scanner, (yyvsp[-6].faList), tokAt(scanner,(yylsp[-5])), (yyvsp[-2].pStructure), tokAt(scanner,(yylsp[-2])), (yyvsp[0].pVarDeclList) ); @@ -8545,7 +8606,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 562: /* variable_name_with_pos_list: "name" */ + case 567: /* variable_name_with_pos_list: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -8555,7 +8616,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 563: /* variable_name_with_pos_list: "$i" '(' expr ')' */ + case 568: /* variable_name_with_pos_list: "$i" '(' expr ')' */ { auto pSL = new vector(); pSL->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression)}); @@ -8563,7 +8624,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 564: /* variable_name_with_pos_list: "name" "aka" "name" */ + case 569: /* variable_name_with_pos_list: "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -8575,7 +8636,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 565: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" */ + case 570: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition{*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0]))}); @@ -8584,7 +8645,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 566: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" "aka" "name" */ + case 571: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -8595,147 +8656,147 @@ YYLTYPE yylloc = yyloc_default; } break; - case 567: /* basic_type_declaration: "bool" */ + case 572: /* basic_type_declaration: "bool" */ { (yyval.type) = Type::tBool; } break; - case 568: /* basic_type_declaration: "string" */ + case 573: /* basic_type_declaration: "string" */ { (yyval.type) = Type::tString; } break; - case 569: /* basic_type_declaration: "int" */ + case 574: /* basic_type_declaration: "int" */ { (yyval.type) = Type::tInt; } break; - case 570: /* basic_type_declaration: "int8" */ + case 575: /* basic_type_declaration: "int8" */ { (yyval.type) = Type::tInt8; } break; - case 571: /* basic_type_declaration: "int16" */ + case 576: /* basic_type_declaration: "int16" */ { (yyval.type) = Type::tInt16; } break; - case 572: /* basic_type_declaration: "int64" */ + case 577: /* basic_type_declaration: "int64" */ { (yyval.type) = Type::tInt64; } break; - case 573: /* basic_type_declaration: "int2" */ + case 578: /* basic_type_declaration: "int2" */ { (yyval.type) = Type::tInt2; } break; - case 574: /* basic_type_declaration: "int3" */ + case 579: /* basic_type_declaration: "int3" */ { (yyval.type) = Type::tInt3; } break; - case 575: /* basic_type_declaration: "int4" */ + case 580: /* basic_type_declaration: "int4" */ { (yyval.type) = Type::tInt4; } break; - case 576: /* basic_type_declaration: "uint" */ + case 581: /* basic_type_declaration: "uint" */ { (yyval.type) = Type::tUInt; } break; - case 577: /* basic_type_declaration: "uint8" */ + case 582: /* basic_type_declaration: "uint8" */ { (yyval.type) = Type::tUInt8; } break; - case 578: /* basic_type_declaration: "uint16" */ + case 583: /* basic_type_declaration: "uint16" */ { (yyval.type) = Type::tUInt16; } break; - case 579: /* basic_type_declaration: "uint64" */ + case 584: /* basic_type_declaration: "uint64" */ { (yyval.type) = Type::tUInt64; } break; - case 580: /* basic_type_declaration: "uint2" */ + case 585: /* basic_type_declaration: "uint2" */ { (yyval.type) = Type::tUInt2; } break; - case 581: /* basic_type_declaration: "uint3" */ + case 586: /* basic_type_declaration: "uint3" */ { (yyval.type) = Type::tUInt3; } break; - case 582: /* basic_type_declaration: "uint4" */ + case 587: /* basic_type_declaration: "uint4" */ { (yyval.type) = Type::tUInt4; } break; - case 583: /* basic_type_declaration: "float" */ + case 588: /* basic_type_declaration: "float" */ { (yyval.type) = Type::tFloat; } break; - case 584: /* basic_type_declaration: "float2" */ + case 589: /* basic_type_declaration: "float2" */ { (yyval.type) = Type::tFloat2; } break; - case 585: /* basic_type_declaration: "float3" */ + case 590: /* basic_type_declaration: "float3" */ { (yyval.type) = Type::tFloat3; } break; - case 586: /* basic_type_declaration: "float4" */ + case 591: /* basic_type_declaration: "float4" */ { (yyval.type) = Type::tFloat4; } break; - case 587: /* basic_type_declaration: "void" */ + case 592: /* basic_type_declaration: "void" */ { (yyval.type) = Type::tVoid; } break; - case 588: /* basic_type_declaration: "range" */ + case 593: /* basic_type_declaration: "range" */ { (yyval.type) = Type::tRange; } break; - case 589: /* basic_type_declaration: "urange" */ + case 594: /* basic_type_declaration: "urange" */ { (yyval.type) = Type::tURange; } break; - case 590: /* basic_type_declaration: "range64" */ + case 595: /* basic_type_declaration: "range64" */ { (yyval.type) = Type::tRange64; } break; - case 591: /* basic_type_declaration: "urange64" */ + case 596: /* basic_type_declaration: "urange64" */ { (yyval.type) = Type::tURange64; } break; - case 592: /* basic_type_declaration: "double" */ + case 597: /* basic_type_declaration: "double" */ { (yyval.type) = Type::tDouble; } break; - case 593: /* basic_type_declaration: "bitfield" */ + case 598: /* basic_type_declaration: "bitfield" */ { (yyval.type) = Type::tBitfield; } break; - case 594: /* enum_basic_type_declaration: "int" */ + case 599: /* enum_basic_type_declaration: "int" */ { (yyval.type) = Type::tInt; } break; - case 595: /* enum_basic_type_declaration: "int8" */ + case 600: /* enum_basic_type_declaration: "int8" */ { (yyval.type) = Type::tInt8; } break; - case 596: /* enum_basic_type_declaration: "int16" */ + case 601: /* enum_basic_type_declaration: "int16" */ { (yyval.type) = Type::tInt16; } break; - case 597: /* enum_basic_type_declaration: "uint" */ + case 602: /* enum_basic_type_declaration: "uint" */ { (yyval.type) = Type::tUInt; } break; - case 598: /* enum_basic_type_declaration: "uint8" */ + case 603: /* enum_basic_type_declaration: "uint8" */ { (yyval.type) = Type::tUInt8; } break; - case 599: /* enum_basic_type_declaration: "uint16" */ + case 604: /* enum_basic_type_declaration: "uint16" */ { (yyval.type) = Type::tUInt16; } break; - case 600: /* enum_basic_type_declaration: "int64" */ + case 605: /* enum_basic_type_declaration: "int64" */ { (yyval.type) = Type::tInt64; } break; - case 601: /* enum_basic_type_declaration: "uint64" */ + case 606: /* enum_basic_type_declaration: "uint64" */ { (yyval.type) = Type::tUInt64; } break; - case 602: /* structure_type_declaration: name_in_namespace */ + case 607: /* structure_type_declaration: name_in_namespace */ { (yyval.pTypeDecl) = yyextra->g_Program->makeTypeDeclaration(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); if ( !(yyval.pTypeDecl) ) { @@ -8746,14 +8807,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 603: /* auto_type_declaration: "auto" */ + case 608: /* auto_type_declaration: "auto" */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 604: /* auto_type_declaration: "auto" '(' "name" ')' */ + case 609: /* auto_type_declaration: "auto" '(' "name" ')' */ { das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); @@ -8763,7 +8824,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 605: /* auto_type_declaration: "$t" '(' expr ')' */ + case 610: /* auto_type_declaration: "$t" '(' expr ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::alias); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); @@ -8775,7 +8836,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 606: /* bitfield_bits: "name" */ + case 611: /* bitfield_bits: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -8785,7 +8846,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 607: /* bitfield_bits: bitfield_bits "end of expression" "name" */ + case 612: /* bitfield_bits: bitfield_bits "end of expression" "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); @@ -8794,7 +8855,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 608: /* bitfield_alias_bits: %empty */ + case 613: /* bitfield_alias_bits: %empty */ { auto pSL = new vector(); (yyval.pNameList) = pSL; @@ -8802,7 +8863,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 609: /* bitfield_alias_bits: "name" */ + case 614: /* bitfield_alias_bits: "name" */ { (yyval.pNameList) = new vector(); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -8815,7 +8876,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 610: /* bitfield_alias_bits: bitfield_alias_bits ',' "name" */ + case 615: /* bitfield_alias_bits: bitfield_alias_bits ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); @@ -8828,15 +8889,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 611: /* $@34: %empty */ + case 616: /* $@34: %empty */ { yyextra->das_arrow_depth ++; } break; - case 612: /* $@35: %empty */ + case 617: /* $@35: %empty */ { yyextra->das_arrow_depth --; } break; - case 613: /* bitfield_type_declaration: "bitfield" '<' $@34 bitfield_bits '>' $@35 */ + case 618: /* bitfield_type_declaration: "bitfield" '<' $@34 bitfield_bits '>' $@35 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBitfield); (yyval.pTypeDecl)->argNames = *(yyvsp[-2].pNameList); @@ -8849,55 +8910,55 @@ YYLTYPE yylloc = yyloc_default; } break; - case 614: /* table_type_pair: type_declaration */ + case 621: /* table_type_pair: type_declaration */ { (yyval.aTypePair).firstType = (yyvsp[0].pTypeDecl); (yyval.aTypePair).secondType = new TypeDecl(Type::tVoid); } break; - case 615: /* table_type_pair: type_declaration "end of expression" type_declaration */ - { + case 622: /* table_type_pair: type_declaration c_or_s type_declaration */ + { (yyval.aTypePair).firstType = (yyvsp[-2].pTypeDecl); (yyval.aTypePair).secondType = (yyvsp[0].pTypeDecl); } break; - case 616: /* dim_list: '[' expr ']' */ + case 623: /* dim_list: '[' expr ']' */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; - case 617: /* dim_list: '[' ']' */ + case 624: /* dim_list: '[' ']' */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); appendDimExpr((yyval.pTypeDecl), nullptr); } break; - case 618: /* dim_list: dim_list '[' expr ']' */ + case 625: /* dim_list: dim_list '[' expr ']' */ { (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; - case 619: /* dim_list: dim_list '[' ']' */ + case 626: /* dim_list: dim_list '[' ']' */ { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); appendDimExpr((yyval.pTypeDecl), nullptr); } break; - case 620: /* type_declaration_no_options: type_declaration_no_options_no_dim */ + case 627: /* type_declaration_no_options: type_declaration_no_options_no_dim */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 621: /* type_declaration_no_options: type_declaration_no_options_no_dim dim_list */ + case 628: /* type_declaration_no_options: type_declaration_no_options_no_dim dim_list */ { if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeDecl ) { das2_yyerror(scanner,"type declaration can`t be used as array base type",tokAt(scanner,(yylsp[-1])), @@ -8915,38 +8976,38 @@ YYLTYPE yylloc = yyloc_default; } break; - case 622: /* type_declaration_no_options_no_dim: basic_type_declaration */ + case 629: /* type_declaration_no_options_no_dim: basic_type_declaration */ { (yyval.pTypeDecl) = new TypeDecl((yyvsp[0].type)); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 623: /* type_declaration_no_options_no_dim: auto_type_declaration */ + case 630: /* type_declaration_no_options_no_dim: auto_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 624: /* type_declaration_no_options_no_dim: bitfield_type_declaration */ + case 631: /* type_declaration_no_options_no_dim: bitfield_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 625: /* type_declaration_no_options_no_dim: structure_type_declaration */ + case 632: /* type_declaration_no_options_no_dim: structure_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 626: /* $@36: %empty */ + case 633: /* $@36: %empty */ { yyextra->das_arrow_depth ++; } break; - case 627: /* $@37: %empty */ + case 634: /* $@37: %empty */ { yyextra->das_arrow_depth --; } break; - case 628: /* type_declaration_no_options_no_dim: "type" '<' $@36 type_declaration '>' $@37 */ + case 635: /* type_declaration_no_options_no_dim: "type" '<' $@36 type_declaration '>' $@37 */ { (yyvsp[-2].pTypeDecl)->autoToAlias = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 629: /* type_declaration_no_options_no_dim: "typedecl" '(' expr ')' */ + case 636: /* type_declaration_no_options_no_dim: "typedecl" '(' expr ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeDecl); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[-1])); @@ -8954,7 +9015,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 630: /* type_declaration_no_options_no_dim: '$' name_in_namespace '(' optional_expr_list ')' */ + case 637: /* type_declaration_no_options_no_dim: '$' name_in_namespace '(' optional_expr_list ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]), (yylsp[-1])); @@ -8964,11 +9025,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 631: /* $@38: %empty */ + case 638: /* $@38: %empty */ { yyextra->das_arrow_depth ++; } break; - case 632: /* type_declaration_no_options_no_dim: '$' name_in_namespace '<' $@38 type_declaration_no_options_list '>' '(' optional_expr_list ')' */ + case 639: /* type_declaration_no_options_no_dim: '$' name_in_namespace '<' $@38 type_declaration_no_options_list '>' '(' optional_expr_list ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])); @@ -8978,21 +9039,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 633: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '[' ']' */ + case 640: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '[' ']' */ { (yyvsp[-3].pTypeDecl)->removeDim = true; (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); } break; - case 634: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "explicit" */ + case 641: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "explicit" */ { (yyvsp[-1].pTypeDecl)->isExplicit = true; (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); } break; - case 635: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "const" */ + case 642: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "const" */ { (yyvsp[-1].pTypeDecl)->constant = true; (yyvsp[-1].pTypeDecl)->removeConstant = false; @@ -9000,7 +9061,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 636: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' "const" */ + case 643: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' "const" */ { (yyvsp[-2].pTypeDecl)->constant = false; (yyvsp[-2].pTypeDecl)->removeConstant = true; @@ -9008,7 +9069,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 637: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '&' */ + case 644: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '&' */ { (yyvsp[-1].pTypeDecl)->ref = true; (yyvsp[-1].pTypeDecl)->removeRef = false; @@ -9016,7 +9077,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 638: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '&' */ + case 645: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '&' */ { (yyvsp[-2].pTypeDecl)->ref = false; (yyvsp[-2].pTypeDecl)->removeRef = true; @@ -9024,21 +9085,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 639: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '#' */ + case 646: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '#' */ { (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); (yyval.pTypeDecl)->temporary = true; } break; - case 640: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "implicit" */ + case 647: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "implicit" */ { (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); (yyval.pTypeDecl)->implicit = true; } break; - case 641: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '#' */ + case 648: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '-' '#' */ { (yyvsp[-2].pTypeDecl)->temporary = false; (yyvsp[-2].pTypeDecl)->removeTemporary = true; @@ -9046,21 +9107,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 642: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "==" "const" */ + case 649: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "==" "const" */ { (yyvsp[-2].pTypeDecl)->explicitConst = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 643: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "==" '&' */ + case 650: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "==" '&' */ { (yyvsp[-2].pTypeDecl)->explicitRef = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 644: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '*' */ + case 651: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim '?' */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); @@ -9068,15 +9129,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 645: /* $@39: %empty */ + case 652: /* $@39: %empty */ { yyextra->das_arrow_depth ++; } break; - case 646: /* $@40: %empty */ + case 653: /* $@40: %empty */ { yyextra->das_arrow_depth --; } break; - case 647: /* type_declaration_no_options_no_dim: "smart_ptr" '<' $@39 type_declaration '>' $@40 */ + case 654: /* type_declaration_no_options_no_dim: "smart_ptr" '<' $@39 type_declaration '>' $@40 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9085,7 +9146,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 648: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "??" */ + case 655: /* type_declaration_no_options_no_dim: type_declaration_no_options_no_dim "??" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); @@ -9095,15 +9156,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 649: /* $@41: %empty */ + case 656: /* $@41: %empty */ { yyextra->das_arrow_depth ++; } break; - case 650: /* $@42: %empty */ + case 657: /* $@42: %empty */ { yyextra->das_arrow_depth --; } break; - case 651: /* type_declaration_no_options_no_dim: "array" '<' $@41 type_declaration '>' $@42 */ + case 658: /* type_declaration_no_options_no_dim: "array" '<' $@41 type_declaration '>' $@42 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tArray); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9111,15 +9172,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 652: /* $@43: %empty */ + case 659: /* $@43: %empty */ { yyextra->das_arrow_depth ++; } break; - case 653: /* $@44: %empty */ + case 660: /* $@44: %empty */ { yyextra->das_arrow_depth --; } break; - case 654: /* type_declaration_no_options_no_dim: "table" '<' $@43 table_type_pair '>' $@44 */ + case 661: /* type_declaration_no_options_no_dim: "table" '<' $@43 table_type_pair '>' $@44 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tTable); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9128,15 +9189,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 655: /* $@45: %empty */ + case 662: /* $@45: %empty */ { yyextra->das_arrow_depth ++; } break; - case 656: /* $@46: %empty */ + case 663: /* $@46: %empty */ { yyextra->das_arrow_depth --; } break; - case 657: /* type_declaration_no_options_no_dim: "iterator" '<' $@45 type_declaration '>' $@46 */ + case 664: /* type_declaration_no_options_no_dim: "iterator" '<' $@45 type_declaration '>' $@46 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tIterator); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9144,22 +9205,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 658: /* type_declaration_no_options_no_dim: "block" */ + case 665: /* type_declaration_no_options_no_dim: "block" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 659: /* $@47: %empty */ + case 666: /* $@47: %empty */ { yyextra->das_arrow_depth ++; } break; - case 660: /* $@48: %empty */ + case 667: /* $@48: %empty */ { yyextra->das_arrow_depth --; } break; - case 661: /* type_declaration_no_options_no_dim: "block" '<' $@47 type_declaration '>' $@48 */ + case 668: /* type_declaration_no_options_no_dim: "block" '<' $@47 type_declaration '>' $@48 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9167,15 +9228,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 662: /* $@49: %empty */ + case 669: /* $@49: %empty */ { yyextra->das_arrow_depth ++; } break; - case 663: /* $@50: %empty */ + case 670: /* $@50: %empty */ { yyextra->das_arrow_depth --; } break; - case 664: /* type_declaration_no_options_no_dim: "block" '<' $@49 optional_function_argument_list optional_function_type '>' $@50 */ + case 671: /* type_declaration_no_options_no_dim: "block" '<' $@49 optional_function_argument_list optional_function_type '>' $@50 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -9187,22 +9248,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 665: /* type_declaration_no_options_no_dim: "function" */ + case 672: /* type_declaration_no_options_no_dim: "function" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 666: /* $@51: %empty */ + case 673: /* $@51: %empty */ { yyextra->das_arrow_depth ++; } break; - case 667: /* $@52: %empty */ + case 674: /* $@52: %empty */ { yyextra->das_arrow_depth --; } break; - case 668: /* type_declaration_no_options_no_dim: "function" '<' $@51 type_declaration '>' $@52 */ + case 675: /* type_declaration_no_options_no_dim: "function" '<' $@51 type_declaration '>' $@52 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9210,15 +9271,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 669: /* $@53: %empty */ + case 676: /* $@53: %empty */ { yyextra->das_arrow_depth ++; } break; - case 670: /* $@54: %empty */ + case 677: /* $@54: %empty */ { yyextra->das_arrow_depth --; } break; - case 671: /* type_declaration_no_options_no_dim: "function" '<' $@53 optional_function_argument_list optional_function_type '>' $@54 */ + case 678: /* type_declaration_no_options_no_dim: "function" '<' $@53 optional_function_argument_list optional_function_type '>' $@54 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -9230,22 +9291,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 672: /* type_declaration_no_options_no_dim: "lambda" */ + case 679: /* type_declaration_no_options_no_dim: "lambda" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 673: /* $@55: %empty */ + case 680: /* $@55: %empty */ { yyextra->das_arrow_depth ++; } break; - case 674: /* $@56: %empty */ + case 681: /* $@56: %empty */ { yyextra->das_arrow_depth --; } break; - case 675: /* type_declaration_no_options_no_dim: "lambda" '<' $@55 type_declaration '>' $@56 */ + case 682: /* type_declaration_no_options_no_dim: "lambda" '<' $@55 type_declaration '>' $@56 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9253,15 +9314,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 676: /* $@57: %empty */ + case 683: /* $@57: %empty */ { yyextra->das_arrow_depth ++; } break; - case 677: /* $@58: %empty */ + case 684: /* $@58: %empty */ { yyextra->das_arrow_depth --; } break; - case 678: /* type_declaration_no_options_no_dim: "lambda" '<' $@57 optional_function_argument_list optional_function_type '>' $@58 */ + case 685: /* type_declaration_no_options_no_dim: "lambda" '<' $@57 optional_function_argument_list optional_function_type '>' $@58 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -9273,15 +9334,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 679: /* $@59: %empty */ + case 686: /* $@59: %empty */ { yyextra->das_arrow_depth ++; } break; - case 680: /* $@60: %empty */ + case 687: /* $@60: %empty */ { yyextra->das_arrow_depth --; } break; - case 681: /* type_declaration_no_options_no_dim: "tuple" '<' $@59 tuple_type_list '>' $@60 */ + case 688: /* type_declaration_no_options_no_dim: "tuple" '<' $@59 tuple_type_list '>' $@60 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tTuple); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9290,15 +9351,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 682: /* $@61: %empty */ + case 689: /* $@61: %empty */ { yyextra->das_arrow_depth ++; } break; - case 683: /* $@62: %empty */ + case 690: /* $@62: %empty */ { yyextra->das_arrow_depth --; } break; - case 684: /* type_declaration_no_options_no_dim: "variant" '<' $@61 variant_type_list '>' $@62 */ + case 691: /* type_declaration_no_options_no_dim: "variant" '<' $@61 variant_type_list '>' $@62 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tVariant); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -9307,13 +9368,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 685: /* type_declaration: type_declaration_no_options */ + case 692: /* type_declaration: type_declaration_no_options */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 686: /* type_declaration: type_declaration '|' type_declaration_no_options */ + case 693: /* type_declaration: type_declaration '|' type_declaration_no_options */ { if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); @@ -9327,7 +9388,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 687: /* type_declaration: type_declaration '|' '#' */ + case 694: /* type_declaration: type_declaration '|' '#' */ { if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); @@ -9343,7 +9404,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 688: /* $@63: %empty */ + case 695: /* $@63: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -9352,7 +9413,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 689: /* $@64: %empty */ + case 696: /* $@64: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -9361,7 +9422,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 690: /* $@65: %empty */ + case 697: /* $@65: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-4])); @@ -9370,7 +9431,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 691: /* tuple_alias_declaration: "tuple" optional_public_or_private_alias "name" $@63 "begin of code block" $@64 tuple_alias_type_list $@65 "end of code block" */ + case 698: /* tuple_alias_declaration: "tuple" optional_public_or_private_alias "name" $@63 "begin of code block" $@64 tuple_alias_type_list $@65 "end of code block" */ { auto vtype = make_smart(Type::tTuple); vtype->alias = *(yyvsp[-6].s); @@ -9390,7 +9451,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 692: /* $@66: %empty */ + case 699: /* $@66: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -9399,7 +9460,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 693: /* $@67: %empty */ + case 700: /* $@67: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -9409,7 +9470,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 694: /* $@68: %empty */ + case 701: /* $@68: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-4])); @@ -9418,7 +9479,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 695: /* variant_alias_declaration: "variant" optional_public_or_private_alias "name" $@66 "begin of code block" $@67 variant_alias_type_list $@68 "end of code block" */ + case 702: /* variant_alias_declaration: "variant" optional_public_or_private_alias "name" $@66 "begin of code block" $@67 variant_alias_type_list $@68 "end of code block" */ { auto vtype = make_smart(Type::tVariant); vtype->alias = *(yyvsp[-6].s); @@ -9438,7 +9499,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 696: /* $@69: %empty */ + case 703: /* $@69: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -9447,7 +9508,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 697: /* $@70: %empty */ + case 704: /* $@70: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -9456,7 +9517,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 698: /* $@71: %empty */ + case 705: /* $@71: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-5])); @@ -9465,7 +9526,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 699: /* bitfield_alias_declaration: "bitfield" optional_public_or_private_alias "name" $@69 "begin of code block" $@70 bitfield_alias_bits optional_comma $@71 "end of code block" */ + case 706: /* bitfield_alias_declaration: "bitfield" optional_public_or_private_alias "name" $@69 "begin of code block" $@70 bitfield_alias_bits optional_comma $@71 "end of code block" */ { auto btype = make_smart(Type::tBitfield); btype->alias = *(yyvsp[-7].s); @@ -9489,27 +9550,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 700: /* make_decl: make_struct_decl */ + case 707: /* make_decl: make_struct_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 701: /* make_decl: make_dim_decl */ + case 708: /* make_decl: make_dim_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 702: /* make_decl: make_table_decl */ + case 709: /* make_decl: make_table_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 703: /* make_decl: array_comprehension */ + case 710: /* make_decl: array_comprehension */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 704: /* make_decl: make_tuple_call */ + case 711: /* make_decl: make_tuple_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 705: /* make_struct_fields: "name" copy_or_move expr */ + case 712: /* make_struct_fields: "name" copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); delete (yyvsp[-2].s); @@ -9519,7 +9580,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 706: /* make_struct_fields: "name" ":=" expr */ + case 713: /* make_struct_fields: "name" ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),false,true); delete (yyvsp[-2].s); @@ -9529,7 +9590,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 707: /* make_struct_fields: make_struct_fields ',' "name" copy_or_move expr */ + case 714: /* make_struct_fields: make_struct_fields ',' "name" copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); delete (yyvsp[-2].s); @@ -9538,7 +9599,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 708: /* make_struct_fields: make_struct_fields ',' "name" ":=" expr */ + case 715: /* make_struct_fields: make_struct_fields ',' "name" ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),false,true); delete (yyvsp[-2].s); @@ -9547,7 +9608,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 709: /* make_struct_fields: "$f" '(' expr ')' copy_or_move expr */ + case 716: /* make_struct_fields: "$f" '(' expr ')' copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -9557,7 +9618,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 710: /* make_struct_fields: "$f" '(' expr ')' ":=" expr */ + case 717: /* make_struct_fields: "$f" '(' expr ')' ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),false,true); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -9567,7 +9628,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 711: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' copy_or_move expr */ + case 718: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -9576,7 +9637,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 712: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' ":=" expr */ + case 719: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),false,true); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -9585,13 +9646,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 713: /* make_variant_dim: make_struct_fields */ + case 720: /* make_variant_dim: make_struct_fields */ { (yyval.pExpression) = ast_makeStructToMakeVariant((yyvsp[0].pMakeStruct), tokAt(scanner,(yylsp[0]))); } break; - case 714: /* make_struct_single: make_struct_fields */ + case 721: /* make_struct_single: make_struct_fields */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); @@ -9599,7 +9660,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 715: /* make_struct_dim_list: '(' make_struct_fields ')' */ + case 722: /* make_struct_dim_list: '(' make_struct_fields ')' */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); @@ -9607,14 +9668,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 716: /* make_struct_dim_list: make_struct_dim_list ',' '(' make_struct_fields ')' */ + case 723: /* make_struct_dim_list: make_struct_dim_list ',' '(' make_struct_fields ')' */ { ((ExprMakeStruct *) (yyvsp[-4].pExpression))->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); (yyval.pExpression) = (yyvsp[-4].pExpression); } break; - case 717: /* make_struct_dim_decl: make_struct_fields */ + case 724: /* make_struct_dim_decl: make_struct_fields */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); @@ -9622,30 +9683,38 @@ YYLTYPE yylloc = yyloc_default; } break; - case 718: /* make_struct_dim_decl: make_struct_dim_list optional_comma */ + case 725: /* make_struct_dim_decl: make_struct_dim_list optional_comma */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 719: /* use_initializer: %empty */ + case 726: /* optional_make_struct_dim_decl: make_struct_dim_decl */ + { (yyval.pExpression) = (yyvsp[0].pExpression); } + break; + + case 727: /* optional_make_struct_dim_decl: %empty */ + { (yyval.pExpression) = new ExprMakeStruct(); } + break; + + case 728: /* use_initializer: %empty */ { (yyval.b) = true; } break; - case 720: /* use_initializer: "uninitialized" */ + case 729: /* use_initializer: "uninitialized" */ { (yyval.b) = false; } break; - case 721: /* $@72: %empty */ + case 730: /* $@72: %empty */ { yyextra->das_arrow_depth ++; } break; - case 722: /* $@73: %empty */ + case 731: /* $@73: %empty */ { yyextra->das_arrow_depth --; } break; - case 723: /* make_struct_decl: "struct" '<' $@72 type_declaration_no_options '>' $@73 '(' use_initializer make_struct_dim_decl ')' */ - { + case 732: /* make_struct_decl: "struct" '<' $@72 type_declaration_no_options '>' $@73 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -9655,16 +9724,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 724: /* $@74: %empty */ + case 733: /* $@74: %empty */ { yyextra->das_arrow_depth ++; } break; - case 725: /* $@75: %empty */ + case 734: /* $@75: %empty */ { yyextra->das_arrow_depth --; } break; - case 726: /* make_struct_decl: "class" '<' $@74 type_declaration_no_options '>' $@75 '(' use_initializer make_struct_dim_decl ')' */ - { + case 735: /* make_struct_decl: "class" '<' $@74 type_declaration_no_options '>' $@75 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -9673,15 +9742,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 727: /* $@76: %empty */ + case 736: /* $@76: %empty */ { yyextra->das_arrow_depth ++; } break; - case 728: /* $@77: %empty */ + case 737: /* $@77: %empty */ { yyextra->das_arrow_depth --; } break; - case 729: /* make_struct_decl: "variant" '<' $@76 type_declaration_no_options '>' $@77 '(' make_variant_dim ')' */ + case 738: /* make_struct_decl: "variant" '<' $@76 type_declaration_no_options '>' $@77 '(' make_variant_dim ')' */ { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-8])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); @@ -9691,15 +9760,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 730: /* $@78: %empty */ + case 739: /* $@78: %empty */ { yyextra->das_arrow_depth ++; } break; - case 731: /* $@79: %empty */ + case 740: /* $@79: %empty */ { yyextra->das_arrow_depth --; } break; - case 732: /* make_struct_decl: "default" '<' $@78 type_declaration_no_options '>' $@79 use_initializer */ + case 741: /* make_struct_decl: "default" '<' $@78 type_declaration_no_options '>' $@79 use_initializer */ { auto msd = new ExprMakeStruct(); msd->at = tokAt(scanner,(yylsp[-6])); @@ -9710,7 +9779,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 733: /* make_map_tuple: expr "=>" expr */ + case 742: /* make_map_tuple: expr "=>" expr */ { ExprMakeTuple * mt = new ExprMakeTuple(tokAt(scanner,(yylsp[-1]))); mt->values.push_back(ExpressionPtr((yyvsp[-2].pExpression))); @@ -9719,13 +9788,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 734: /* make_map_tuple: expr */ + case 743: /* make_map_tuple: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 735: /* make_tuple_call: "tuple" '(' expr_list optional_comma ')' */ + case 744: /* make_tuple_call: "tuple" '(' expr_list optional_comma ')' */ { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-4]))); mkt->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9734,16 +9803,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 736: /* $@80: %empty */ + case 745: /* $@80: %empty */ { yyextra->das_arrow_depth ++; } break; - case 737: /* $@81: %empty */ + case 746: /* $@81: %empty */ { yyextra->das_arrow_depth --; } break; - case 738: /* make_tuple_call: "tuple" '<' $@80 type_declaration_no_options '>' $@81 '(' use_initializer make_struct_dim_decl ')' */ - { + case 747: /* make_tuple_call: "tuple" '<' $@80 type_declaration_no_options '>' $@81 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -9752,7 +9821,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 739: /* make_dim_decl: '[' expr_list optional_comma ']' */ + case 748: /* make_dim_decl: '[' expr_list optional_comma ']' */ { auto mka = make_smart(tokAt(scanner,(yylsp[-3]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9763,16 +9832,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 740: /* $@82: %empty */ + case 749: /* $@82: %empty */ { yyextra->das_arrow_depth ++; } break; - case 741: /* $@83: %empty */ + case 750: /* $@83: %empty */ { yyextra->das_arrow_depth --; } break; - case 742: /* make_dim_decl: "array" "struct" '<' $@82 type_declaration_no_options '>' $@83 '(' use_initializer make_struct_dim_decl ')' */ - { + case 751: /* make_dim_decl: "array" "struct" '<' $@82 type_declaration_no_options '>' $@83 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -9784,16 +9853,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 743: /* $@84: %empty */ + case 752: /* $@84: %empty */ { yyextra->das_arrow_depth ++; } break; - case 744: /* $@85: %empty */ + case 753: /* $@85: %empty */ { yyextra->das_arrow_depth --; } break; - case 745: /* make_dim_decl: "array" "tuple" '<' $@84 type_declaration_no_options '>' $@85 '(' use_initializer make_struct_dim_decl ')' */ - { + case 754: /* make_dim_decl: "array" "tuple" '<' $@84 type_declaration_no_options '>' $@85 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -9805,15 +9874,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 746: /* $@86: %empty */ + case 755: /* $@86: %empty */ { yyextra->das_arrow_depth ++; } break; - case 747: /* $@87: %empty */ + case 756: /* $@87: %empty */ { yyextra->das_arrow_depth --; } break; - case 748: /* make_dim_decl: "array" "variant" '<' $@86 type_declaration_no_options '>' $@87 '(' make_variant_dim ')' */ + case 757: /* make_dim_decl: "array" "variant" '<' $@86 type_declaration_no_options '>' $@87 '(' make_variant_dim ')' */ { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); @@ -9826,7 +9895,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 749: /* make_dim_decl: "array" '(' expr_list optional_comma ')' */ + case 758: /* make_dim_decl: "array" '(' expr_list optional_comma ')' */ { auto mka = make_smart(tokAt(scanner,(yylsp[-4]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9837,26 +9906,37 @@ YYLTYPE yylloc = yyloc_default; } break; - case 750: /* $@88: %empty */ + case 759: /* $@88: %empty */ { yyextra->das_arrow_depth ++; } break; - case 751: /* $@89: %empty */ + case 760: /* $@89: %empty */ { yyextra->das_arrow_depth --; } break; - case 752: /* make_dim_decl: "array" '<' $@88 type_declaration_no_options '>' $@89 '(' expr_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-9]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_array_move"); - tam->arguments.push_back(mka); - (yyval.pExpression) = tam; + case 761: /* make_dim_decl: "array" '<' $@88 type_declaration_no_options '>' $@89 '(' optional_expr_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_array_move"); + tam->arguments.push_back(mka); + (yyval.pExpression) = tam; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = make_smart(Type::tArray); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); + msd->at = tokAt(scanner,(yylsp[-5])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 753: /* make_dim_decl: "fixed_array" '(' expr_list optional_comma ')' */ + case 762: /* make_dim_decl: "fixed_array" '(' expr_list optional_comma ')' */ { auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9866,15 +9946,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 754: /* $@90: %empty */ + case 763: /* $@90: %empty */ { yyextra->das_arrow_depth ++; } break; - case 755: /* $@91: %empty */ + case 764: /* $@91: %empty */ { yyextra->das_arrow_depth --; } break; - case 756: /* make_dim_decl: "fixed_array" '<' $@90 type_declaration_no_options '>' $@91 '(' expr_list optional_comma ')' */ + case 765: /* make_dim_decl: "fixed_array" '<' $@90 type_declaration_no_options '>' $@91 '(' expr_list optional_comma ')' */ { auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-9]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9884,19 +9964,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 757: /* expr_map_tuple_list: make_map_tuple */ + case 766: /* expr_map_tuple_list: make_map_tuple */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 758: /* expr_map_tuple_list: expr_map_tuple_list ',' make_map_tuple */ + case 767: /* expr_map_tuple_list: expr_map_tuple_list ',' make_map_tuple */ { (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 759: /* make_table_decl: "begin of code block" expr_map_tuple_list optional_comma "end of code block" */ + case 768: /* make_table_decl: "begin of code block" expr_map_tuple_list optional_comma "end of code block" */ { auto mka = make_smart(tokAt(scanner,(yylsp[-3]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9907,7 +9987,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 760: /* make_table_decl: "table" '(' expr_map_tuple_list optional_comma ')' */ + case 769: /* make_table_decl: "table" '(' expr_map_tuple_list optional_comma ')' */ { auto mka = make_smart(tokAt(scanner,(yylsp[-4]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -9918,59 +9998,83 @@ YYLTYPE yylloc = yyloc_default; } break; - case 761: /* make_table_decl: "table" '<' type_declaration_no_options '>' '(' expr_map_tuple_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-7]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-7])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; + case 770: /* make_table_decl: "table" '<' type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-6]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + msd->makeType->secondType = make_smart(Type::tVoid); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 762: /* make_table_decl: "table" '<' type_declaration_no_options "end of expression" type_declaration_no_options '>' '(' expr_map_tuple_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-9]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = make_smart(Type::tTuple); - mka->makeType->argTypes.push_back((yyvsp[-7].pTypeDecl)); - mka->makeType->argTypes.push_back((yyvsp[-5].pTypeDecl)); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; + case 771: /* make_table_decl: "table" '<' type_declaration_no_options c_or_s type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = make_smart(Type::tTuple); + mka->makeType->argTypes.push_back((yyvsp[-6].pTypeDecl)); + mka->makeType->argTypes.push_back((yyvsp[-4].pTypeDecl)); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); + msd->makeType->secondType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 763: /* array_comprehension_where: %empty */ + case 772: /* array_comprehension_where: %empty */ { (yyval.pExpression) = nullptr; } break; - case 764: /* array_comprehension_where: "end of expression" "where" expr */ + case 773: /* array_comprehension_where: "end of expression" "where" expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 765: /* optional_comma: %empty */ + case 774: /* optional_comma: %empty */ { (yyval.b) = false; } break; - case 766: /* optional_comma: ',' */ + case 775: /* optional_comma: ',' */ { (yyval.b) = true; } break; - case 767: /* array_comprehension: '[' "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ + case 776: /* array_comprehension: '[' "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); } break; - case 768: /* array_comprehension: '[' "iterator" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ + case 777: /* array_comprehension: '[' "iterator" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); } break; - case 769: /* array_comprehension: "begin of code block" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" */ + case 778: /* array_comprehension: "begin of code block" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); } diff --git a/prog/1stPartyLibs/daScript/src/parser/ds2_parser.ypp b/prog/1stPartyLibs/daScript/src/parser/ds2_parser.ypp index 9294ce08a..0e9500bdc 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds2_parser.ypp +++ b/prog/1stPartyLibs/daScript/src/parser/ds2_parser.ypp @@ -432,6 +432,7 @@ %type expr_assign %type expr_list %type optional_expr_list +%type optional_expr_map_tuple_list %type expr_map_tuple_list %type expression_label %type expression_goto @@ -470,6 +471,7 @@ %type make_struct_decl %type make_struct_single %type make_struct_dim_decl +%type optional_make_struct_dim_decl %type make_struct_dim_list %type make_variant_dim %type make_map_tuple @@ -540,7 +542,7 @@ program | program global_function_declaration { yyextra->das_has_type_declarations = true; } | program expect_declaration | program require_declaration - | program options_declaration + | program options_declaration ';' | program alias_declaration { yyextra->das_has_type_declarations = true; } | program variant_alias_declaration { yyextra->das_has_type_declarations = true; } | program tuple_alias_declaration { yyextra->das_has_type_declarations = true; } @@ -744,7 +746,7 @@ is_public_module ; expect_declaration - : DAS_EXPECT expect_list ';' + : DAS_EXPECT expect_list ; expect_list @@ -1253,7 +1255,12 @@ expressions optional_expr_list : { $$ = nullptr; } - | expr_list[arguments] { $$ = $arguments; } + | expr_list[arguments] optional_comma { $$ = $arguments; } + ; + +optional_expr_map_tuple_list + : { $$ = nullptr; } + | expr_map_tuple_list[arguments] optional_comma { $$ = $arguments; } ; type_declaration_no_options_list @@ -1261,7 +1268,7 @@ type_declaration_no_options_list $$ = new vector(); $$->push_back(new ExprTypeDecl(tokAt(scanner,@decl),$decl)); } - | type_declaration_no_options_list[declL] ';' type_declaration[decl] { + | type_declaration_no_options_list[declL] c_or_s type_declaration[decl] { $$ = $declL; $$->push_back(new ExprTypeDecl(tokAt(scanner,@decl),$decl)); } @@ -1463,7 +1470,7 @@ expr_type_info delete $trait; delete $subtrait; } - | DAS_TYPEINFO[loc] name_in_namespace[trait] '<' NAME[subtrait] ';' NAME[extratrait] '>' '(' expr[subexpr] ')' { + | DAS_TYPEINFO[loc] name_in_namespace[trait] '<' NAME[subtrait] c_or_s NAME[extratrait] '>' '(' expr[subexpr] ')' { if ( $subexpr->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)$subexpr; $$ = new ExprTypeInfo(tokAt(scanner,@loc),*$trait,ptd->typeexpr,*$subtrait,*$extratrait); @@ -1683,6 +1690,16 @@ expr_call $$ = yyextra->g_Program->makeCall(tokAt(scanner,@name),tokAt(scanner,@atend),*$name); delete $name; } + | name_in_namespace[name] '(' DAS_UNINITIALIZED ')' { + auto dd = new ExprMakeStruct(tokAt(scanner,@name)); + dd->at = tokAt(scanner,@name); + dd->makeType = new TypeDecl(Type::alias); + dd->makeType->alias = *$name; + dd->useInitializer = false; + dd->alwaysUseInitializer = true; + delete $name; + $$ = dd; + } | name_in_namespace[name] '(' make_struct_single[dd] ')' { ((ExprMakeStruct *)$dd)->at = tokAt(scanner,@name); ((ExprMakeStruct *)$dd)->makeType = new TypeDecl(Type::alias); @@ -1692,6 +1709,15 @@ expr_call delete $name; $$ = $dd; } + | name_in_namespace[name] '(' DAS_UNINITIALIZED make_struct_single[dd] ')' { + ((ExprMakeStruct *)$dd)->at = tokAt(scanner,@name); + ((ExprMakeStruct *)$dd)->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)$dd)->makeType->alias = *$name; + ((ExprMakeStruct *)$dd)->useInitializer = false; + ((ExprMakeStruct *)$dd)->alwaysUseInitializer = true; + delete $name; + $$ = $dd; + } | name_in_namespace[name] '(' expr_list[arguments] ')'[atend] { $$ = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,@name),tokAt(scanner,@atend),*$name),$arguments); delete $name; @@ -1840,6 +1866,11 @@ expr $$ = ast_rpipe(scanner,$arg,fncall,tokAt(scanner,@loc)); } | expr_call_pipe[pipe] { $$ = $pipe; } + | DAS_UNSAFE '(' expr[subexpr] ')' { + $subexpr->alwaysSafe = true; + $subexpr->userSaidItsSafe = true; + $$ = $subexpr; + } ; expr_mtag @@ -2017,17 +2048,17 @@ tuple_type tuple_type_list : tuple_type[decl] { $$ = new vector(); $$->push_back($decl); } - | tuple_type_list[list] ';' tuple_type[decl] { $$ = $list; $list->push_back($decl); } + | tuple_type_list[list] c_or_s tuple_type[decl] { $$ = $list; $list->push_back($decl); } ; tuple_alias_type_list - : { + : { $$ = new vector(); } - | tuple_alias_type_list[list] ';' { + | tuple_alias_type_list[list] c_or_s { $$ = $list; } - | tuple_alias_type_list[list] tuple_type[decl] ';' { + | tuple_alias_type_list[list] tuple_type[decl] c_or_s { $$ = $list; $list->push_back($decl); /* if ( !yyextra->g_CommentReaders.empty() ) { @@ -2053,17 +2084,17 @@ variant_type variant_type_list : variant_type[decl] { $$ = new vector(); $$->push_back($decl); } - | variant_type_list[list] ';' variant_type[decl] { $$ = $list; $list->push_back($decl); } + | variant_type_list[list] c_or_s variant_type[decl] { $$ = $list; $list->push_back($decl); } ; variant_alias_type_list : { $$ = new vector(); } - | variant_alias_type_list[list] ';' { + | variant_alias_type_list[list] c_or_s { $$ = $list; } - | variant_alias_type_list[list] variant_type[decl] ';' { + | variant_alias_type_list[list] variant_type[decl] c_or_s { $$ = $list; $list->push_back($decl); if ( !yyextra->g_CommentReaders.empty() ) { auto tokName = tokAt(scanner,@decl); @@ -2594,12 +2625,17 @@ bitfield_type_declaration } ; +c_or_s + : ',' + | ';' + ; + table_type_pair : type_declaration[keyTypeDecl] { $$.firstType = $keyTypeDecl; $$.secondType = new TypeDecl(Type::tVoid); } - | type_declaration[keyTypeDecl] ';' type_declaration[valueTypeDecl] { + | type_declaration[keyTypeDecl] c_or_s type_declaration[valueTypeDecl] { $$.firstType = $keyTypeDecl; $$.secondType = $valueTypeDecl; } @@ -2722,7 +2758,7 @@ type_declaration_no_options_no_dim $typeDecl->explicitRef = true; $$ = $typeDecl; } - | type_declaration_no_options_no_dim[typeDecl] '*' { + | type_declaration_no_options_no_dim[typeDecl] '?' { $$ = new TypeDecl(Type::tPointer); $$->at = tokAt(scanner,@typeDecl); $$->firstType = TypeDeclPtr($typeDecl); @@ -3065,13 +3101,18 @@ make_struct_dim_decl } ; +optional_make_struct_dim_decl + : make_struct_dim_decl[msd] { $$ = $msd; } + | { $$ = new ExprMakeStruct(); } + ; + use_initializer : { $$ = true; } | DAS_UNINITIALIZED { $$ = false; } ; make_struct_decl - : DAS_STRUCT [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + : DAS_STRUCT [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3079,7 +3120,7 @@ make_struct_decl ((ExprMakeStruct *)$msd)->alwaysUseInitializer = true; $$ = $msd; } - | DAS_CLASS [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_CLASS [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3122,7 +3163,7 @@ make_tuple_call mkt->makeType = make_smart(Type::autoinfer); $$ = mkt; } - | DAS_TTUPLE [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_TTUPLE [loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3140,7 +3181,7 @@ make_dim_decl tam->arguments.push_back(mka); $$ = tam; } - | DAS_ARRAY [loc] DAS_STRUCT '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_ARRAY [loc] DAS_STRUCT '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3150,7 +3191,7 @@ make_dim_decl tam->arguments.push_back($msd); $$ = tam; } - | DAS_ARRAY [loc] DAS_TTUPLE '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_ARRAY [loc] DAS_TTUPLE '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3178,13 +3219,24 @@ make_dim_decl tam->arguments.push_back(mka); $$ = tam; } - | DAS_ARRAY[loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' expr_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = TypeDeclPtr($mkt); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_array_move"); - tam->arguments.push_back(mka); - $$ = tam; + | DAS_ARRAY[loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' optional_expr_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = TypeDeclPtr($mkt); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_array_move"); + tam->arguments.push_back(mka); + $$ = tam; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tArray); + msd->makeType->firstType = TypeDeclPtr($mkt); + msd->at = tokAt(scanner,@mkt); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } } | DAS_FIXED_ARRAY[loc] '(' expr_list[arguments] optional_comma ')' { auto mka = new ExprMakeArray(tokAt(scanner,@loc)); @@ -3228,23 +3280,47 @@ make_table_decl ttm->arguments.push_back(mka); $$ = ttm; } - | DAS_TABLE[loc] '<' type_declaration_no_options[decl] '>' '(' expr_map_tuple_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = TypeDeclPtr($decl); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); - ttm->arguments.push_back(mka); - $$ = ttm; - } - | DAS_TABLE[loc] '<' type_declaration_no_options[decl] ';' type_declaration_no_options[to_decl] '>' '(' expr_map_tuple_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = make_smart(Type::tTuple); - mka->makeType->argTypes.push_back($decl); - mka->makeType->argTypes.push_back($to_decl); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); - ttm->arguments.push_back(mka); - $$ = ttm; + | DAS_TABLE[loc] '<' type_declaration_no_options[decl] '>' '(' optional_expr_map_tuple_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = TypeDeclPtr($decl); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); + ttm->arguments.push_back(mka); + $$ = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr($decl); + msd->makeType->secondType = make_smart(Type::tVoid); + msd->at = tokAt(scanner,@loc); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } + } + | DAS_TABLE[loc] '<' type_declaration_no_options[decl] c_or_s type_declaration_no_options[to_decl] '>' '(' optional_expr_map_tuple_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = make_smart(Type::tTuple); + mka->makeType->argTypes.push_back($decl); + mka->makeType->argTypes.push_back($to_decl); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); + ttm->arguments.push_back(mka); + $$ = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr($decl); + msd->makeType->secondType = TypeDeclPtr($to_decl); + msd->at = tokAt(scanner,@loc); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } } ; diff --git a/prog/1stPartyLibs/daScript/src/parser/ds_parser.cpp b/prog/1stPartyLibs/daScript/src/parser/ds_parser.cpp index 6baeeafe4..5541fdb79 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds_parser.cpp +++ b/prog/1stPartyLibs/daScript/src/parser/ds_parser.cpp @@ -417,232 +417,235 @@ enum yysymbol_kind_t YYSYMBOL_expr_keyword = 279, /* expr_keyword */ YYSYMBOL_optional_expr_list = 280, /* optional_expr_list */ YYSYMBOL_optional_expr_list_in_braces = 281, /* optional_expr_list_in_braces */ - YYSYMBOL_type_declaration_no_options_list = 282, /* type_declaration_no_options_list */ - YYSYMBOL_expression_keyword = 283, /* expression_keyword */ - YYSYMBOL_284_7 = 284, /* $@7 */ - YYSYMBOL_285_8 = 285, /* $@8 */ - YYSYMBOL_286_9 = 286, /* $@9 */ - YYSYMBOL_287_10 = 287, /* $@10 */ - YYSYMBOL_expr_pipe = 288, /* expr_pipe */ - YYSYMBOL_name_in_namespace = 289, /* name_in_namespace */ - YYSYMBOL_expression_delete = 290, /* expression_delete */ - YYSYMBOL_new_type_declaration = 291, /* new_type_declaration */ - YYSYMBOL_292_11 = 292, /* $@11 */ - YYSYMBOL_293_12 = 293, /* $@12 */ - YYSYMBOL_expr_new = 294, /* expr_new */ - YYSYMBOL_expression_break = 295, /* expression_break */ - YYSYMBOL_expression_continue = 296, /* expression_continue */ - YYSYMBOL_expression_return_no_pipe = 297, /* expression_return_no_pipe */ - YYSYMBOL_expression_return = 298, /* expression_return */ - YYSYMBOL_expression_yield_no_pipe = 299, /* expression_yield_no_pipe */ - YYSYMBOL_expression_yield = 300, /* expression_yield */ - YYSYMBOL_expression_try_catch = 301, /* expression_try_catch */ - YYSYMBOL_kwd_let_var_or_nothing = 302, /* kwd_let_var_or_nothing */ - YYSYMBOL_kwd_let = 303, /* kwd_let */ - YYSYMBOL_optional_in_scope = 304, /* optional_in_scope */ - YYSYMBOL_tuple_expansion = 305, /* tuple_expansion */ - YYSYMBOL_tuple_expansion_variable_declaration = 306, /* tuple_expansion_variable_declaration */ - YYSYMBOL_expression_let = 307, /* expression_let */ - YYSYMBOL_expr_cast = 308, /* expr_cast */ - YYSYMBOL_309_13 = 309, /* $@13 */ - YYSYMBOL_310_14 = 310, /* $@14 */ - YYSYMBOL_311_15 = 311, /* $@15 */ - YYSYMBOL_312_16 = 312, /* $@16 */ - YYSYMBOL_313_17 = 313, /* $@17 */ - YYSYMBOL_314_18 = 314, /* $@18 */ - YYSYMBOL_expr_type_decl = 315, /* expr_type_decl */ - YYSYMBOL_316_19 = 316, /* $@19 */ - YYSYMBOL_317_20 = 317, /* $@20 */ - YYSYMBOL_expr_type_info = 318, /* expr_type_info */ - YYSYMBOL_expr_list = 319, /* expr_list */ - YYSYMBOL_block_or_simple_block = 320, /* block_or_simple_block */ - YYSYMBOL_block_or_lambda = 321, /* block_or_lambda */ - YYSYMBOL_capture_entry = 322, /* capture_entry */ - YYSYMBOL_capture_list = 323, /* capture_list */ - YYSYMBOL_optional_capture_list = 324, /* optional_capture_list */ - YYSYMBOL_expr_block = 325, /* expr_block */ - YYSYMBOL_expr_full_block = 326, /* expr_full_block */ - YYSYMBOL_expr_full_block_assumed_piped = 327, /* expr_full_block_assumed_piped */ - YYSYMBOL_328_21 = 328, /* $@21 */ - YYSYMBOL_expr_numeric_const = 329, /* expr_numeric_const */ - YYSYMBOL_expr_assign = 330, /* expr_assign */ - YYSYMBOL_expr_assign_pipe_right = 331, /* expr_assign_pipe_right */ - YYSYMBOL_expr_assign_pipe = 332, /* expr_assign_pipe */ - YYSYMBOL_expr_named_call = 333, /* expr_named_call */ - YYSYMBOL_expr_method_call = 334, /* expr_method_call */ - YYSYMBOL_func_addr_name = 335, /* func_addr_name */ - YYSYMBOL_func_addr_expr = 336, /* func_addr_expr */ - YYSYMBOL_337_22 = 337, /* $@22 */ - YYSYMBOL_338_23 = 338, /* $@23 */ - YYSYMBOL_339_24 = 339, /* $@24 */ - YYSYMBOL_340_25 = 340, /* $@25 */ - YYSYMBOL_expr_field = 341, /* expr_field */ - YYSYMBOL_342_26 = 342, /* $@26 */ - YYSYMBOL_343_27 = 343, /* $@27 */ - YYSYMBOL_expr_call = 344, /* expr_call */ - YYSYMBOL_expr = 345, /* expr */ - YYSYMBOL_346_28 = 346, /* $@28 */ - YYSYMBOL_347_29 = 347, /* $@29 */ - YYSYMBOL_348_30 = 348, /* $@30 */ - YYSYMBOL_349_31 = 349, /* $@31 */ - YYSYMBOL_350_32 = 350, /* $@32 */ - YYSYMBOL_351_33 = 351, /* $@33 */ - YYSYMBOL_expr_mtag = 352, /* expr_mtag */ - YYSYMBOL_optional_field_annotation = 353, /* optional_field_annotation */ - YYSYMBOL_optional_override = 354, /* optional_override */ - YYSYMBOL_optional_constant = 355, /* optional_constant */ - YYSYMBOL_optional_public_or_private_member_variable = 356, /* optional_public_or_private_member_variable */ - YYSYMBOL_optional_static_member_variable = 357, /* optional_static_member_variable */ - YYSYMBOL_structure_variable_declaration = 358, /* structure_variable_declaration */ - YYSYMBOL_struct_variable_declaration_list = 359, /* struct_variable_declaration_list */ - YYSYMBOL_360_34 = 360, /* $@34 */ - YYSYMBOL_361_35 = 361, /* $@35 */ - YYSYMBOL_362_36 = 362, /* $@36 */ - YYSYMBOL_function_argument_declaration = 363, /* function_argument_declaration */ - YYSYMBOL_function_argument_list = 364, /* function_argument_list */ - YYSYMBOL_tuple_type = 365, /* tuple_type */ - YYSYMBOL_tuple_type_list = 366, /* tuple_type_list */ - YYSYMBOL_tuple_alias_type_list = 367, /* tuple_alias_type_list */ - YYSYMBOL_variant_type = 368, /* variant_type */ - YYSYMBOL_variant_type_list = 369, /* variant_type_list */ - YYSYMBOL_variant_alias_type_list = 370, /* variant_alias_type_list */ - YYSYMBOL_copy_or_move = 371, /* copy_or_move */ - YYSYMBOL_variable_declaration = 372, /* variable_declaration */ - YYSYMBOL_copy_or_move_or_clone = 373, /* copy_or_move_or_clone */ - YYSYMBOL_optional_ref = 374, /* optional_ref */ - YYSYMBOL_let_variable_name_with_pos_list = 375, /* let_variable_name_with_pos_list */ - YYSYMBOL_let_variable_declaration = 376, /* let_variable_declaration */ - YYSYMBOL_global_variable_declaration_list = 377, /* global_variable_declaration_list */ - YYSYMBOL_378_37 = 378, /* $@37 */ - YYSYMBOL_optional_shared = 379, /* optional_shared */ - YYSYMBOL_optional_public_or_private_variable = 380, /* optional_public_or_private_variable */ - YYSYMBOL_global_let = 381, /* global_let */ - YYSYMBOL_382_38 = 382, /* $@38 */ - YYSYMBOL_enum_list = 383, /* enum_list */ - YYSYMBOL_optional_public_or_private_alias = 384, /* optional_public_or_private_alias */ - YYSYMBOL_single_alias = 385, /* single_alias */ - YYSYMBOL_386_39 = 386, /* $@39 */ - YYSYMBOL_alias_list = 387, /* alias_list */ - YYSYMBOL_alias_declaration = 388, /* alias_declaration */ - YYSYMBOL_389_40 = 389, /* $@40 */ - YYSYMBOL_optional_public_or_private_enum = 390, /* optional_public_or_private_enum */ - YYSYMBOL_enum_name = 391, /* enum_name */ - YYSYMBOL_enum_declaration = 392, /* enum_declaration */ - YYSYMBOL_393_41 = 393, /* $@41 */ - YYSYMBOL_394_42 = 394, /* $@42 */ - YYSYMBOL_395_43 = 395, /* $@43 */ - YYSYMBOL_396_44 = 396, /* $@44 */ - YYSYMBOL_optional_structure_parent = 397, /* optional_structure_parent */ - YYSYMBOL_optional_sealed = 398, /* optional_sealed */ - YYSYMBOL_structure_name = 399, /* structure_name */ - YYSYMBOL_class_or_struct = 400, /* class_or_struct */ - YYSYMBOL_optional_public_or_private_structure = 401, /* optional_public_or_private_structure */ - YYSYMBOL_optional_struct_variable_declaration_list = 402, /* optional_struct_variable_declaration_list */ - YYSYMBOL_structure_declaration = 403, /* structure_declaration */ - YYSYMBOL_404_45 = 404, /* $@45 */ - YYSYMBOL_405_46 = 405, /* $@46 */ - YYSYMBOL_variable_name_with_pos_list = 406, /* variable_name_with_pos_list */ - YYSYMBOL_basic_type_declaration = 407, /* basic_type_declaration */ - YYSYMBOL_enum_basic_type_declaration = 408, /* enum_basic_type_declaration */ - YYSYMBOL_structure_type_declaration = 409, /* structure_type_declaration */ - YYSYMBOL_auto_type_declaration = 410, /* auto_type_declaration */ - YYSYMBOL_bitfield_bits = 411, /* bitfield_bits */ - YYSYMBOL_bitfield_alias_bits = 412, /* bitfield_alias_bits */ - YYSYMBOL_bitfield_type_declaration = 413, /* bitfield_type_declaration */ - YYSYMBOL_414_47 = 414, /* $@47 */ - YYSYMBOL_415_48 = 415, /* $@48 */ - YYSYMBOL_table_type_pair = 416, /* table_type_pair */ - YYSYMBOL_dim_list = 417, /* dim_list */ - YYSYMBOL_type_declaration_no_options = 418, /* type_declaration_no_options */ - YYSYMBOL_419_49 = 419, /* $@49 */ - YYSYMBOL_420_50 = 420, /* $@50 */ - YYSYMBOL_421_51 = 421, /* $@51 */ - YYSYMBOL_422_52 = 422, /* $@52 */ - YYSYMBOL_423_53 = 423, /* $@53 */ - YYSYMBOL_424_54 = 424, /* $@54 */ - YYSYMBOL_425_55 = 425, /* $@55 */ - YYSYMBOL_426_56 = 426, /* $@56 */ - YYSYMBOL_427_57 = 427, /* $@57 */ - YYSYMBOL_428_58 = 428, /* $@58 */ - YYSYMBOL_429_59 = 429, /* $@59 */ - YYSYMBOL_430_60 = 430, /* $@60 */ - YYSYMBOL_431_61 = 431, /* $@61 */ - YYSYMBOL_432_62 = 432, /* $@62 */ - YYSYMBOL_433_63 = 433, /* $@63 */ - YYSYMBOL_434_64 = 434, /* $@64 */ - YYSYMBOL_435_65 = 435, /* $@65 */ - YYSYMBOL_436_66 = 436, /* $@66 */ - YYSYMBOL_437_67 = 437, /* $@67 */ - YYSYMBOL_438_68 = 438, /* $@68 */ - YYSYMBOL_439_69 = 439, /* $@69 */ - YYSYMBOL_440_70 = 440, /* $@70 */ - YYSYMBOL_441_71 = 441, /* $@71 */ - YYSYMBOL_442_72 = 442, /* $@72 */ - YYSYMBOL_443_73 = 443, /* $@73 */ - YYSYMBOL_444_74 = 444, /* $@74 */ - YYSYMBOL_445_75 = 445, /* $@75 */ - YYSYMBOL_type_declaration = 446, /* type_declaration */ - YYSYMBOL_tuple_alias_declaration = 447, /* tuple_alias_declaration */ - YYSYMBOL_448_76 = 448, /* $@76 */ - YYSYMBOL_449_77 = 449, /* $@77 */ - YYSYMBOL_450_78 = 450, /* $@78 */ - YYSYMBOL_451_79 = 451, /* $@79 */ - YYSYMBOL_variant_alias_declaration = 452, /* variant_alias_declaration */ - YYSYMBOL_453_80 = 453, /* $@80 */ - YYSYMBOL_454_81 = 454, /* $@81 */ - YYSYMBOL_455_82 = 455, /* $@82 */ - YYSYMBOL_456_83 = 456, /* $@83 */ - YYSYMBOL_bitfield_alias_declaration = 457, /* bitfield_alias_declaration */ - YYSYMBOL_458_84 = 458, /* $@84 */ - YYSYMBOL_459_85 = 459, /* $@85 */ - YYSYMBOL_460_86 = 460, /* $@86 */ - YYSYMBOL_461_87 = 461, /* $@87 */ - YYSYMBOL_make_decl = 462, /* make_decl */ - YYSYMBOL_make_struct_fields = 463, /* make_struct_fields */ - YYSYMBOL_make_variant_dim = 464, /* make_variant_dim */ - YYSYMBOL_make_struct_single = 465, /* make_struct_single */ - YYSYMBOL_make_struct_dim = 466, /* make_struct_dim */ - YYSYMBOL_make_struct_dim_list = 467, /* make_struct_dim_list */ - YYSYMBOL_make_struct_dim_decl = 468, /* make_struct_dim_decl */ - YYSYMBOL_optional_block = 469, /* optional_block */ - YYSYMBOL_optional_trailing_semicolon_cur_cur = 470, /* optional_trailing_semicolon_cur_cur */ - YYSYMBOL_optional_trailing_semicolon_cur_sqr = 471, /* optional_trailing_semicolon_cur_sqr */ - YYSYMBOL_optional_trailing_semicolon_sqr_sqr = 472, /* optional_trailing_semicolon_sqr_sqr */ - YYSYMBOL_optional_trailing_delim_sqr_sqr = 473, /* optional_trailing_delim_sqr_sqr */ - YYSYMBOL_optional_trailing_delim_cur_sqr = 474, /* optional_trailing_delim_cur_sqr */ - YYSYMBOL_use_initializer = 475, /* use_initializer */ - YYSYMBOL_make_struct_decl = 476, /* make_struct_decl */ - YYSYMBOL_477_88 = 477, /* $@88 */ - YYSYMBOL_478_89 = 478, /* $@89 */ - YYSYMBOL_479_90 = 479, /* $@90 */ - YYSYMBOL_480_91 = 480, /* $@91 */ - YYSYMBOL_481_92 = 481, /* $@92 */ - YYSYMBOL_482_93 = 482, /* $@93 */ - YYSYMBOL_483_94 = 483, /* $@94 */ - YYSYMBOL_484_95 = 484, /* $@95 */ - YYSYMBOL_make_tuple = 485, /* make_tuple */ - YYSYMBOL_make_map_tuple = 486, /* make_map_tuple */ - YYSYMBOL_make_tuple_call = 487, /* make_tuple_call */ - YYSYMBOL_488_96 = 488, /* $@96 */ - YYSYMBOL_489_97 = 489, /* $@97 */ - YYSYMBOL_make_dim = 490, /* make_dim */ - YYSYMBOL_make_dim_decl = 491, /* make_dim_decl */ - YYSYMBOL_492_98 = 492, /* $@98 */ - YYSYMBOL_493_99 = 493, /* $@99 */ - YYSYMBOL_494_100 = 494, /* $@100 */ - YYSYMBOL_495_101 = 495, /* $@101 */ - YYSYMBOL_496_102 = 496, /* $@102 */ - YYSYMBOL_497_103 = 497, /* $@103 */ - YYSYMBOL_498_104 = 498, /* $@104 */ - YYSYMBOL_499_105 = 499, /* $@105 */ - YYSYMBOL_500_106 = 500, /* $@106 */ - YYSYMBOL_501_107 = 501, /* $@107 */ - YYSYMBOL_make_table = 502, /* make_table */ - YYSYMBOL_expr_map_tuple_list = 503, /* expr_map_tuple_list */ - YYSYMBOL_make_table_decl = 504, /* make_table_decl */ - YYSYMBOL_array_comprehension_where = 505, /* array_comprehension_where */ - YYSYMBOL_optional_comma = 506, /* optional_comma */ - YYSYMBOL_array_comprehension = 507 /* array_comprehension */ + YYSYMBOL_optional_expr_map_tuple_list = 282, /* optional_expr_map_tuple_list */ + YYSYMBOL_type_declaration_no_options_list = 283, /* type_declaration_no_options_list */ + YYSYMBOL_expression_keyword = 284, /* expression_keyword */ + YYSYMBOL_285_7 = 285, /* $@7 */ + YYSYMBOL_286_8 = 286, /* $@8 */ + YYSYMBOL_287_9 = 287, /* $@9 */ + YYSYMBOL_288_10 = 288, /* $@10 */ + YYSYMBOL_expr_pipe = 289, /* expr_pipe */ + YYSYMBOL_name_in_namespace = 290, /* name_in_namespace */ + YYSYMBOL_expression_delete = 291, /* expression_delete */ + YYSYMBOL_new_type_declaration = 292, /* new_type_declaration */ + YYSYMBOL_293_11 = 293, /* $@11 */ + YYSYMBOL_294_12 = 294, /* $@12 */ + YYSYMBOL_expr_new = 295, /* expr_new */ + YYSYMBOL_expression_break = 296, /* expression_break */ + YYSYMBOL_expression_continue = 297, /* expression_continue */ + YYSYMBOL_expression_return_no_pipe = 298, /* expression_return_no_pipe */ + YYSYMBOL_expression_return = 299, /* expression_return */ + YYSYMBOL_expression_yield_no_pipe = 300, /* expression_yield_no_pipe */ + YYSYMBOL_expression_yield = 301, /* expression_yield */ + YYSYMBOL_expression_try_catch = 302, /* expression_try_catch */ + YYSYMBOL_kwd_let_var_or_nothing = 303, /* kwd_let_var_or_nothing */ + YYSYMBOL_kwd_let = 304, /* kwd_let */ + YYSYMBOL_optional_in_scope = 305, /* optional_in_scope */ + YYSYMBOL_tuple_expansion = 306, /* tuple_expansion */ + YYSYMBOL_tuple_expansion_variable_declaration = 307, /* tuple_expansion_variable_declaration */ + YYSYMBOL_expression_let = 308, /* expression_let */ + YYSYMBOL_expr_cast = 309, /* expr_cast */ + YYSYMBOL_310_13 = 310, /* $@13 */ + YYSYMBOL_311_14 = 311, /* $@14 */ + YYSYMBOL_312_15 = 312, /* $@15 */ + YYSYMBOL_313_16 = 313, /* $@16 */ + YYSYMBOL_314_17 = 314, /* $@17 */ + YYSYMBOL_315_18 = 315, /* $@18 */ + YYSYMBOL_expr_type_decl = 316, /* expr_type_decl */ + YYSYMBOL_317_19 = 317, /* $@19 */ + YYSYMBOL_318_20 = 318, /* $@20 */ + YYSYMBOL_expr_type_info = 319, /* expr_type_info */ + YYSYMBOL_expr_list = 320, /* expr_list */ + YYSYMBOL_block_or_simple_block = 321, /* block_or_simple_block */ + YYSYMBOL_block_or_lambda = 322, /* block_or_lambda */ + YYSYMBOL_capture_entry = 323, /* capture_entry */ + YYSYMBOL_capture_list = 324, /* capture_list */ + YYSYMBOL_optional_capture_list = 325, /* optional_capture_list */ + YYSYMBOL_expr_block = 326, /* expr_block */ + YYSYMBOL_expr_full_block = 327, /* expr_full_block */ + YYSYMBOL_expr_full_block_assumed_piped = 328, /* expr_full_block_assumed_piped */ + YYSYMBOL_329_21 = 329, /* $@21 */ + YYSYMBOL_expr_numeric_const = 330, /* expr_numeric_const */ + YYSYMBOL_expr_assign = 331, /* expr_assign */ + YYSYMBOL_expr_assign_pipe_right = 332, /* expr_assign_pipe_right */ + YYSYMBOL_expr_assign_pipe = 333, /* expr_assign_pipe */ + YYSYMBOL_expr_named_call = 334, /* expr_named_call */ + YYSYMBOL_expr_method_call = 335, /* expr_method_call */ + YYSYMBOL_func_addr_name = 336, /* func_addr_name */ + YYSYMBOL_func_addr_expr = 337, /* func_addr_expr */ + YYSYMBOL_338_22 = 338, /* $@22 */ + YYSYMBOL_339_23 = 339, /* $@23 */ + YYSYMBOL_340_24 = 340, /* $@24 */ + YYSYMBOL_341_25 = 341, /* $@25 */ + YYSYMBOL_expr_field = 342, /* expr_field */ + YYSYMBOL_343_26 = 343, /* $@26 */ + YYSYMBOL_344_27 = 344, /* $@27 */ + YYSYMBOL_expr_call = 345, /* expr_call */ + YYSYMBOL_expr = 346, /* expr */ + YYSYMBOL_347_28 = 347, /* $@28 */ + YYSYMBOL_348_29 = 348, /* $@29 */ + YYSYMBOL_349_30 = 349, /* $@30 */ + YYSYMBOL_350_31 = 350, /* $@31 */ + YYSYMBOL_351_32 = 351, /* $@32 */ + YYSYMBOL_352_33 = 352, /* $@33 */ + YYSYMBOL_expr_mtag = 353, /* expr_mtag */ + YYSYMBOL_optional_field_annotation = 354, /* optional_field_annotation */ + YYSYMBOL_optional_override = 355, /* optional_override */ + YYSYMBOL_optional_constant = 356, /* optional_constant */ + YYSYMBOL_optional_public_or_private_member_variable = 357, /* optional_public_or_private_member_variable */ + YYSYMBOL_optional_static_member_variable = 358, /* optional_static_member_variable */ + YYSYMBOL_structure_variable_declaration = 359, /* structure_variable_declaration */ + YYSYMBOL_struct_variable_declaration_list = 360, /* struct_variable_declaration_list */ + YYSYMBOL_361_34 = 361, /* $@34 */ + YYSYMBOL_362_35 = 362, /* $@35 */ + YYSYMBOL_363_36 = 363, /* $@36 */ + YYSYMBOL_function_argument_declaration = 364, /* function_argument_declaration */ + YYSYMBOL_function_argument_list = 365, /* function_argument_list */ + YYSYMBOL_tuple_type = 366, /* tuple_type */ + YYSYMBOL_tuple_type_list = 367, /* tuple_type_list */ + YYSYMBOL_tuple_alias_type_list = 368, /* tuple_alias_type_list */ + YYSYMBOL_variant_type = 369, /* variant_type */ + YYSYMBOL_variant_type_list = 370, /* variant_type_list */ + YYSYMBOL_variant_alias_type_list = 371, /* variant_alias_type_list */ + YYSYMBOL_copy_or_move = 372, /* copy_or_move */ + YYSYMBOL_variable_declaration = 373, /* variable_declaration */ + YYSYMBOL_copy_or_move_or_clone = 374, /* copy_or_move_or_clone */ + YYSYMBOL_optional_ref = 375, /* optional_ref */ + YYSYMBOL_let_variable_name_with_pos_list = 376, /* let_variable_name_with_pos_list */ + YYSYMBOL_let_variable_declaration = 377, /* let_variable_declaration */ + YYSYMBOL_global_variable_declaration_list = 378, /* global_variable_declaration_list */ + YYSYMBOL_379_37 = 379, /* $@37 */ + YYSYMBOL_optional_shared = 380, /* optional_shared */ + YYSYMBOL_optional_public_or_private_variable = 381, /* optional_public_or_private_variable */ + YYSYMBOL_global_let = 382, /* global_let */ + YYSYMBOL_383_38 = 383, /* $@38 */ + YYSYMBOL_enum_list = 384, /* enum_list */ + YYSYMBOL_optional_public_or_private_alias = 385, /* optional_public_or_private_alias */ + YYSYMBOL_single_alias = 386, /* single_alias */ + YYSYMBOL_387_39 = 387, /* $@39 */ + YYSYMBOL_alias_list = 388, /* alias_list */ + YYSYMBOL_alias_declaration = 389, /* alias_declaration */ + YYSYMBOL_390_40 = 390, /* $@40 */ + YYSYMBOL_optional_public_or_private_enum = 391, /* optional_public_or_private_enum */ + YYSYMBOL_enum_name = 392, /* enum_name */ + YYSYMBOL_enum_declaration = 393, /* enum_declaration */ + YYSYMBOL_394_41 = 394, /* $@41 */ + YYSYMBOL_395_42 = 395, /* $@42 */ + YYSYMBOL_396_43 = 396, /* $@43 */ + YYSYMBOL_397_44 = 397, /* $@44 */ + YYSYMBOL_optional_structure_parent = 398, /* optional_structure_parent */ + YYSYMBOL_optional_sealed = 399, /* optional_sealed */ + YYSYMBOL_structure_name = 400, /* structure_name */ + YYSYMBOL_class_or_struct = 401, /* class_or_struct */ + YYSYMBOL_optional_public_or_private_structure = 402, /* optional_public_or_private_structure */ + YYSYMBOL_optional_struct_variable_declaration_list = 403, /* optional_struct_variable_declaration_list */ + YYSYMBOL_structure_declaration = 404, /* structure_declaration */ + YYSYMBOL_405_45 = 405, /* $@45 */ + YYSYMBOL_406_46 = 406, /* $@46 */ + YYSYMBOL_variable_name_with_pos_list = 407, /* variable_name_with_pos_list */ + YYSYMBOL_basic_type_declaration = 408, /* basic_type_declaration */ + YYSYMBOL_enum_basic_type_declaration = 409, /* enum_basic_type_declaration */ + YYSYMBOL_structure_type_declaration = 410, /* structure_type_declaration */ + YYSYMBOL_auto_type_declaration = 411, /* auto_type_declaration */ + YYSYMBOL_bitfield_bits = 412, /* bitfield_bits */ + YYSYMBOL_bitfield_alias_bits = 413, /* bitfield_alias_bits */ + YYSYMBOL_bitfield_type_declaration = 414, /* bitfield_type_declaration */ + YYSYMBOL_415_47 = 415, /* $@47 */ + YYSYMBOL_416_48 = 416, /* $@48 */ + YYSYMBOL_c_or_s = 417, /* c_or_s */ + YYSYMBOL_table_type_pair = 418, /* table_type_pair */ + YYSYMBOL_dim_list = 419, /* dim_list */ + YYSYMBOL_type_declaration_no_options = 420, /* type_declaration_no_options */ + YYSYMBOL_421_49 = 421, /* $@49 */ + YYSYMBOL_422_50 = 422, /* $@50 */ + YYSYMBOL_423_51 = 423, /* $@51 */ + YYSYMBOL_424_52 = 424, /* $@52 */ + YYSYMBOL_425_53 = 425, /* $@53 */ + YYSYMBOL_426_54 = 426, /* $@54 */ + YYSYMBOL_427_55 = 427, /* $@55 */ + YYSYMBOL_428_56 = 428, /* $@56 */ + YYSYMBOL_429_57 = 429, /* $@57 */ + YYSYMBOL_430_58 = 430, /* $@58 */ + YYSYMBOL_431_59 = 431, /* $@59 */ + YYSYMBOL_432_60 = 432, /* $@60 */ + YYSYMBOL_433_61 = 433, /* $@61 */ + YYSYMBOL_434_62 = 434, /* $@62 */ + YYSYMBOL_435_63 = 435, /* $@63 */ + YYSYMBOL_436_64 = 436, /* $@64 */ + YYSYMBOL_437_65 = 437, /* $@65 */ + YYSYMBOL_438_66 = 438, /* $@66 */ + YYSYMBOL_439_67 = 439, /* $@67 */ + YYSYMBOL_440_68 = 440, /* $@68 */ + YYSYMBOL_441_69 = 441, /* $@69 */ + YYSYMBOL_442_70 = 442, /* $@70 */ + YYSYMBOL_443_71 = 443, /* $@71 */ + YYSYMBOL_444_72 = 444, /* $@72 */ + YYSYMBOL_445_73 = 445, /* $@73 */ + YYSYMBOL_446_74 = 446, /* $@74 */ + YYSYMBOL_447_75 = 447, /* $@75 */ + YYSYMBOL_type_declaration = 448, /* type_declaration */ + YYSYMBOL_tuple_alias_declaration = 449, /* tuple_alias_declaration */ + YYSYMBOL_450_76 = 450, /* $@76 */ + YYSYMBOL_451_77 = 451, /* $@77 */ + YYSYMBOL_452_78 = 452, /* $@78 */ + YYSYMBOL_453_79 = 453, /* $@79 */ + YYSYMBOL_variant_alias_declaration = 454, /* variant_alias_declaration */ + YYSYMBOL_455_80 = 455, /* $@80 */ + YYSYMBOL_456_81 = 456, /* $@81 */ + YYSYMBOL_457_82 = 457, /* $@82 */ + YYSYMBOL_458_83 = 458, /* $@83 */ + YYSYMBOL_bitfield_alias_declaration = 459, /* bitfield_alias_declaration */ + YYSYMBOL_460_84 = 460, /* $@84 */ + YYSYMBOL_461_85 = 461, /* $@85 */ + YYSYMBOL_462_86 = 462, /* $@86 */ + YYSYMBOL_463_87 = 463, /* $@87 */ + YYSYMBOL_make_decl = 464, /* make_decl */ + YYSYMBOL_make_struct_fields = 465, /* make_struct_fields */ + YYSYMBOL_make_variant_dim = 466, /* make_variant_dim */ + YYSYMBOL_make_struct_single = 467, /* make_struct_single */ + YYSYMBOL_make_struct_dim = 468, /* make_struct_dim */ + YYSYMBOL_make_struct_dim_list = 469, /* make_struct_dim_list */ + YYSYMBOL_make_struct_dim_decl = 470, /* make_struct_dim_decl */ + YYSYMBOL_optional_make_struct_dim_decl = 471, /* optional_make_struct_dim_decl */ + YYSYMBOL_optional_block = 472, /* optional_block */ + YYSYMBOL_optional_trailing_semicolon_cur_cur = 473, /* optional_trailing_semicolon_cur_cur */ + YYSYMBOL_optional_trailing_semicolon_cur_sqr = 474, /* optional_trailing_semicolon_cur_sqr */ + YYSYMBOL_optional_trailing_semicolon_sqr_sqr = 475, /* optional_trailing_semicolon_sqr_sqr */ + YYSYMBOL_optional_trailing_delim_sqr_sqr = 476, /* optional_trailing_delim_sqr_sqr */ + YYSYMBOL_optional_trailing_delim_cur_sqr = 477, /* optional_trailing_delim_cur_sqr */ + YYSYMBOL_use_initializer = 478, /* use_initializer */ + YYSYMBOL_make_struct_decl = 479, /* make_struct_decl */ + YYSYMBOL_480_88 = 480, /* $@88 */ + YYSYMBOL_481_89 = 481, /* $@89 */ + YYSYMBOL_482_90 = 482, /* $@90 */ + YYSYMBOL_483_91 = 483, /* $@91 */ + YYSYMBOL_484_92 = 484, /* $@92 */ + YYSYMBOL_485_93 = 485, /* $@93 */ + YYSYMBOL_486_94 = 486, /* $@94 */ + YYSYMBOL_487_95 = 487, /* $@95 */ + YYSYMBOL_make_tuple = 488, /* make_tuple */ + YYSYMBOL_make_map_tuple = 489, /* make_map_tuple */ + YYSYMBOL_make_tuple_call = 490, /* make_tuple_call */ + YYSYMBOL_491_96 = 491, /* $@96 */ + YYSYMBOL_492_97 = 492, /* $@97 */ + YYSYMBOL_make_dim = 493, /* make_dim */ + YYSYMBOL_make_dim_decl = 494, /* make_dim_decl */ + YYSYMBOL_495_98 = 495, /* $@98 */ + YYSYMBOL_496_99 = 496, /* $@99 */ + YYSYMBOL_497_100 = 497, /* $@100 */ + YYSYMBOL_498_101 = 498, /* $@101 */ + YYSYMBOL_499_102 = 499, /* $@102 */ + YYSYMBOL_500_103 = 500, /* $@103 */ + YYSYMBOL_501_104 = 501, /* $@104 */ + YYSYMBOL_502_105 = 502, /* $@105 */ + YYSYMBOL_503_106 = 503, /* $@106 */ + YYSYMBOL_504_107 = 504, /* $@107 */ + YYSYMBOL_make_table = 505, /* make_table */ + YYSYMBOL_expr_map_tuple_list = 506, /* expr_map_tuple_list */ + YYSYMBOL_make_table_decl = 507, /* make_table_decl */ + YYSYMBOL_array_comprehension_where = 508, /* array_comprehension_where */ + YYSYMBOL_optional_comma = 509, /* optional_comma */ + YYSYMBOL_array_comprehension = 510 /* array_comprehension */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -973,16 +976,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 14788 +#define YYLAST 14786 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 217 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 291 +#define YYNNTS 294 /* YYNRULES -- Number of rules. */ -#define YYNRULES 876 +#define YYNRULES 885 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1667 +#define YYNSTATES 1676 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 444 @@ -1050,94 +1053,95 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 540, 540, 541, 546, 547, 548, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 562, 568, 569, - 570, 574, 575, 579, 597, 598, 599, 600, 604, 608, - 613, 622, 630, 646, 651, 659, 659, 698, 728, 732, - 733, 734, 738, 741, 745, 751, 760, 763, 769, 770, - 774, 778, 779, 783, 786, 792, 798, 801, 807, 808, - 812, 813, 814, 823, 824, 828, 829, 829, 835, 836, - 837, 838, 839, 843, 849, 849, 855, 855, 861, 869, - 879, 888, 888, 895, 896, 897, 898, 899, 900, 904, - 909, 917, 918, 919, 923, 924, 925, 926, 927, 928, - 929, 930, 936, 939, 945, 948, 954, 955, 956, 960, - 973, 991, 994, 1002, 1013, 1024, 1035, 1038, 1045, 1049, - 1056, 1057, 1061, 1062, 1063, 1067, 1070, 1077, 1081, 1082, - 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, - 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, - 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, - 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, - 1163, 1164, 1169, 1187, 1188, 1189, 1193, 1199, 1199, 1216, - 1220, 1231, 1240, 1249, 1255, 1256, 1257, 1258, 1259, 1260, - 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, - 1271, 1272, 1273, 1274, 1275, 1279, 1284, 1290, 1296, 1307, - 1308, 1312, 1313, 1317, 1321, 1328, 1328, 1328, 1334, 1334, - 1334, 1343, 1377, 1380, 1383, 1386, 1392, 1393, 1404, 1408, - 1411, 1419, 1419, 1419, 1422, 1428, 1431, 1435, 1439, 1446, - 1453, 1459, 1463, 1467, 1470, 1473, 1481, 1484, 1487, 1495, - 1498, 1506, 1509, 1512, 1520, 1526, 1527, 1528, 1532, 1533, - 1537, 1538, 1542, 1547, 1555, 1561, 1567, 1576, 1588, 1591, - 1597, 1597, 1597, 1600, 1600, 1600, 1605, 1605, 1605, 1613, - 1613, 1613, 1619, 1629, 1640, 1653, 1663, 1674, 1689, 1692, - 1698, 1699, 1706, 1717, 1718, 1719, 1723, 1724, 1725, 1726, - 1730, 1735, 1743, 1744, 1748, 1753, 1760, 1767, 1767, 1776, - 1777, 1778, 1779, 1780, 1781, 1782, 1786, 1787, 1788, 1789, - 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, - 1800, 1801, 1802, 1803, 1804, 1808, 1809, 1810, 1811, 1816, - 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, - 1827, 1828, 1829, 1830, 1831, 1832, 1837, 1844, 1856, 1861, - 1871, 1875, 1882, 1885, 1885, 1885, 1890, 1890, 1890, 1903, - 1907, 1911, 1916, 1923, 1923, 1923, 1930, 1934, 1943, 1947, - 1950, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, - 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, - 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, - 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1997, 1998, 1999, - 2000, 2001, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, - 2022, 2023, 2024, 2025, 2028, 2031, 2032, 2035, 2035, 2035, - 2038, 2043, 2047, 2051, 2051, 2051, 2056, 2059, 2063, 2063, - 2063, 2068, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, - 2079, 2081, 2085, 2086, 2091, 2095, 2096, 2097, 2098, 2099, - 2100, 2101, 2105, 2109, 2113, 2117, 2121, 2125, 2129, 2133, - 2137, 2144, 2145, 2146, 2150, 2151, 2152, 2156, 2157, 2161, - 2162, 2163, 2167, 2168, 2172, 2183, 2186, 2186, 2205, 2204, - 2219, 2218, 2231, 2240, 2249, 2259, 2260, 2264, 2267, 2276, - 2277, 2281, 2284, 2287, 2303, 2312, 2313, 2317, 2320, 2323, - 2337, 2338, 2342, 2348, 2354, 2357, 2361, 2367, 2376, 2377, - 2378, 2382, 2383, 2387, 2394, 2399, 2408, 2414, 2425, 2428, - 2433, 2438, 2446, 2457, 2460, 2460, 2480, 2481, 2485, 2486, - 2487, 2491, 2494, 2494, 2513, 2516, 2519, 2534, 2553, 2554, - 2555, 2560, 2560, 2586, 2587, 2591, 2592, 2592, 2596, 2597, - 2598, 2602, 2612, 2617, 2612, 2629, 2634, 2629, 2649, 2650, - 2654, 2655, 2659, 2665, 2666, 2670, 2671, 2672, 2676, 2679, - 2685, 2690, 2685, 2704, 2711, 2716, 2725, 2731, 2742, 2743, - 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, - 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, - 2764, 2765, 2766, 2767, 2768, 2772, 2773, 2774, 2775, 2776, - 2777, 2778, 2779, 2783, 2794, 2798, 2805, 2817, 2824, 2833, - 2838, 2841, 2854, 2854, 2854, 2867, 2871, 2878, 2882, 2889, - 2890, 2891, 2892, 2893, 2908, 2914, 2914, 2914, 2918, 2923, - 2930, 2930, 2937, 2941, 2945, 2950, 2955, 2960, 2965, 2969, - 2973, 2978, 2982, 2986, 2991, 2991, 2991, 2997, 3004, 3004, - 3004, 3009, 3009, 3009, 3015, 3015, 3015, 3020, 3024, 3024, - 3024, 3029, 3029, 3029, 3038, 3042, 3042, 3042, 3047, 3047, - 3047, 3056, 3060, 3060, 3060, 3065, 3065, 3065, 3074, 3074, - 3074, 3080, 3080, 3080, 3089, 3092, 3103, 3119, 3119, 3124, - 3129, 3119, 3154, 3154, 3159, 3165, 3154, 3190, 3190, 3195, - 3200, 3190, 3230, 3231, 3232, 3233, 3234, 3238, 3245, 3252, - 3258, 3264, 3271, 3278, 3284, 3293, 3299, 3307, 3312, 3319, - 3324, 3331, 3336, 3342, 3343, 3348, 3349, 3353, 3354, 3358, - 3359, 3363, 3364, 3365, 3369, 3370, 3371, 3375, 3376, 3380, - 3386, 3393, 3401, 3408, 3416, 3425, 3425, 3425, 3433, 3433, - 3433, 3440, 3440, 3440, 3447, 3447, 3447, 3458, 3461, 3467, - 3481, 3487, 3493, 3499, 3499, 3499, 3509, 3514, 3521, 3529, - 3534, 3541, 3541, 3541, 3551, 3551, 3551, 3561, 3561, 3561, - 3571, 3579, 3579, 3579, 3587, 3594, 3594, 3594, 3604, 3609, - 3616, 3619, 3625, 3633, 3642, 3650, 3658, 3671, 3672, 3676, - 3677, 3682, 3685, 3688, 3691, 3694, 3697 + 0, 542, 542, 543, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 564, 570, 571, + 572, 576, 577, 581, 599, 600, 601, 602, 606, 610, + 615, 624, 632, 648, 653, 661, 661, 700, 730, 734, + 735, 736, 740, 743, 747, 753, 762, 765, 771, 772, + 776, 780, 781, 785, 788, 794, 800, 803, 809, 810, + 814, 815, 816, 825, 826, 830, 831, 831, 837, 838, + 839, 840, 841, 845, 851, 851, 857, 857, 863, 871, + 881, 890, 890, 897, 898, 899, 900, 901, 902, 906, + 911, 919, 920, 921, 925, 926, 927, 928, 929, 930, + 931, 932, 938, 941, 947, 950, 953, 959, 960, 961, + 965, 978, 996, 999, 1007, 1018, 1029, 1040, 1043, 1050, + 1054, 1061, 1062, 1066, 1067, 1068, 1072, 1075, 1082, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, + 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, + 1167, 1168, 1169, 1174, 1192, 1193, 1194, 1198, 1204, 1204, + 1221, 1225, 1236, 1245, 1254, 1260, 1261, 1262, 1263, 1264, + 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, + 1275, 1276, 1277, 1278, 1279, 1280, 1284, 1289, 1295, 1301, + 1312, 1313, 1317, 1318, 1322, 1323, 1327, 1331, 1338, 1338, + 1338, 1344, 1344, 1344, 1353, 1387, 1390, 1393, 1396, 1402, + 1403, 1414, 1418, 1421, 1429, 1429, 1429, 1432, 1438, 1441, + 1445, 1449, 1456, 1463, 1469, 1473, 1477, 1480, 1483, 1491, + 1494, 1497, 1505, 1508, 1516, 1519, 1522, 1530, 1536, 1537, + 1538, 1542, 1543, 1547, 1548, 1552, 1557, 1565, 1571, 1577, + 1586, 1598, 1601, 1607, 1607, 1607, 1610, 1610, 1610, 1615, + 1615, 1615, 1623, 1623, 1623, 1629, 1639, 1650, 1663, 1673, + 1684, 1699, 1702, 1708, 1709, 1716, 1727, 1728, 1729, 1733, + 1734, 1735, 1736, 1740, 1745, 1753, 1754, 1758, 1763, 1770, + 1777, 1777, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1796, + 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, + 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1818, 1819, + 1820, 1821, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, + 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1847, + 1854, 1866, 1871, 1881, 1885, 1892, 1895, 1895, 1895, 1900, + 1900, 1900, 1913, 1917, 1921, 1926, 1933, 1933, 1933, 1940, + 1944, 1954, 1963, 1972, 1976, 1979, 1985, 1986, 1987, 1988, + 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, + 2019, 2020, 2026, 2027, 2028, 2029, 2030, 2043, 2044, 2045, + 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2057, + 2060, 2061, 2064, 2064, 2064, 2067, 2072, 2076, 2080, 2080, + 2080, 2085, 2088, 2092, 2092, 2092, 2097, 2100, 2101, 2102, + 2103, 2104, 2105, 2106, 2107, 2108, 2110, 2114, 2115, 2120, + 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2134, 2138, 2142, + 2146, 2150, 2154, 2158, 2162, 2166, 2173, 2174, 2175, 2179, + 2180, 2181, 2185, 2186, 2190, 2191, 2192, 2196, 2197, 2201, + 2212, 2215, 2215, 2234, 2233, 2248, 2247, 2260, 2269, 2278, + 2288, 2289, 2293, 2296, 2305, 2306, 2310, 2313, 2316, 2332, + 2341, 2342, 2346, 2349, 2352, 2366, 2367, 2371, 2377, 2383, + 2386, 2390, 2396, 2405, 2406, 2407, 2411, 2412, 2416, 2423, + 2428, 2437, 2443, 2454, 2457, 2462, 2467, 2475, 2486, 2489, + 2489, 2509, 2510, 2514, 2515, 2516, 2520, 2523, 2523, 2542, + 2545, 2548, 2563, 2582, 2583, 2584, 2589, 2589, 2615, 2616, + 2620, 2621, 2621, 2625, 2626, 2627, 2631, 2641, 2646, 2641, + 2658, 2663, 2658, 2678, 2679, 2683, 2684, 2688, 2694, 2695, + 2699, 2700, 2701, 2705, 2708, 2714, 2719, 2714, 2733, 2740, + 2745, 2754, 2760, 2771, 2772, 2773, 2774, 2775, 2776, 2777, + 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, + 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, + 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2812, 2823, + 2827, 2834, 2846, 2853, 2862, 2867, 2870, 2883, 2883, 2883, + 2896, 2897, 2901, 2905, 2912, 2916, 2923, 2924, 2925, 2926, + 2927, 2942, 2948, 2948, 2948, 2952, 2957, 2964, 2964, 2971, + 2975, 2979, 2984, 2989, 2994, 2999, 3003, 3007, 3012, 3016, + 3020, 3025, 3025, 3025, 3031, 3038, 3038, 3038, 3043, 3043, + 3043, 3049, 3049, 3049, 3054, 3058, 3058, 3058, 3063, 3063, + 3063, 3072, 3076, 3076, 3076, 3081, 3081, 3081, 3090, 3094, + 3094, 3094, 3099, 3099, 3099, 3108, 3108, 3108, 3114, 3114, + 3114, 3123, 3126, 3137, 3153, 3153, 3158, 3163, 3153, 3188, + 3188, 3193, 3199, 3188, 3224, 3224, 3229, 3234, 3224, 3264, + 3265, 3266, 3267, 3268, 3272, 3279, 3286, 3292, 3298, 3305, + 3312, 3318, 3327, 3333, 3341, 3346, 3353, 3358, 3365, 3370, + 3376, 3377, 3381, 3382, 3387, 3388, 3392, 3393, 3397, 3398, + 3402, 3403, 3404, 3408, 3409, 3410, 3414, 3415, 3419, 3425, + 3432, 3440, 3447, 3455, 3464, 3464, 3464, 3472, 3472, 3472, + 3479, 3479, 3479, 3486, 3486, 3486, 3497, 3500, 3506, 3520, + 3526, 3532, 3538, 3538, 3538, 3548, 3553, 3560, 3568, 3573, + 3580, 3580, 3580, 3590, 3590, 3590, 3600, 3600, 3600, 3610, + 3618, 3618, 3618, 3637, 3644, 3644, 3644, 3654, 3659, 3666, + 3669, 3675, 3683, 3692, 3700, 3720, 3745, 3746, 3750, 3751, + 3756, 3759, 3762, 3765, 3768, 3771 }; #endif @@ -1217,11 +1221,11 @@ static const char *const yytname[] = "optional_public_or_private_function", "function_declaration_header", "function_declaration", "$@6", "expression_block", "expr_call_pipe", "expression_any", "expressions", "expr_keyword", "optional_expr_list", - "optional_expr_list_in_braces", "type_declaration_no_options_list", - "expression_keyword", "$@7", "$@8", "$@9", "$@10", "expr_pipe", - "name_in_namespace", "expression_delete", "new_type_declaration", "$@11", - "$@12", "expr_new", "expression_break", "expression_continue", - "expression_return_no_pipe", "expression_return", + "optional_expr_list_in_braces", "optional_expr_map_tuple_list", + "type_declaration_no_options_list", "expression_keyword", "$@7", "$@8", + "$@9", "$@10", "expr_pipe", "name_in_namespace", "expression_delete", + "new_type_declaration", "$@11", "$@12", "expr_new", "expression_break", + "expression_continue", "expression_return_no_pipe", "expression_return", "expression_yield_no_pipe", "expression_yield", "expression_try_catch", "kwd_let_var_or_nothing", "kwd_let", "optional_in_scope", "tuple_expansion", "tuple_expansion_variable_declaration", @@ -1254,7 +1258,7 @@ static const char *const yytname[] = "$@45", "$@46", "variable_name_with_pos_list", "basic_type_declaration", "enum_basic_type_declaration", "structure_type_declaration", "auto_type_declaration", "bitfield_bits", "bitfield_alias_bits", - "bitfield_type_declaration", "$@47", "$@48", "table_type_pair", + "bitfield_type_declaration", "$@47", "$@48", "c_or_s", "table_type_pair", "dim_list", "type_declaration_no_options", "$@49", "$@50", "$@51", "$@52", "$@53", "$@54", "$@55", "$@56", "$@57", "$@58", "$@59", "$@60", "$@61", "$@62", "$@63", "$@64", "$@65", "$@66", "$@67", "$@68", "$@69", @@ -1264,8 +1268,8 @@ static const char *const yytname[] = "bitfield_alias_declaration", "$@84", "$@85", "$@86", "$@87", "make_decl", "make_struct_fields", "make_variant_dim", "make_struct_single", "make_struct_dim", "make_struct_dim_list", - "make_struct_dim_decl", "optional_block", - "optional_trailing_semicolon_cur_cur", + "make_struct_dim_decl", "optional_make_struct_dim_decl", + "optional_block", "optional_trailing_semicolon_cur_cur", "optional_trailing_semicolon_cur_sqr", "optional_trailing_semicolon_sqr_sqr", "optional_trailing_delim_sqr_sqr", "optional_trailing_delim_cur_sqr", "use_initializer", "make_struct_decl", @@ -1284,12 +1288,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-1443) +#define YYPACT_NINF (-1453) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-746) +#define YYTABLE_NINF (-753) #define yytable_value_is_error(Yyn) \ ((Yyn) == YYTABLE_NINF) @@ -1298,173 +1302,174 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -1443, 47, -1443, -1443, 48, -80, 282, -57, -1443, -91, - 168, 168, 168, -1443, 70, 55, -1443, -1443, 118, -1443, - -1443, -1443, 487, -1443, 331, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -21, -1443, 138, 212, 241, - -1443, -1443, -1443, -1443, 282, -1443, 27, -1443, 168, 168, - -1443, -1443, 331, -1443, -1443, -1443, -1443, -1443, 300, 319, - -1443, -1443, -1443, 55, 55, 55, 308, -1443, 657, -59, - -1443, -1443, -1443, -1443, 614, 619, 624, -1443, 640, 44, - 48, 335, -80, 366, 387, -1443, 637, 637, -1443, 434, - 450, 1, 474, 648, 479, 500, 540, -1443, 548, 499, - -1443, -1443, -28, 48, 55, 55, 55, 55, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, 568, -1443, -1443, -1443, -1443, - -1443, 551, -1443, -1443, -1443, -1443, -1443, 511, 121, -1443, - -1443, -1443, -1443, 687, -1443, -1443, -1443, -1443, -1443, 570, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, 591, - -1443, 84, -1443, 582, 625, 657, 14620, -1443, 444, 669, - -1443, -50, -1443, -1443, 677, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, 108, -1443, 604, -1443, 599, 630, 643, -1443, - -1443, 13109, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, 789, 791, -1443, - 631, 653, -1443, 567, -1443, 658, -1443, 665, 48, 48, - 641, 327, -1443, -1443, -1443, 121, -1443, 9809, -1443, -1443, - -1443, 678, 691, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, 692, 644, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, 841, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - 696, 661, -1443, -1443, 155, 690, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, 702, 699, 707, - -1443, -50, 18, -1443, 48, 682, 847, 414, -1443, -1443, - 704, 705, 706, 683, 708, 711, -1443, -1443, -1443, 688, - -1443, -1443, -1443, -1443, -1443, 712, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, 714, -1443, -1443, - -1443, 715, 716, -1443, -1443, -1443, -1443, 719, 720, 703, - 70, -1443, -1443, -1443, -1443, -1443, 218, 713, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, 746, 787, -1443, 717, -1443, - 83, -1443, -29, 9809, -1443, 2314, 425, -1443, 70, -1443, - -1443, -1443, 327, 722, -1443, 9004, 757, 758, 9809, -1443, - -16, -1443, -1443, -1443, 9004, -1443, -1443, 759, -1443, 163, - 315, 322, -1443, -1443, 9004, 142, -1443, -1443, -1443, 11, - -1443, -1443, -1443, 43, 5364, -1443, 721, 9565, 441, 9664, - 447, -1443, -1443, 9004, -1443, -1443, 360, 170, -1443, 713, - -1443, 735, 737, 9004, -1443, -1443, -1443, -1443, -1443, 843, - -73, 741, 40, 3134, -1443, -1443, 653, 306, 5566, 723, - 9004, 769, 748, 749, 731, -1443, 766, 754, 788, 5768, - -48, 344, 755, -1443, 347, 762, 763, 3336, 9004, 9004, - 115, 115, 115, 738, 739, 740, 745, 751, 752, -1443, - 9367, 9466, 5972, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - 6174, 765, -1443, 6378, 925, -1443, 9004, 9004, 9004, 9004, - 9004, 4758, 9004, -1443, 750, -1443, -1443, 786, 790, 9004, - 958, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - 597, -1443, 14, 796, -1443, 797, 798, 802, -1443, 803, - -1443, -1443, 903, -1443, -1443, -1443, -1443, 775, -1443, -1443, - -51, -1443, -1443, -1443, -1443, -1443, -1443, 1864, -1443, 774, - -1443, -1443, -1443, -1443, -1443, -1443, 346, -1443, 808, -1443, - -1443, 38, -1443, -1443, 776, 800, 801, -1443, 10248, -1443, - 927, 52, -1443, -1443, -1443, 3740, 9809, 9809, 9809, 10358, - 9809, 9809, 778, 821, 9809, 631, 9809, 631, 9809, 631, - 9908, 827, 10393, -1443, 9004, -1443, -1443, -1443, -1443, 785, - -1443, -1443, 12568, 9004, -1443, 218, 817, -1443, 820, -1, - -1443, 824, 713, 826, 811, -1443, 829, 828, 10503, 794, - 970, -1443, 8, -1443, -1443, -1443, 13144, 360, -1443, 804, - -1443, -1443, 70, 357, -1443, 822, 825, 831, -1443, 9004, - 3740, -1443, 833, 883, 9991, 1001, 9809, 9004, 9004, 13885, - 9004, 13144, 830, -1443, -1443, 9004, -1443, -1443, 836, 859, - 13885, 9004, -1443, -1443, 9004, -1443, -1443, 9004, -1443, 9809, - 3740, -1443, 9991, 618, 618, 807, -1443, 775, -1443, -1443, - -1443, 9004, 9004, 9004, 9004, 9004, 9004, 360, 1637, 360, - 2728, 360, 13243, -1443, 673, -1443, 13144, -1443, 620, 360, - -1443, 840, 849, 618, 618, -63, 618, 618, 360, 1023, - 851, 13885, 851, 261, -1443, -1443, 13144, -1443, -1443, -1443, - -1443, 4960, -1443, -1443, -1443, -1443, -1443, -1443, 122, 880, - 115, -1443, 12983, 14512, 3942, 3942, 3942, 3942, 3942, 3942, - 3942, 3942, 9004, 9004, -1443, -1443, 9004, 3942, 3942, 9004, - 9004, 9004, 871, 3942, 9004, 461, 9004, 9004, 9004, 9004, - 9004, 9004, 3942, 3942, 9004, 9004, 9004, 3942, 3942, 3942, - 9004, 3942, 6580, 9004, 9004, 9004, 9004, 9004, 9004, 9004, - 9004, 9004, 9004, 199, 9004, -1443, 6782, -1443, 9004, -1443, - 425, -1443, 55, 1035, -50, 9809, -1443, 876, -1443, 3740, - -1443, 10103, 105, 147, 855, 206, -1443, 467, 503, -1443, - -1443, 153, 547, 690, 554, 690, 571, 690, -1443, 374, - -1443, 385, -1443, 9809, 832, 833, -1443, -1443, 12667, -1443, - -1443, 9809, -1443, -1443, 9809, -1443, -1443, -1443, 9004, 882, - -1443, 884, -1443, 9809, -1443, 3740, 9809, 9809, -1443, 35, - 9809, 5162, 6984, 886, 9004, 9809, -1443, -1443, -1443, 9809, - 851, -1443, 833, 9004, 9004, 9004, 9004, 9004, 9004, 9004, - 9004, 9004, 9004, 9004, 9004, 9004, 9004, 9004, 9004, 9004, - 9004, 653, 744, 840, 13885, 10538, -1443, -1443, 9809, 9809, - 10648, 9809, -1443, -1443, 10683, 9809, 851, 9809, 9809, 851, - 9809, 921, -1443, 9991, -1443, 880, 10793, 10828, 10938, 10973, - 11083, 11118, 42, 115, 839, 3, 2931, 4146, 7186, 13342, - 872, -10, 263, 879, -30, 68, 7388, -10, 378, 75, - 9004, 878, 9004, -1443, -1443, 9809, -1443, 9809, -1443, 9004, - 613, 80, 9004, 887, -1443, 85, 360, 9004, 856, 858, - 860, 861, 359, -1443, -1443, 573, 9004, 775, 4350, -1443, - 244, 872, 863, 906, 906, -1443, -1443, -25, 631, -1443, - 885, 865, -1443, -1443, 889, 867, -1443, -1443, 115, 115, - 115, -1443, -1443, 2075, -1443, 2075, -1443, 2075, -1443, 2075, - -1443, 2075, -1443, 2075, -1443, 2075, -1443, 2075, 561, 561, - 415, -1443, 2075, -1443, 2075, 415, 9953, 9953, 873, -1443, - 2075, 188, 875, -1443, 12766, -54, -54, 774, 13885, 561, - 561, -1443, 2075, -1443, 2075, 14225, 14100, 14135, -1443, 2075, - -1443, 2075, -1443, 2075, 13975, -1443, 2075, 14543, 13377, 14253, - 14343, 14371, 415, 415, 222, 222, 188, 188, 188, 475, - 9004, 890, 892, 480, 9004, 1082, 12801, -1443, 258, 13467, - 905, 132, 649, 1022, 910, 1079, -1443, -1443, 10213, -1443, - -1443, -1443, -1443, 9809, -1443, -1443, 923, -1443, -1443, 898, - -1443, 900, -1443, 901, 9908, -1443, 827, -1443, 397, 713, - -1443, -1443, 713, 713, 11228, -1443, 1054, -53, -1443, 9991, - 1197, 1715, 9004, 574, 488, 267, 893, 894, 930, 11263, - 398, 11373, 585, 9809, 9809, 9809, 1720, 895, 13885, 13885, - 13885, 13885, 13885, 13885, 13885, 13885, 13885, 13885, 13885, 13885, - 13885, 13885, 13885, 13885, 13885, 13885, -1443, 9809, 902, 897, - -1443, 9004, 1829, 1984, -1443, 2648, -1443, 2850, 904, 3053, - 3256, 907, 3458, 880, 631, -1443, -1443, -1443, -1443, -1443, - 909, 9004, -1443, 9004, 9004, 9004, 4554, 12568, 4, 9004, - 495, 488, 263, -1443, -1443, 913, -1443, 9004, 9004, -1443, - 914, -1443, 9004, 488, 422, 915, -1443, -1443, 9004, 13885, - -1443, -1443, 400, 403, 13502, 9004, -1443, -1443, 2526, 9004, - 88, -1443, -1443, 9004, 9004, 9809, 631, 653, -1443, -1443, - 9004, -1443, 1416, 880, 204, 9206, -1443, -1443, -1443, 251, - 269, 950, 959, 960, 961, -1443, 279, 690, -1443, 9004, - -1443, 9004, -1443, -1443, -1443, 7590, 9004, -1443, 937, 922, - -1443, -1443, 9004, 924, -1443, 12900, 9004, 7792, 928, -1443, - 12999, -1443, -1443, -1443, -1443, -1443, 953, -1443, -1443, 265, - -1443, 26, -1443, 880, -1443, -1443, -1443, -1443, 713, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, 9809, 931, -1443, 967, 9004, -1443, -1443, - 221, -1443, 120, 929, -1443, -1443, -1443, 405, -1443, 976, - 933, -1443, -1443, 3660, 3862, 3939, -1443, -1443, 4066, 9004, - -1443, 13885, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, 601, 690, 7994, 529, 11408, 13885, 13885, -10, 263, - 13885, 934, 171, 872, -1443, -1443, 13885, 879, -1443, 532, - -10, 936, -1443, -1443, -1443, -1443, 533, -1443, -1443, -1443, - 537, -1443, 541, 9004, 11518, 11553, 4143, 690, -1443, 13144, - -1443, 968, 631, 939, 4350, 981, 943, 9, -1443, -1443, - -1443, -1443, -25, 944, 125, 9809, 11663, 9809, 11698, -1443, - 270, 11808, -1443, 9004, 14010, 9004, -1443, 11843, -1443, 275, - 9004, -1443, -1443, -1443, 1124, 26, -1443, -1443, 649, 946, - -1443, -1443, -1443, 713, 9004, -1443, 13885, 947, 948, -1443, - -1443, -1443, 995, 9004, 973, 9004, -1443, -1443, -1443, -1443, - 952, 969, 840, 9004, 9004, 9004, 972, 1110, 977, 978, - 8196, -1443, 125, -1443, 284, 9004, 185, 263, -1443, 9004, - 9004, 9004, 9004, 422, -1443, 9004, 9004, 980, 9004, 9004, - 553, -1443, -1443, -1443, 999, 573, 3538, -1443, 690, -1443, - 292, -1443, 431, 9809, -16, -1443, -1443, 8398, -1443, -1443, - 4270, -1443, 590, -1443, -1443, -1443, 9809, 11953, 11988, -1443, - -1443, 12098, -1443, -1443, 1124, 360, 982, 1110, 1110, 1000, - 12133, 984, 12243, 987, 997, 998, 9004, 9004, 994, 415, - 415, 415, 9004, -1443, -1443, 1110, 488, -1443, 12278, -1443, - -1443, 13592, 9004, 9004, -1443, 12388, 13885, 13885, 13592, -1443, - 1032, 415, 9004, -1443, 1032, 13592, 9004, 273, -1443, -1443, - 8600, 8802, -1443, -1443, -1443, -1443, -1443, 13885, 653, 1006, - 9809, -16, 647, 9004, 9004, 13975, -1443, -1443, 593, -1443, - -1443, -1443, 14620, -1443, -1443, -1443, 113, 113, 9004, -1443, - 9004, -1443, 1110, 1110, 488, 851, 840, -1443, 851, 113, - 872, 1007, -1443, 1161, 1011, 13885, 13885, 207, 1045, 1046, - 1013, 1049, 1019, 13592, -1443, 273, 9004, 9004, 13885, -1443, - -1443, 647, 9004, 9004, 13631, 14010, -1443, -1443, -1443, 1052, - 14620, 488, 872, 1047, 1024, 1025, 12423, 12533, 113, 113, - 1026, 1027, 1028, 1029, 1030, -1443, 9004, 1033, 9004, 9004, - 1034, 1056, -1443, -1443, -1443, 1036, -1443, 13885, 9004, 13721, - 13756, -1443, -1443, -1443, 653, 287, 1037, -1443, -1443, -1443, - -1443, -1443, 1038, 1039, -1443, -1443, -1443, -1443, -1443, 13885, - -1443, 13885, 13885, -1443, -1443, -1443, 13846, -1443, -1443, -1443, - -1443, 488, -1443, -1443, -1443, 289, -1443 + -1453, 99, -1453, -1453, 34, 109, 290, -8, -1453, -87, + 413, 413, 413, -1453, 150, 52, -1453, -1453, 5, -1453, + -1453, -1453, 489, -1453, 281, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, 96, -1453, 203, 302, 268, + -1453, -1453, -1453, -1453, 290, -1453, 24, -1453, 413, 413, + -1453, -1453, 281, -1453, -1453, -1453, -1453, -1453, 339, 329, + -1453, -1453, -1453, 52, 52, 52, 326, -1453, 574, -92, + -1453, -1453, -1453, -1453, 469, 665, 686, -1453, 687, 55, + 34, 342, 109, 370, 471, -1453, 677, 677, -1453, 510, + 419, 15, 503, 694, 571, 573, 594, -1453, 643, 582, + -1453, -1453, -7, 34, 52, 52, 52, 52, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, 648, -1453, -1453, -1453, -1453, + -1453, 601, -1453, -1453, -1453, -1453, -1453, 148, 128, -1453, + -1453, -1453, -1453, 749, -1453, -1453, -1453, -1453, -1453, 628, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 661, + -1453, 155, -1453, -42, 696, 574, 14618, -1453, 479, 745, + -1453, -95, -1453, -1453, 693, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, 181, -1453, 664, -1453, 681, 682, 695, -1453, + -1453, 13225, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, 842, 843, -1453, + 668, 706, -1453, 458, -1453, 718, -1453, 710, 34, 34, + -114, 179, -1453, -1453, -1453, 128, -1453, 9925, -1453, -1453, + -1453, 723, 734, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, 735, 697, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, 888, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + 742, 704, -1453, -1453, 113, 725, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, 738, 729, 741, + -1453, -95, 318, -1453, -1453, 34, 708, 882, 536, -1453, + -1453, 733, 737, 744, 716, 747, 750, -1453, -1453, -1453, + 722, -1453, -1453, -1453, -1453, -1453, 751, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 752, -1453, + -1453, -1453, 754, 759, -1453, -1453, -1453, -1453, 760, 761, + 730, 150, -1453, -1453, -1453, -1453, -1453, 397, 739, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, 767, 820, -1453, 746, + -1453, 219, -1453, 68, 9925, -1453, 2341, 0, -1453, 150, + -1453, -1453, -1453, 179, 748, -1453, 9032, 789, 792, 9925, + -1453, 116, -1453, -1453, -1453, 9032, -1453, -1453, 793, -1453, + 172, 425, 431, -1453, -1453, 9032, -105, -1453, -1453, -1453, + 51, -1453, -1453, -1453, 26, 5392, -1453, 753, 9681, 251, + 9780, 506, -1453, -1453, 9032, -1453, -1453, 260, -71, -1453, + 739, -1453, 769, 772, 9032, -1453, -1453, -1453, -1453, -1453, + 530, -79, 773, 44, 1919, -1453, -1453, 706, 340, 5594, + 755, 9032, 800, 776, 777, 763, -1453, 791, 779, 812, + 5796, -5, 347, 783, -1453, 349, 784, 785, 3364, 9032, + 9032, 62, 62, 62, 774, 775, 778, 781, 782, 790, + -1453, 1757, 9532, 6000, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, 6202, 786, -1453, 6406, 949, -1453, 9032, 9032, 9032, + 9032, 9032, 4988, 9032, -1453, 788, -1453, -1453, 809, 811, + 9032, 987, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, 575, -1453, -72, 817, -1453, 821, 827, 829, -1453, + 830, -1453, -1453, 946, -1453, -1453, -1453, -1453, 802, -1453, + -1453, -54, -1453, -1453, -1453, -1453, -1453, -1453, 9344, -1453, + 801, -1453, -1453, -1453, -1453, -1453, -1453, 533, -1453, 835, + -1453, -1453, 36, -1453, -1453, 803, 823, 831, -1453, 10364, + -1453, 980, 873, -1453, -1453, -1453, 3768, 9925, 9925, 9925, + 10474, 9925, 9925, 810, 857, 9925, 668, 9925, 668, 9925, + 668, 10024, 858, 10509, -1453, 9032, -1453, -1453, -1453, -1453, + 816, -1453, -1453, 12684, 9032, -1453, 397, 848, -1453, 850, + -17, -1453, -1453, 572, -1453, 739, 856, 847, 572, -1453, + 859, 10619, 825, 997, -1453, 138, -1453, -1453, -1453, 13260, + 260, -1453, 828, -1453, -1453, 150, 394, -1453, 851, 852, + 853, -1453, 9032, 3768, -1453, 855, 913, 10107, 1034, 9925, + 9032, 9032, 14001, 9032, 13260, 864, -1453, -1453, 9032, -1453, + -1453, 863, 894, 14001, 9032, -1453, -1453, 9032, -1453, -1453, + 9032, -1453, 9925, 3768, -1453, 10107, 229, 229, 844, -1453, + 802, -1453, -1453, -1453, 9032, 9032, 9032, 9032, 9032, 9032, + 260, 2755, 260, 2958, 260, 13359, -1453, 717, -1453, 13260, + -1453, 689, 260, -1453, 872, 884, 229, 229, -18, 229, + 229, 260, 1051, 880, 14001, 880, 280, -1453, -1453, 13260, + -1453, -1453, -1453, -1453, 3970, -1453, -1453, -1453, -1453, -1453, + -1453, -29, 911, 62, -1453, 13099, 14510, 4172, 4172, 4172, + 4172, 4172, 4172, 4172, 4172, 9032, 9032, -1453, -1453, 9032, + 4172, 4172, 9032, 9032, 9032, 902, 4172, 9032, 420, 9032, + 9032, 9032, 9032, 9032, 9032, 4172, 4172, 9032, 9032, 9032, + 4172, 4172, 4172, 9032, 4172, 6608, 9032, 9032, 9032, 9032, + 9032, 9032, 9032, 9032, 9032, 9032, 134, 9032, -1453, 6810, + -1453, 9032, -1453, 0, -1453, 52, 1064, -95, 9925, -1453, + 906, -1453, 3768, -1453, 10219, 380, 459, 881, 133, -1453, + 544, 588, -1453, -1453, 291, 609, 725, 616, 725, 623, + 725, -1453, 392, -1453, 422, -1453, 9925, 866, 880, -1453, + -1453, 12783, -1453, -1453, 9925, -1453, -1453, 9925, -1453, -1453, + -1453, 9032, 909, -1453, 912, -1453, 9925, -1453, 3768, 9925, + 9925, -1453, 38, 9925, 5190, 7012, 914, 9032, 9925, -1453, + -1453, -1453, 9925, 880, -1453, 855, 9032, 9032, 9032, 9032, + 9032, 9032, 9032, 9032, 9032, 9032, 9032, 9032, 9032, 9032, + 9032, 9032, 9032, 9032, 706, 862, 868, 872, 14001, 10654, + -1453, -1453, 9925, 9925, 10764, 9925, -1453, -1453, 10799, 9925, + 880, 9925, 9925, 880, 9925, 417, -1453, 10107, -1453, 911, + 10909, 10944, 11054, 11089, 11199, 11234, 41, 62, 875, 213, + 3161, 4376, 7214, 13458, 898, 7, 123, 899, 222, 42, + 7416, 7, 622, 45, 9032, 915, 9032, -1453, -1453, 9925, + -1453, 9925, -1453, 9032, 598, 48, 9032, 916, -1453, 49, + 260, 9032, 879, 885, 890, 891, 434, -1453, -1453, 688, + 9032, 802, -82, 4580, -1453, 227, 898, 897, 929, 929, + -1453, -1453, -13, 668, -1453, 918, 892, -1453, -1453, 920, + 903, -1453, -1453, 62, 62, 62, -1453, -1453, 2103, -1453, + 2103, -1453, 2103, -1453, 2103, -1453, 2103, -1453, 2103, -1453, + 2103, -1453, 2103, 822, 822, 467, -1453, 2103, -1453, 2103, + 467, 659, 659, 905, -1453, 2103, 35, 917, -1453, 12882, + 130, 130, 801, 14001, 822, 822, -1453, 2103, -1453, 2103, + 14341, 14216, 14251, -1453, 2103, -1453, 2103, -1453, 2103, 14091, + -1453, 2103, 14541, 13493, 9390, 1436, 14369, 467, 467, 188, + 188, 35, 35, 35, 466, 9032, 921, 922, 491, 9032, + 1113, 12917, -1453, 231, 13583, 939, 319, 703, 1055, 943, + 1060, -1453, -1453, 10329, -1453, -1453, -1453, -1453, 9925, -1453, + -1453, 956, -1453, -1453, 931, -1453, 932, -1453, 933, -1453, + 10024, -1453, 858, 450, 739, -1453, -1453, -1453, 739, 739, + 11344, -1453, 1086, 9, -1453, 10107, 1135, 1224, 9032, 624, + 541, 238, 919, 923, 967, 11379, 430, 11489, 631, 9925, + 9925, 9925, 1249, 924, 14001, 14001, 14001, 14001, 14001, 14001, + 14001, 14001, 14001, 14001, 14001, 14001, 14001, 14001, 14001, 14001, + 14001, 14001, -1453, 926, 9925, -1453, -1453, -1453, 9032, 1254, + 1529, -1453, 1606, -1453, 1677, 927, 1764, 2675, 930, 2877, + 911, 668, -1453, -1453, -1453, -1453, -1453, 935, 9032, -1453, + 9032, 9032, 9032, 4784, 12684, 21, 9032, 556, 541, 123, + -1453, -1453, 928, -1453, 9032, 9032, -1453, 934, -1453, 9032, + 541, 547, 937, -1453, -1453, 9032, 14001, -1453, -1453, 475, + 520, 13618, 9032, -1453, -1453, 2553, 9032, 53, -1453, -1453, + 9032, 9032, 9925, 668, 706, -1453, -1453, 9032, -1453, 9540, + 911, 175, -1453, 936, 335, 9234, -1453, -1453, -1453, 351, + 250, 976, 982, 984, 985, -1453, 355, 725, -1453, 9032, + -1453, 9032, -1453, -1453, -1453, 7618, 9032, -1453, 961, 945, + -1453, -1453, 9032, 947, -1453, 13016, 9032, 7820, 951, -1453, + 13115, -1453, -1453, -1453, -1453, -1453, 962, -1453, -1453, 265, + -1453, 50, -1453, 911, -1453, -1453, -1453, -1453, 739, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, 952, 9925, -1453, 1000, 9032, -1453, -1453, + 495, -1453, 942, -1453, -1453, -1453, 521, -1453, 1003, 960, + -1453, -1453, 3080, 3283, 3486, -1453, -1453, 9032, 3688, 14001, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 660, + 725, 8022, 581, 11524, 14001, 14001, 7, 123, 14001, 963, + 224, 898, -1453, -1453, 14001, 899, -1453, 583, 7, 966, + -1453, -1453, -1453, -1453, 586, -1453, -1453, -1453, 611, -1453, + 612, 9032, 11634, 11669, 3890, 725, -1453, 13260, -1453, 993, + 668, -1453, 968, 4580, 1011, 972, 163, -1453, -1453, -1453, + -1453, -13, 977, -25, 9925, 11779, 9925, 11814, -1453, 261, + 11924, -1453, 9032, 14126, 9032, -1453, 11959, -1453, 267, 9032, + -1453, -1453, -1453, 1157, 50, -1453, -1453, 703, 989, -1453, + -1453, -1453, 9032, 739, -1453, 14001, 990, 991, -1453, -1453, + -1453, 9032, 1029, 1005, 9032, -1453, -1453, -1453, -1453, 995, + 996, 1006, 9032, 9032, 9032, 1008, 1139, 1009, 1010, 8224, + -1453, -25, -1453, 293, 9032, 247, 123, -1453, 9032, 9032, + 9032, 9032, 547, -1453, 9032, 9032, 1013, 9032, 9032, 614, + -1453, -1453, -1453, 1032, 688, 3566, -1453, 725, -1453, 358, + -1453, 226, 9925, 116, -1453, -1453, 8426, -1453, -1453, 4092, + -1453, 632, -1453, -1453, -1453, 9925, 12069, 12104, -1453, -1453, + 12214, -1453, -1453, 1157, 260, 1015, 1139, 1139, 12249, 1037, + 1028, 12359, 1030, 1038, 1039, 9032, -1453, 9032, 467, 467, + 467, 9032, -1453, -1453, 1139, 541, -1453, 12394, -1453, -1453, + 13708, 9032, 9032, -1453, 12504, 14001, 14001, 13708, -1453, 1069, + 467, 9032, -1453, 1069, 13708, 9032, 119, -1453, -1453, 8628, + 8830, -1453, -1453, -1453, -1453, -1453, 14001, 706, 1040, 9925, + 116, 974, 9032, 9032, 14091, -1453, -1453, 637, -1453, -1453, + -1453, 14618, -1453, -1453, -1453, 124, 124, -1453, 9032, 9032, + -1453, 1139, 1139, 541, 1045, 1046, 880, 124, 898, 1047, + -1453, 1210, 1052, 14001, 14001, 255, 1087, 1088, 1079, 1090, + 1061, 13708, -1453, 119, 9032, 9032, 14001, -1453, -1453, 974, + 9032, 9032, 13747, 14126, -1453, -1453, -1453, 1091, 14618, 541, + 898, 1092, -1453, 1066, 1072, 12539, 12649, 124, 124, 1074, + -1453, -1453, 1075, 1076, -1453, 9032, 1062, 9032, 9032, 1063, + 1103, -1453, 1077, -1453, -1453, 1080, -1453, 14001, 9032, 13837, + 13872, -1453, -1453, -1453, 706, 309, 1089, -1453, -1453, -1453, + -1453, -1453, 1093, 1094, -1453, -1453, -1453, 14001, -1453, 14001, + 14001, -1453, -1453, -1453, -1453, 13962, -1453, -1453, -1453, -1453, + 541, -1453, -1453, -1453, 313, -1453 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1472,243 +1477,244 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_int16 yydefact[] = { - 2, 120, 1, 298, 0, 0, 0, 606, 299, 0, - 598, 598, 598, 16, 0, 0, 15, 3, 0, 10, - 9, 8, 0, 7, 586, 6, 11, 5, 4, 13, + 2, 121, 1, 301, 0, 0, 0, 611, 302, 0, + 603, 603, 603, 16, 0, 0, 15, 3, 0, 10, + 9, 8, 0, 7, 591, 6, 11, 5, 4, 13, 12, 14, 92, 93, 91, 100, 102, 37, 53, 50, - 51, 39, 40, 41, 0, 42, 48, 38, 598, 598, - 22, 21, 586, 600, 599, 767, 757, 762, 0, 266, - 35, 107, 108, 0, 0, 0, 109, 111, 118, 0, - 106, 17, 624, 623, 213, 608, 625, 587, 588, 0, + 51, 39, 40, 41, 0, 42, 48, 38, 603, 603, + 22, 21, 591, 605, 604, 774, 764, 769, 0, 269, + 35, 108, 109, 0, 0, 0, 110, 112, 119, 0, + 107, 17, 629, 628, 214, 613, 630, 592, 593, 0, 0, 0, 0, 43, 0, 49, 0, 0, 46, 0, - 0, 598, 0, 18, 0, 0, 0, 268, 0, 0, - 117, 112, 0, 0, 0, 0, 0, 0, 121, 215, - 214, 217, 212, 610, 609, 0, 627, 626, 630, 590, - 589, 592, 98, 99, 96, 97, 95, 0, 0, 94, - 103, 54, 52, 48, 45, 44, 601, 603, 605, 0, - 607, 19, 20, 23, 768, 758, 763, 267, 33, 36, - 116, 0, 113, 114, 115, 119, 0, 611, 0, 620, - 583, 521, 24, 25, 0, 87, 88, 85, 86, 84, - 83, 89, 0, 47, 0, 604, 0, 0, 0, 34, - 110, 0, 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, 0, 0, 127, - 122, 0, 612, 0, 621, 0, 631, 584, 0, 0, - 523, 0, 26, 27, 28, 0, 101, 0, 769, 759, - 764, 181, 182, 179, 130, 131, 133, 132, 134, 135, - 136, 137, 163, 164, 161, 162, 154, 165, 166, 155, - 152, 153, 180, 174, 0, 178, 167, 168, 169, 170, - 141, 142, 143, 138, 139, 140, 151, 0, 157, 158, - 156, 149, 150, 145, 144, 146, 147, 148, 129, 128, - 173, 0, 159, 160, 521, 125, 245, 218, 594, 665, - 668, 671, 672, 666, 669, 667, 670, 0, 618, 628, - 591, 521, 0, 104, 0, 0, 573, 571, 593, 90, - 0, 0, 0, 0, 0, 0, 638, 658, 639, 674, - 640, 644, 645, 646, 647, 664, 651, 652, 653, 654, - 655, 656, 657, 659, 660, 661, 662, 727, 643, 650, - 663, 734, 741, 641, 648, 642, 649, 0, 0, 0, - 0, 673, 689, 692, 690, 691, 754, 602, 679, 551, - 557, 183, 184, 177, 172, 185, 175, 171, 0, 123, - 297, 545, 0, 0, 216, 0, 613, 615, 0, 622, - 535, 632, 0, 0, 105, 0, 0, 0, 0, 572, - 0, 695, 718, 721, 0, 724, 714, 0, 682, 728, - 735, 742, 748, 751, 0, 0, 704, 709, 703, 0, - 717, 713, 706, 0, 0, 708, 693, 0, 770, 760, - 765, 186, 176, 0, 295, 296, 0, 521, 124, 126, - 247, 0, 0, 0, 63, 64, 76, 427, 428, 0, - 0, 0, 0, 283, 421, 281, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, - 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 510, - 0, 0, 0, 349, 351, 350, 352, 353, 354, 355, - 0, 0, 29, 0, 219, 224, 0, 0, 0, 0, - 0, 0, 0, 333, 334, 425, 424, 0, 0, 0, - 0, 240, 235, 232, 231, 233, 234, 265, 246, 226, - 504, 225, 422, 0, 495, 71, 72, 69, 238, 70, - 239, 241, 301, 230, 494, 493, 492, 120, 498, 423, - 0, 227, 497, 496, 468, 429, 469, 356, 430, 0, - 426, 772, 776, 773, 774, 775, 0, 595, 0, 594, - 619, 536, 585, 522, 0, 0, 0, 504, 0, 575, - 576, 0, 569, 570, 568, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 0, 122, 0, 122, - 0, 0, 0, 700, 249, 711, 712, 705, 707, 0, - 710, 694, 0, 0, 756, 755, 0, 680, 0, 266, - 552, 0, 547, 0, 0, 558, 0, 0, 0, 0, - 633, 543, 562, 546, 815, 818, 0, 0, 271, 275, - 274, 280, 0, 0, 319, 0, 0, 0, 851, 0, - 0, 287, 284, 0, 328, 0, 0, 0, 0, 269, - 0, 0, 0, 310, 313, 0, 244, 316, 0, 0, - 57, 0, 78, 855, 0, 824, 833, 0, 821, 0, - 0, 292, 289, 457, 458, 334, 344, 120, 264, 262, - 263, 0, 0, 0, 0, 0, 0, 0, 793, 0, - 0, 0, 831, 858, 0, 255, 0, 258, 0, 0, - 860, 869, 0, 434, 433, 470, 432, 431, 0, 0, - 869, 328, 869, 335, 242, 243, 0, 74, 347, 222, - 502, 0, 229, 236, 237, 286, 291, 300, 0, 342, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 459, 460, 0, 0, 0, 0, + 0, 603, 0, 18, 0, 0, 0, 271, 0, 0, + 118, 113, 0, 0, 0, 0, 0, 0, 122, 216, + 215, 218, 213, 615, 614, 0, 632, 631, 635, 595, + 594, 597, 98, 99, 96, 97, 95, 0, 0, 94, + 103, 54, 52, 48, 45, 44, 606, 608, 610, 0, + 612, 19, 20, 23, 775, 765, 770, 270, 33, 36, + 117, 0, 114, 115, 116, 120, 0, 616, 0, 625, + 588, 526, 24, 25, 0, 87, 88, 85, 86, 84, + 83, 89, 0, 47, 0, 609, 0, 0, 0, 34, + 111, 0, 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, 0, 0, 128, + 123, 0, 617, 0, 626, 0, 636, 589, 0, 0, + 528, 0, 26, 27, 28, 0, 101, 0, 776, 766, + 771, 182, 183, 180, 131, 132, 134, 133, 135, 136, + 137, 138, 164, 165, 162, 163, 155, 166, 167, 156, + 153, 154, 181, 175, 0, 179, 168, 169, 170, 171, + 142, 143, 144, 139, 140, 141, 152, 0, 158, 159, + 157, 150, 151, 146, 145, 147, 148, 149, 130, 129, + 174, 0, 160, 161, 526, 126, 246, 219, 599, 670, + 673, 676, 677, 671, 674, 672, 675, 0, 623, 633, + 596, 526, 0, 104, 106, 0, 0, 578, 576, 598, + 90, 0, 0, 0, 0, 0, 0, 643, 663, 644, + 679, 645, 649, 650, 651, 652, 669, 656, 657, 658, + 659, 660, 661, 662, 664, 665, 666, 667, 734, 648, + 655, 668, 741, 748, 646, 653, 647, 654, 0, 0, + 0, 0, 678, 696, 699, 697, 698, 761, 607, 684, + 556, 562, 184, 185, 178, 173, 186, 176, 172, 0, + 124, 300, 550, 0, 0, 217, 0, 618, 620, 0, + 627, 540, 637, 0, 0, 105, 0, 0, 0, 0, + 577, 0, 702, 725, 728, 0, 731, 721, 0, 687, + 735, 742, 749, 755, 758, 0, 0, 711, 716, 710, + 0, 724, 720, 713, 0, 0, 715, 700, 0, 777, + 767, 772, 187, 177, 0, 298, 299, 0, 526, 125, + 127, 248, 0, 0, 0, 63, 64, 76, 432, 433, + 0, 0, 0, 0, 286, 426, 284, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, + 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 0, 352, 354, 353, 355, 356, 357, + 358, 0, 0, 29, 0, 220, 225, 0, 0, 0, + 0, 0, 0, 0, 336, 337, 430, 429, 0, 0, + 0, 0, 241, 236, 233, 232, 234, 235, 268, 247, + 227, 509, 226, 427, 0, 500, 71, 72, 69, 239, + 70, 240, 242, 304, 231, 499, 498, 497, 121, 503, + 428, 0, 228, 502, 501, 473, 434, 474, 359, 435, + 0, 431, 779, 783, 780, 781, 782, 0, 600, 0, + 599, 624, 541, 590, 527, 0, 0, 0, 509, 0, + 580, 581, 0, 574, 575, 573, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 123, 0, + 123, 0, 0, 0, 707, 250, 718, 719, 712, 714, + 0, 717, 701, 0, 0, 763, 762, 0, 685, 0, + 269, 691, 690, 0, 557, 552, 0, 0, 0, 563, + 0, 0, 0, 638, 548, 567, 551, 824, 827, 0, + 0, 274, 278, 277, 283, 0, 0, 322, 0, 0, + 0, 860, 0, 0, 290, 287, 0, 331, 0, 0, + 254, 0, 272, 0, 0, 0, 313, 316, 0, 245, + 319, 0, 0, 57, 0, 78, 864, 0, 833, 842, + 0, 830, 0, 0, 295, 292, 462, 463, 337, 347, + 121, 267, 265, 266, 0, 0, 0, 0, 0, 0, + 0, 802, 0, 0, 0, 840, 867, 0, 258, 0, + 261, 0, 0, 869, 878, 0, 439, 438, 475, 437, + 436, 0, 0, 878, 331, 878, 338, 243, 244, 0, + 74, 350, 223, 507, 0, 230, 237, 238, 289, 294, + 303, 0, 345, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 464, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 413, 0, 221, 0, 596, 0, 614, - 616, 629, 0, 0, 521, 0, 574, 0, 578, 0, - 582, 356, 0, 0, 0, 685, 698, 0, 0, 675, - 677, 0, 0, 125, 0, 125, 0, 125, 549, 0, - 555, 0, 676, 0, 0, 250, 702, 687, 0, 681, - 771, 0, 553, 761, 0, 559, 766, 544, 0, 0, - 561, 0, 560, 0, 563, 0, 0, 0, 79, 0, - 0, 807, 0, 0, 0, 0, 841, 844, 847, 0, - 869, 288, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 869, 270, 0, 80, 81, 0, 0, - 0, 0, 55, 56, 0, 0, 869, 0, 0, 869, - 0, 0, 293, 290, 335, 342, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 266, 0, 0, 0, 827, - 787, 793, 0, 836, 0, 0, 0, 793, 0, 0, - 0, 0, 0, 796, 863, 0, 248, 0, 32, 0, - 30, 0, 870, 0, 245, 0, 0, 870, 0, 0, - 0, 0, 403, 400, 402, 60, 0, 120, 0, 416, - 0, 786, 0, 0, 0, 309, 308, 0, 122, 261, - 0, 0, 481, 480, 0, 0, 482, 486, 0, 0, - 0, 378, 387, 366, 388, 367, 390, 369, 389, 368, - 391, 370, 381, 360, 382, 361, 383, 362, 435, 436, - 448, 392, 371, 393, 372, 449, 446, 447, 0, 380, - 358, 475, 0, 466, 0, 499, 500, 501, 359, 437, - 438, 394, 373, 395, 374, 453, 454, 455, 384, 363, - 385, 364, 386, 365, 456, 379, 357, 0, 0, 451, - 452, 450, 444, 445, 440, 439, 441, 442, 443, 0, - 0, 0, 409, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 529, 532, 0, 0, 577, 580, 356, 581, - 696, 719, 722, 0, 725, 715, 0, 683, 729, 0, - 736, 0, 743, 0, 0, 749, 0, 752, 0, 253, - 699, 688, 548, 554, 0, 635, 636, 564, 567, 566, - 0, 0, 0, 0, 808, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 329, 366, - 367, 369, 368, 370, 360, 361, 362, 371, 372, 358, - 373, 374, 363, 364, 365, 357, 294, 0, 0, 0, - 471, 0, 0, 0, 472, 0, 503, 0, 0, 0, - 0, 0, 0, 342, 122, 505, 506, 507, 508, 509, - 0, 0, 794, 0, 0, 0, 0, 328, 793, 0, - 0, 0, 0, 802, 803, 0, 810, 0, 0, 800, - 0, 839, 0, 0, 0, 0, 798, 840, 0, 830, - 795, 859, 0, 0, 0, 0, 861, 862, 0, 0, - 0, 838, 461, 0, 0, 0, 122, 0, 58, 59, - 0, 73, 65, 342, 0, 0, 418, 417, 302, 0, - 0, 0, 0, 0, 0, 340, 0, 125, 477, 0, - 483, 0, 377, 375, 376, 0, 0, 464, 0, 0, - 487, 491, 0, 0, 467, 0, 0, 0, 0, 410, - 0, 414, 462, 420, 597, 617, 121, 530, 531, 532, - 533, 524, 537, 342, 579, 697, 720, 723, 686, 726, - 716, 678, 684, 730, 732, 737, 739, 744, 746, 550, - 750, 556, 753, 0, 0, 634, 0, 0, 816, 819, - 0, 272, 0, 0, 277, 278, 276, 0, 322, 0, - 0, 325, 320, 0, 0, 0, 852, 850, 0, 0, - 864, 82, 311, 314, 317, 856, 854, 825, 834, 832, - 822, 0, 125, 0, 0, 0, 778, 777, 793, 0, - 828, 0, 0, 788, 809, 801, 829, 837, 799, 0, - 793, 0, 805, 806, 813, 797, 0, 256, 259, 31, - 0, 220, 0, 0, 0, 0, 0, 125, 61, 0, - 66, 0, 122, 0, 0, 0, 0, 571, 338, 339, - 337, 336, 0, 0, 0, 0, 0, 0, 0, 398, - 0, 0, 488, 0, 476, 0, 465, 0, 411, 0, - 0, 463, 415, 542, 527, 524, 525, 526, 529, 0, - 733, 740, 747, 254, 249, 637, 565, 0, 0, 77, - 273, 279, 0, 0, 0, 0, 321, 842, 845, 848, - 0, 0, 869, 0, 0, 0, 0, 807, 0, 0, - 0, 223, 0, 511, 0, 0, 0, 0, 811, 0, - 0, 0, 0, 0, 804, 0, 0, 251, 0, 0, - 0, 401, 520, 404, 0, 60, 0, 75, 125, 396, - 0, 303, 571, 0, 0, 341, 343, 0, 330, 346, - 0, 519, 0, 517, 399, 514, 0, 0, 0, 513, - 412, 0, 528, 538, 527, 0, 0, 807, 807, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 315, 318, 0, 808, 826, 807, 0, 473, 0, 345, - 512, 867, 0, 0, 812, 0, 780, 779, 867, 814, - 867, 257, 249, 260, 867, 867, 0, 0, 407, 62, - 283, 0, 67, 71, 72, 69, 70, 68, 0, 0, - 0, 0, 0, 0, 0, 331, 478, 484, 0, 518, - 516, 515, 0, 540, 534, 701, 0, 0, 0, 323, - 0, 326, 807, 807, 0, 869, 869, 865, 869, 0, - 785, 0, 474, 0, 0, 782, 781, 0, 0, 0, - 0, 0, 0, 867, 405, 0, 0, 0, 289, 348, - 397, 0, 0, 0, 0, 332, 479, 485, 489, 0, - 0, 0, 791, 869, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 823, 0, 0, 0, 0, - 0, 0, 252, 875, 871, 0, 408, 290, 0, 0, - 0, 307, 490, 539, 0, 0, 870, 792, 817, 820, - 324, 327, 0, 0, 849, 853, 866, 857, 835, 868, - 873, 784, 783, 874, 876, 872, 0, 306, 305, 541, - 789, 0, 843, 846, 304, 0, 790 + 0, 0, 0, 0, 0, 0, 416, 0, 222, 0, + 601, 0, 619, 621, 634, 0, 0, 526, 0, 579, + 0, 583, 0, 587, 359, 0, 0, 0, 692, 705, + 0, 0, 680, 682, 0, 0, 126, 0, 126, 0, + 126, 554, 0, 560, 0, 681, 0, 0, 878, 709, + 694, 0, 686, 778, 0, 558, 768, 0, 564, 773, + 549, 0, 0, 566, 0, 565, 0, 568, 0, 0, + 0, 79, 0, 0, 816, 0, 0, 0, 0, 850, + 853, 856, 0, 878, 291, 288, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 878, 273, 0, + 80, 81, 0, 0, 0, 0, 55, 56, 0, 0, + 878, 0, 0, 878, 0, 0, 296, 293, 338, 345, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 836, 794, 802, 0, 845, 0, 0, + 0, 802, 0, 0, 0, 0, 0, 805, 872, 0, + 249, 0, 32, 0, 30, 0, 879, 0, 246, 0, + 0, 879, 0, 0, 0, 0, 406, 403, 405, 60, + 0, 121, 0, 0, 419, 0, 793, 0, 0, 0, + 312, 311, 0, 123, 264, 0, 0, 486, 485, 0, + 0, 487, 491, 0, 0, 0, 381, 390, 369, 391, + 370, 393, 372, 392, 371, 394, 373, 384, 363, 385, + 364, 386, 365, 440, 441, 453, 395, 374, 396, 375, + 454, 451, 452, 0, 383, 361, 480, 0, 471, 0, + 504, 505, 506, 362, 442, 443, 397, 376, 398, 377, + 458, 459, 460, 387, 366, 388, 367, 389, 368, 461, + 382, 360, 0, 0, 456, 457, 455, 449, 450, 445, + 444, 446, 447, 448, 0, 0, 0, 412, 0, 0, + 0, 0, 424, 0, 0, 0, 0, 534, 537, 0, + 0, 582, 585, 359, 586, 703, 726, 729, 0, 732, + 722, 0, 688, 736, 0, 743, 0, 750, 0, 756, + 0, 759, 0, 0, 256, 706, 251, 695, 553, 559, + 0, 640, 641, 569, 572, 571, 0, 0, 0, 0, + 817, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 332, 369, 370, 372, 371, 373, + 363, 364, 365, 374, 375, 361, 376, 377, 366, 367, + 368, 360, 297, 0, 0, 873, 255, 476, 0, 0, + 0, 477, 0, 508, 0, 0, 0, 0, 0, 0, + 345, 123, 510, 511, 512, 513, 514, 0, 0, 803, + 0, 0, 0, 0, 331, 802, 0, 0, 0, 0, + 811, 812, 0, 819, 0, 0, 809, 0, 848, 0, + 0, 0, 0, 807, 849, 0, 839, 804, 868, 0, + 0, 0, 0, 870, 871, 0, 0, 0, 847, 466, + 0, 0, 0, 123, 0, 58, 59, 0, 73, 65, + 345, 0, 420, 0, 0, 0, 423, 421, 305, 0, + 0, 0, 0, 0, 0, 343, 0, 126, 482, 0, + 488, 0, 380, 378, 379, 0, 0, 469, 0, 0, + 492, 496, 0, 0, 472, 0, 0, 0, 0, 413, + 0, 417, 467, 425, 602, 622, 122, 535, 536, 537, + 538, 529, 542, 345, 584, 704, 727, 730, 693, 733, + 723, 683, 689, 737, 739, 744, 746, 751, 753, 757, + 555, 760, 561, 0, 0, 639, 0, 0, 825, 828, + 0, 275, 0, 280, 281, 279, 0, 325, 0, 0, + 328, 323, 0, 0, 0, 861, 859, 254, 0, 82, + 314, 317, 320, 865, 863, 834, 843, 841, 831, 0, + 126, 0, 0, 0, 785, 784, 802, 0, 837, 0, + 0, 795, 818, 810, 838, 846, 808, 0, 802, 0, + 814, 815, 822, 806, 0, 259, 262, 31, 0, 221, + 0, 0, 0, 0, 0, 126, 61, 0, 66, 0, + 123, 422, 0, 0, 0, 0, 576, 341, 342, 340, + 339, 0, 0, 0, 0, 0, 0, 0, 401, 0, + 0, 493, 0, 481, 0, 470, 0, 414, 0, 0, + 468, 418, 547, 532, 529, 530, 531, 534, 0, 740, + 747, 754, 250, 257, 642, 570, 0, 0, 77, 276, + 282, 0, 0, 0, 0, 324, 851, 854, 857, 0, + 0, 0, 0, 0, 0, 0, 816, 0, 0, 0, + 224, 0, 516, 0, 0, 0, 0, 820, 0, 0, + 0, 0, 0, 813, 0, 0, 252, 0, 0, 0, + 404, 525, 407, 0, 60, 0, 75, 126, 399, 0, + 306, 576, 0, 0, 344, 346, 0, 333, 349, 0, + 524, 0, 522, 402, 519, 0, 0, 0, 518, 415, + 0, 533, 543, 532, 0, 0, 816, 816, 0, 0, + 0, 0, 0, 0, 0, 250, 874, 254, 315, 318, + 321, 0, 817, 835, 816, 0, 478, 0, 348, 517, + 876, 0, 0, 821, 0, 787, 786, 876, 823, 876, + 260, 250, 263, 876, 876, 0, 0, 410, 62, 286, + 0, 67, 71, 72, 69, 70, 68, 0, 0, 0, + 0, 0, 0, 0, 334, 483, 489, 0, 523, 521, + 520, 0, 545, 539, 708, 801, 801, 326, 0, 0, + 329, 816, 816, 0, 0, 0, 878, 801, 792, 0, + 479, 0, 0, 789, 788, 0, 0, 0, 878, 0, + 0, 876, 408, 0, 0, 0, 292, 351, 400, 0, + 0, 0, 0, 335, 484, 490, 494, 0, 0, 0, + 798, 878, 800, 0, 0, 0, 0, 801, 801, 0, + 862, 875, 0, 0, 832, 0, 0, 0, 0, 0, + 0, 879, 0, 884, 880, 0, 411, 293, 0, 0, + 0, 310, 495, 544, 0, 0, 879, 799, 826, 829, + 327, 330, 0, 0, 858, 866, 844, 877, 882, 791, + 790, 883, 885, 253, 881, 0, 309, 308, 546, 796, + 0, 852, 855, 307, 0, 797 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1443, -1443, -1443, -1443, -1443, -1443, 538, 1167, -1443, -1443, - -1443, 1247, -1443, -1443, -1443, 710, 1206, -1443, 1120, -1443, - -1443, 1172, -1443, -1443, -1443, -200, -1443, -1443, -1443, -198, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, 1040, - -1443, -1443, -40, -43, -1443, -1443, -1443, 482, 468, -509, - -564, -784, -1443, -1443, -1443, -1407, -1443, -1443, -209, -361, - -1443, 320, -1443, -1349, -1443, -184, 435, -1443, -1443, -1443, - -1443, -421, -14, -1443, -1443, -1443, -1443, -1443, -194, -193, - -188, -1443, -186, -1443, -1443, -1443, 1258, -1443, 311, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -433, -160, 318, -96, -1443, -868, -455, -1443, - -502, -1443, -1443, -368, 293, -1443, -1443, -1443, -1442, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, 718, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -142, -118, -206, -117, - 23, -1443, -1443, -1443, -1443, -1443, 857, -1443, -563, -1443, - -1443, -567, -1443, -1443, -618, -202, -568, -1305, -1443, -346, - -1443, -1443, 1233, -1443, -1443, -1443, 727, 881, 169, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -586, - -197, -1443, 848, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -383, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -215, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, 852, -682, -276, -813, -670, - -1443, -1169, -895, -1443, -1443, -1443, -1137, -153, -1186, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -1443, -1443, 114, -473, - -1443, -1443, -1443, 609, -1443, -1443, -1443, -1443, -1443, -1443, - -1443, -1443, -1443, -1443, -1443, -1443, -636, -1443, -1400, -697, - -1443 + -1453, -1453, -1453, -1453, -1453, -1453, 599, 1223, -1453, -1453, + -1453, 1302, -1453, -1453, -1453, 743, 1267, -1453, 1182, -1453, + -1453, 1234, -1453, -1453, -1453, -147, -1453, -1453, -1453, -143, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 1106, + -1453, -1453, -52, -28, -1453, -1453, -1453, 640, 523, -515, + -561, -785, -1453, -1453, -1453, -1405, -1453, -1453, -209, -365, + -1453, 384, -1453, -1334, -1453, -1277, -324, 473, -1453, -1453, + -1453, -1453, -426, -14, -1453, -1453, -1453, -1453, -1453, -132, + -131, -130, -1453, -129, -1453, -1453, -1453, 1336, -1453, 373, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -438, -102, 720, -38, -1453, -885, -436, + -1453, -514, -1453, -1453, -364, 554, -1453, -1453, -1453, -1452, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 736, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -141, -60, -146, + -59, 80, -1453, -1453, -1453, -1453, -1453, 925, -1453, -574, + -1453, -1453, -578, -1453, -1453, -621, -142, -569, -1322, -1453, + -353, -1453, -1453, 1303, -1453, -1453, -1453, 794, 889, 210, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -586, -208, -1453, 938, -1453, -1453, -1453, -1453, -1453, -1453, + -399, -1453, -1453, -384, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -186, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, 941, -678, -217, + -815, -677, -1453, -1453, -1116, -893, -1453, -1453, -1453, -1153, + -94, -1164, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, + -1453, 174, -474, -1453, -1453, -1453, 667, -1453, -1453, -1453, + -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, -1453, 867, + -1453, -1416, -705, -1453 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 16, 143, 52, 17, 164, 170, 698, 505, - 149, 506, 99, 19, 20, 45, 46, 47, 88, 21, - 39, 40, 507, 508, 1210, 1211, 509, 1361, 1456, 510, - 511, 956, 512, 627, 513, 514, 515, 516, 1141, 171, + 0, 1, 16, 143, 52, 17, 164, 170, 701, 506, + 149, 507, 99, 19, 20, 45, 46, 47, 88, 21, + 39, 40, 508, 509, 1217, 1218, 510, 1369, 1465, 511, + 512, 960, 513, 630, 514, 515, 516, 517, 1148, 171, 172, 35, 36, 37, 220, 66, 67, 68, 69, 22, - 285, 374, 210, 23, 111, 211, 112, 156, 676, 981, - 518, 375, 519, 824, 1523, 1088, 567, 935, 1446, 937, - 1447, 521, 522, 523, 629, 850, 1410, 524, 525, 526, - 527, 528, 529, 530, 531, 426, 532, 728, 1219, 965, - 533, 534, 888, 1423, 889, 1424, 891, 1425, 535, 855, - 1416, 536, 710, 1469, 537, 1225, 1226, 968, 678, 538, - 785, 957, 539, 643, 982, 541, 542, 543, 954, 544, - 1205, 1527, 1206, 1585, 545, 1055, 1392, 546, 711, 1375, - 1596, 1377, 1597, 1476, 1632, 548, 370, 1398, 1483, 1259, - 1261, 1064, 561, 794, 1552, 1600, 371, 372, 611, 819, - 419, 616, 821, 420, 1165, 621, 575, 390, 307, 308, - 217, 301, 78, 121, 25, 161, 376, 89, 90, 174, - 91, 26, 49, 115, 158, 27, 288, 558, 559, 1060, - 379, 215, 216, 76, 118, 381, 28, 159, 299, 622, - 549, 297, 353, 354, 811, 418, 355, 583, 1272, 804, - 416, 356, 576, 1265, 823, 581, 1270, 577, 1266, 578, - 1267, 580, 1269, 584, 1273, 585, 1400, 586, 1275, 587, - 1401, 588, 1277, 589, 1402, 590, 1280, 591, 1282, 612, - 29, 95, 177, 359, 613, 30, 96, 178, 360, 617, - 31, 94, 176, 358, 608, 550, 1602, 1571, 962, 921, - 1603, 1604, 922, 934, 1187, 1181, 1176, 1344, 1107, 551, - 846, 1407, 847, 1408, 900, 1429, 897, 1427, 923, 700, - 552, 898, 1428, 924, 553, 1113, 1493, 1114, 1494, 1115, - 1495, 859, 1420, 895, 1426, 694, 701, 554, 1574, 943, - 555 + 285, 375, 210, 23, 111, 211, 112, 156, 679, 986, + 519, 376, 520, 827, 1532, 886, 1093, 568, 939, 1455, + 941, 1456, 522, 523, 524, 632, 853, 1419, 525, 526, + 527, 528, 529, 530, 531, 532, 427, 533, 731, 1229, + 970, 534, 535, 892, 1432, 893, 1433, 895, 1434, 536, + 858, 1425, 537, 713, 1478, 538, 1235, 1236, 973, 681, + 539, 788, 961, 540, 646, 987, 542, 543, 544, 958, + 545, 1212, 1536, 1213, 1593, 546, 1060, 1401, 547, 714, + 1384, 1604, 1386, 1605, 1485, 1642, 549, 371, 1407, 1492, + 1269, 1271, 1069, 562, 797, 1561, 1608, 372, 373, 613, + 822, 420, 618, 824, 421, 1172, 624, 576, 391, 308, + 309, 217, 301, 78, 121, 25, 161, 377, 89, 90, + 174, 91, 26, 49, 115, 158, 27, 288, 559, 560, + 1065, 380, 215, 216, 76, 118, 382, 28, 159, 299, + 625, 550, 297, 354, 355, 814, 419, 356, 584, 1282, + 1294, 807, 417, 357, 577, 1275, 826, 582, 1280, 578, + 1276, 579, 1277, 581, 1279, 585, 1283, 586, 1409, 587, + 1285, 588, 1410, 589, 1287, 590, 1411, 591, 1289, 592, + 1291, 615, 29, 95, 177, 360, 616, 30, 96, 178, + 361, 620, 31, 94, 176, 359, 609, 551, 1610, 1579, + 967, 925, 1611, 1612, 1613, 926, 938, 1194, 1188, 1183, + 1352, 1113, 552, 849, 1416, 850, 1417, 904, 1438, 901, + 1436, 927, 703, 553, 902, 1437, 928, 554, 1119, 1502, + 1120, 1503, 1121, 1504, 862, 1429, 899, 1435, 697, 887, + 555, 1582, 947, 556 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1716,1776 +1722,1799 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 60, 70, 287, 799, 845, 571, 920, 540, 920, 693, - 642, 883, 357, 948, 517, 949, 679, 680, 719, 221, - 927, 813, 641, 815, 820, 817, 1172, 818, 729, 1079, - 352, 1081, 1184, 1083, 605, 1334, 562, 1154, 1106, 961, - 130, 849, 913, 595, 635, -120, 671, 2, 84, 70, - 70, 70, 793, 3, 1102, 1486, 913, 53, 122, 123, - 151, 1161, 1464, 54, 755, 756, 32, 33, 58, 712, - 752, 1396, 840, 755, 756, 597, 4, 50, 5, 730, - 6, 38, 517, 85, 406, 1584, 7, 1182, 61, 424, - 70, 70, 70, 70, 1188, 59, 8, 688, 690, 1195, - 1221, 912, 9, 925, 1199, 929, 517, 1353, 218, 572, - 1222, 407, 408, 941, 104, 105, 106, 62, 1578, 573, - 1579, 48, 945, 51, 1581, 1582, 10, 107, 840, 731, - 286, 1397, 425, 840, 842, 165, 166, 417, 1164, 632, - 98, 636, 637, 1626, 98, 1599, 783, 784, 11, 12, - 1178, 427, 108, 1179, 800, 783, 784, 1541, 429, 382, - 914, 825, 1223, 1117, 661, 219, 79, 1224, 905, 961, - 1171, 574, 1292, 1580, 409, 302, 352, 572, 410, 303, - 138, 1180, 720, 1625, 428, 150, 1139, 573, 831, 63, - 842, 352, 1438, 1634, 841, 842, 58, 843, 1463, 1148, - 844, 389, 1151, 596, 80, 124, 860, 862, 732, 733, - 125, 58, 126, 351, 517, 127, 34, 791, 92, 861, - 352, 841, 352, 59, 53, 86, 721, 13, 841, 383, - 54, 896, 798, 638, 899, 598, 87, 645, 59, 574, - 411, 1504, 732, 733, 412, 840, 14, 413, 792, 902, - 406, 662, 639, 599, 841, 1164, 128, 15, 64, 600, - 139, 841, 414, 882, 384, 1467, 841, 65, 415, 914, - 80, 841, 305, 1329, 841, 969, 1214, 407, 408, 517, - 963, 1292, 167, 352, 352, 1321, 901, 168, 960, 169, - 306, 1293, 127, 286, 225, 417, 840, 180, 71, 1070, - 1514, 1556, 1557, 286, 744, 745, 1440, 842, 368, 517, - 840, 1394, 752, 218, 754, 755, 756, 757, 107, 1569, - 1512, 226, 758, 368, 80, 1601, 1049, 1050, 218, 503, - 675, 1260, 840, 1076, 964, 593, 405, 417, 744, 745, - 409, 1071, 1618, 1256, 410, 1362, 752, 1077, 754, 755, - 756, 757, -731, 1058, 594, 1051, 758, -731, 842, 351, - 1200, 802, 803, 805, 560, 807, 808, 1052, 369, 812, - 219, 814, 842, 816, 351, -731, 1608, 1609, 1067, 352, - 352, 352, 966, 352, 352, 219, 1073, 352, 1605, 352, - 1170, 352, 77, 352, 842, 1399, 417, 783, 784, 286, - 1614, 81, 58, 351, 1227, 351, 411, 863, 1053, 1054, - 412, 950, 1065, 413, 58, 1363, 951, 848, 1105, 780, - 781, 782, 961, 950, 1098, 351, 633, 82, 414, 59, - 1215, 783, 784, 1437, 415, 732, 733, 1365, 517, 1642, - 1643, 59, 886, 1374, 863, 1443, 1173, 1174, 1213, 352, - 41, 42, 43, 863, 952, 1365, 863, 1216, 1162, 1191, - 98, 863, 1366, 1100, 1101, 1372, 351, 351, 97, 1196, - 863, 1253, 352, 1170, 1175, 1170, 1116, 305, 1170, 1287, - 1294, 44, 1367, 1474, 517, 712, 920, 936, 1480, 1333, - 1373, 72, 73, 712, 74, 306, 131, 1510, 1328, 646, - 1660, 920, 1666, 1539, -738, 1142, 1143, 955, 1145, -738, - 619, -745, 1147, 1340, 1149, 1150, -745, 1152, 647, 1281, - 103, 1279, 75, 1232, 1233, 1234, 787, -738, 620, 742, - 743, 744, 745, 788, -745, 973, 977, 663, 1432, 752, - 666, 754, 755, 756, 757, 100, 101, 102, -406, 758, - 853, 760, 761, -406, 1084, 133, 664, 1185, 1178, 667, - 1186, 1017, 351, 351, 351, 1086, 351, 351, 1085, 854, - 351, -406, 351, 1454, 351, 87, 351, 1283, 1299, 1087, - 1283, 732, 733, 1283, 1207, 1412, 152, 153, 154, 155, - 1322, 1284, 1300, 556, 1347, 1208, 1209, 1348, 352, 1413, - 387, 1341, 136, 388, 1342, 557, 389, 1343, 1089, 606, - 778, 779, 780, 781, 782, 614, 1092, 1012, 852, 1093, - 1540, 607, 212, 389, 783, 784, 352, 615, 1097, 1013, - 137, 1243, 351, 213, 352, 1103, 1248, 352, 732, 733, - 1112, 289, 1357, 1244, 914, 290, 352, 144, 1249, 352, - 352, 1331, 1063, 352, 140, 351, 1292, 417, 352, 291, - 292, 1074, 352, 1332, 293, 294, 295, 296, 145, 1290, - 109, 148, 1136, 1422, 1538, 113, 110, 744, 745, 406, - 116, 114, 1460, 162, 163, 752, 117, 754, 755, 756, - 757, 352, 352, 417, 352, 758, 119, 1075, 352, 953, - 352, 352, 120, 352, 141, 1257, 407, 408, 146, 1435, - 142, 1258, 1442, 1445, 1441, 863, 147, 1448, 863, 863, - 1089, 1449, 1089, 863, 104, 1498, 106, 863, 1324, 160, - 1303, 1304, 1305, 1526, 744, 745, 157, 417, 352, 863, - 352, 1078, 752, 85, 417, 755, 756, 757, 1080, 1339, - 175, 1192, 758, 1193, 1308, 1346, 778, 779, 780, 781, - 782, 417, 1350, 179, 417, 1082, 1352, 104, 1291, 409, - 783, 784, 572, 410, 214, 417, 406, 228, 70, 1302, - 417, 351, 573, 417, 1547, 222, 223, 1598, 677, 677, - 677, 227, 162, 163, 938, 939, 134, 135, 1458, 104, - 105, 106, 1380, 407, 408, 41, 42, 43, 229, 351, - 520, 503, 675, 1430, 1389, 503, 675, 351, 1513, 1431, - 351, 230, 1356, 282, 1570, 283, 298, 783, 784, 351, - 540, 286, 351, 351, 574, 411, 351, 517, 718, 412, - 1241, 351, 413, 284, 300, 351, 361, 431, 432, 222, - 223, 224, 931, 932, 933, 364, 304, 414, 1268, 362, - 363, 1566, 365, 415, 366, 718, 409, 442, 1611, 1612, - 410, 1613, 367, 447, 351, 351, 352, 351, 520, 373, - 377, 351, 1570, 351, 351, 380, 351, 352, 378, 386, - 1434, 55, 56, 57, 385, 394, 1543, 391, 392, 393, - 397, 395, 520, 417, 396, 398, 1637, 399, 400, 401, - 461, 462, 402, 403, 421, 404, 352, 352, 352, 1635, - 1450, 351, 422, 351, 1137, 569, 570, 582, 624, 423, - 625, 603, 411, 563, 634, 650, 412, 652, 1138, 413, - 352, 653, 654, 655, 464, 465, 656, 657, 665, 658, - 681, 682, 683, 406, 414, 668, 669, 684, 697, 1619, - 415, 702, 718, 685, 686, 713, 714, 717, 727, 797, - 715, 825, 1520, 1592, 1593, 1524, 722, 723, 724, 1665, - 407, 408, 725, 726, 58, 15, 786, 789, 661, 810, - 718, 809, 1470, 795, 695, 614, 826, 829, 1358, 830, - 834, 480, 481, 482, 832, 833, 838, 836, 352, 835, - 520, 59, 839, 730, 881, 856, 851, 887, 857, 863, - 893, 493, 904, 1628, 858, 892, 942, 944, 984, 986, - 988, 990, 992, 994, 996, 946, 628, 947, 967, 1008, - 1001, 1003, 1062, 409, 1066, 1090, 1009, 410, 677, 1072, - 1095, 1163, 1096, 501, 1110, 1021, 1023, 1190, 1170, 351, - 1028, 1030, 1032, 1565, 1035, 1177, 1197, 1201, 1403, 1568, - 351, 1202, 1203, 1204, 1218, 520, 1217, 1229, 1228, 1231, - 1542, 1409, 1230, 1251, 1255, 1235, 352, 1236, 1260, 825, - 1262, 1271, 1274, 547, 1276, 1278, 1286, 642, 1297, 351, - 351, 351, 1246, 568, 1247, 520, 1295, 1296, 1307, 411, - 1310, 406, 579, 412, 1309, 1153, 413, 1316, 1368, 718, - 1319, 1323, 592, 351, 1335, 1338, 1345, 1369, 1370, 1371, - 1382, 414, 602, 1393, 1383, 1405, 1385, 415, 407, 408, - 1390, 618, 1411, 1404, 1414, 1415, 1439, 1444, 1457, 1461, - 1455, 626, 1459, 862, 1462, 1466, 1482, 1591, 1430, 1487, - 1488, 644, 1472, 1489, 1496, 1468, 649, 1491, 651, 520, - 520, 520, 520, 520, 520, 520, 520, 660, 352, 1503, - 352, 1497, 520, 520, 1502, 672, 673, 674, 520, 1505, - 1506, 351, 1522, 1528, 1558, 1555, 1560, 520, 520, 1562, - 692, 409, 520, 520, 520, 410, 520, 1567, 696, 1563, - 1564, 692, 1573, 1616, 703, 704, 705, 706, 707, 1590, - 1615, 718, 1617, 1468, 1620, 1621, 1622, 716, 1623, 406, - 1624, 677, 1633, 1636, 520, 1654, 940, 1638, 1639, 1644, - 1645, 1646, 1647, 1648, 1650, 1653, 129, 1655, 18, 1661, - 83, 1662, 1663, 173, 132, 1529, 407, 408, 1532, 24, - 1061, 1548, 1533, 1534, 1198, 309, 352, 411, 1535, 351, - 1536, 412, 1509, 1263, 413, 1220, 1465, 1484, 1553, 352, - 520, 1485, 1395, 1554, 623, 93, 790, 630, 1610, 414, - 1519, 631, 1337, 801, 0, 415, 677, 677, 677, 928, - 0, 718, 0, 718, 0, 718, 0, 718, 0, 718, - 0, 718, 0, 718, 0, 718, 0, 0, 0, 409, - 718, 828, 718, 410, 0, 0, 0, 0, 718, 1589, + 60, 70, 287, 802, 848, 572, 645, 722, 952, 696, + 953, 518, 541, 924, 823, 924, 931, 821, 644, 353, + 221, 614, 619, 732, 1161, 816, 1342, 818, 130, 820, + 563, 1084, 1179, 1086, 606, 1088, 682, 683, 1191, 1112, + 1430, 358, 674, -121, 852, 84, 966, 796, 638, 70, + 70, 70, 32, 33, 1473, 735, 736, 1108, 598, 917, + 1168, 1189, 58, 218, 1195, 715, 304, 1202, 1206, 122, + 123, 53, 1361, 917, 918, 151, 733, 54, 1495, 518, + 85, 50, 369, 596, 1592, 61, 1221, 218, 594, 59, + 70, 70, 70, 70, 107, 1405, 723, 691, 693, 2, + 104, 305, 106, 518, 916, 3, 929, 595, 933, 758, + 759, 1586, 1231, 1587, 62, 1476, 945, 1589, 1590, 108, + 219, 306, 1232, 1096, 98, 949, 734, 51, 4, 968, + 5, 1222, 6, 635, 843, 104, 105, 106, 7, 307, + 724, 1636, 165, 166, 219, 639, 640, 1223, 8, 1550, + 803, 747, 748, 286, 9, 1406, 1607, 828, 1123, 755, + 383, 757, 758, 759, 760, 909, 353, 303, 557, 761, + 48, 1574, 834, 286, 1233, 1635, 966, 918, 10, 1234, + 558, 353, 1146, 969, 1447, 71, 63, 1178, 430, 1221, + 302, 786, 787, 58, 138, 1155, 845, 1588, 1158, 418, + 11, 12, 34, 1644, 863, 865, 150, 664, 735, 736, + 353, 518, 353, 352, 835, 794, 124, 864, 599, 838, + 59, 125, 86, 126, 844, 425, 127, 844, 844, 900, + 1575, 844, 903, 87, 844, 844, 600, 641, 648, 844, + 286, 573, 601, 597, 786, 787, 795, 906, 428, 735, + 736, 574, 665, 385, 755, 64, 642, 758, 759, 92, + 58, 1054, 1055, 843, 65, 885, 369, 128, 426, 954, + 38, 218, 1513, 353, 353, 1329, 504, 678, 518, 13, + 918, 429, 1337, 79, 966, 1224, 965, 59, 905, 167, + 1056, 58, 1221, 1523, 168, 1302, 169, 974, 14, 127, + 843, 139, 1057, 575, 747, 748, 1180, 1181, 518, 15, + 1171, 1403, 755, 611, 757, 758, 759, 760, 59, 612, + 162, 163, 761, 418, 844, 845, 370, 846, 219, 306, + 847, 1270, 1565, 1566, 1182, 1370, 1609, 406, 843, 786, + 787, 80, 77, 1058, 1059, 747, 748, 307, 1171, 843, + 1577, 1063, 1472, 755, 98, 390, 758, 759, 760, 1449, + 352, -738, 845, 761, 1207, 561, -738, 225, 180, 353, + 353, 353, 843, 353, 353, 352, 1072, 353, 971, 353, + 843, 353, 1521, 353, -738, 783, 784, 785, 1408, 80, + 1627, 805, 806, 808, 226, 810, 811, 786, 787, 815, + 845, 817, 1185, 819, 352, 1186, 352, 1617, 1618, 1078, + 622, 845, 1237, 1225, 1070, 1549, 1111, 866, 390, 607, + 851, 58, 1104, 1090, 866, 1092, 352, 636, 623, 407, + 954, 608, 966, 1187, 845, 955, 1374, 518, 786, 787, + 1226, 353, 845, 1446, 1263, 890, 1220, 866, 59, 407, + 1614, 1303, 1383, 866, 82, 1452, 408, 409, 41, 42, + 43, 1623, 1198, 1376, 353, 1106, 1107, 352, 352, 53, + 98, 1081, 1203, 956, 1483, 54, 408, 409, 1122, 866, + 1489, 1169, 1297, 518, 715, 1082, 1144, 735, 736, 44, + 940, 81, 715, 72, 73, 1177, 74, 924, 1336, 1177, + 1341, 1652, 1653, 131, 80, 107, 1519, 97, 1149, 1150, + 959, 1152, 924, 1348, 1292, 1154, 1290, 1156, 1157, 410, + 1159, 1177, 1669, 411, 75, 109, 1675, 978, 982, 384, + 1266, 110, 289, 649, 432, 433, 290, 1374, 103, 410, + 666, 1381, 669, 411, 1177, 1441, 1372, 1242, 1243, 1244, + 291, 292, 650, 1022, 443, 293, 294, 295, 296, 667, + 448, 670, 1375, 352, 352, 352, 1382, 352, 352, 1548, + 418, 352, 611, 352, 1075, 352, 1017, 352, 612, 87, + 1463, 745, 746, 747, 748, 412, 1089, 856, 1018, 413, + 353, 755, 414, 757, 758, 759, 760, 462, 463, 137, + 1330, 761, 611, 763, 764, 412, 857, 415, 612, 413, + 1308, 1160, 414, 416, -745, 1199, 1091, 1200, 353, -745, + -752, 855, 1253, -409, 1309, -752, 353, 415, -409, 353, + 611, 465, 466, 416, 1254, 352, 612, -745, 353, 133, + 1094, 353, 353, -752, 1293, 353, -409, 1258, 1098, 418, + 353, 1099, 1365, 1076, 353, 611, 1068, 212, 352, 1259, + 1103, 612, 781, 782, 783, 784, 785, 1109, 213, 1355, + 1300, 58, 1118, 286, 617, 1142, 786, 787, 136, 735, + 736, 866, 1547, 140, 353, 353, 611, 353, 481, 482, + 483, 353, 612, 353, 353, 1469, 353, 918, 59, 1214, + 611, 611, 957, 100, 101, 102, 612, 612, 494, 1221, + 1215, 1216, 1339, 790, 1356, 1421, 104, 105, 106, 1450, + 791, 113, 388, 631, 1340, 389, 1349, 114, 390, 1350, + 1332, 353, 1351, 353, 418, 1312, 1313, 1314, 1079, 144, + 502, 145, 116, 119, 152, 153, 154, 155, 117, 120, + 141, 1347, 611, 1094, 148, 1094, 142, 1354, 612, 1267, + 1318, 1444, 146, 1451, 1358, 1268, 1454, 866, 1360, 866, + 222, 223, 866, 745, 746, 747, 748, 749, 418, 160, + 752, 70, 1080, 755, 352, 757, 758, 759, 760, 504, + 678, 1457, 1458, 761, 1535, 763, 764, 866, 866, 418, + 866, 1192, 1185, 1083, 1193, 85, 418, 1389, 175, 1467, + 1085, 147, 352, 418, 418, 1440, 157, 1087, 1301, 1398, + 352, 418, 418, 352, 1522, 1311, 1556, 418, 1364, 134, + 135, 1606, 352, 179, 1251, 352, 352, 1578, 104, 352, + 518, 541, 735, 736, 352, 41, 42, 43, 352, 521, + 214, 227, 779, 780, 781, 782, 783, 784, 785, 228, + 229, 162, 163, 942, 943, 222, 223, 224, 786, 787, + 353, 1622, 1439, 230, 504, 678, 282, 283, 352, 352, + 284, 352, 353, 1632, 286, 352, 298, 352, 352, 300, + 352, 362, 1278, 1443, 407, 1578, 935, 936, 937, 55, + 56, 57, 363, 364, 1552, 407, 1647, 1422, 365, 366, + 367, 353, 353, 353, 374, 368, 378, 521, 379, 381, + 386, 408, 409, 1459, 387, 352, 392, 352, 395, 418, + 393, 1645, 408, 409, 398, 422, 353, 394, 747, 748, + 396, 521, 405, 397, 399, 400, 755, 401, 757, 758, + 759, 760, 402, 403, 404, 423, 761, 570, 424, 564, + 571, 583, 627, 604, 1628, 628, 637, 653, 655, 656, + 657, 659, 660, 661, 828, 658, 668, 671, 672, 700, + 1529, 1600, 1601, 1533, 410, 705, 684, 685, 411, 717, + 686, 718, 1674, 687, 688, 410, 720, 725, 573, 411, + 1479, 726, 689, 716, 353, 1366, 407, 727, 574, 728, + 729, 730, 15, 789, 792, 664, 798, 781, 782, 783, + 784, 785, 800, 812, 698, 813, 617, 829, 832, 833, + 1638, 786, 787, 408, 409, 836, 837, 841, 839, 842, + 854, 866, 611, 733, 859, 860, 861, 884, 612, 521, + 412, 891, 896, 801, 413, 897, 1143, 414, 946, 908, + 575, 412, 948, 950, 352, 413, 951, 828, 414, 972, + 1013, 1067, 415, 1576, 1071, 1077, 352, 1101, 416, 1095, + 1102, 1145, 1116, 415, 1177, 1184, 353, 1170, 1551, 416, + 1208, 1418, 407, 828, 1197, 1204, 410, 1228, 1209, 573, + 411, 645, 1210, 1211, 1239, 352, 352, 352, 1413, 574, + 1227, 1238, 548, 1240, 1261, 1241, 521, 1245, 1265, 408, + 409, 1270, 569, 1272, 1281, 1284, 1286, 1288, 1296, 1246, + 352, 580, 1304, 1256, 1257, 1306, 1305, 1316, 1317, 1343, + 1324, 593, 1402, 1327, 1377, 1346, 521, 1331, 1353, 1371, + 1378, 603, 1379, 1380, 1391, 1420, 865, 1392, 1464, 1394, + 621, 575, 412, 1399, 1412, 1599, 413, 407, 1414, 414, + 629, 1423, 1424, 1466, 1477, 1448, 353, 1453, 353, 1470, + 647, 1468, 410, 1471, 415, 652, 411, 654, 1475, 1491, + 416, 680, 680, 680, 408, 409, 663, 1499, 352, 1500, + 1481, 1439, 1496, 1497, 675, 676, 677, 1505, 1512, 1506, + 521, 521, 521, 521, 521, 521, 521, 521, 1507, 695, + 1511, 1514, 1515, 521, 521, 1531, 1537, 699, 1564, 521, + 695, 1568, 1477, 706, 707, 708, 709, 710, 521, 521, + 1569, 721, 1571, 521, 521, 521, 719, 521, 412, 1581, + 1572, 1573, 413, 1598, 1273, 414, 407, 410, 1620, 1621, + 1624, 411, 1625, 1626, 353, 1631, 1629, 1630, 721, 1633, + 415, 1643, 1634, 1658, 1661, 521, 416, 353, 1646, 1648, + 352, 407, 1662, 408, 409, 1649, 407, 1654, 1655, 1656, + 1663, 1664, 989, 991, 993, 995, 997, 999, 1001, 1557, + 944, 1670, 129, 18, 1006, 1008, 1671, 1672, 408, 409, + 1014, 83, 804, 408, 409, 173, 132, 1538, 1066, 1026, + 1028, 521, 1541, 412, 1033, 1035, 1037, 413, 1040, 1298, + 414, 310, 1205, 1542, 1543, 1544, 1545, 24, 1597, 1518, + 831, 353, 1230, 1474, 1493, 415, 410, 1562, 1494, 1404, + 411, 416, 1563, 626, 793, 93, 1619, 0, 1528, 1345, + 932, 704, 0, 0, 0, 0, 0, 721, 0, 0, + 352, 410, 352, 0, 0, 411, 410, 0, 633, 647, + 411, 634, 0, 0, 0, 0, 695, 888, 0, 889, + 0, 0, 0, 0, 894, 721, 0, 0, 0, 0, + 898, 0, 0, 0, 0, 0, 0, 0, 0, 907, + 0, 0, 412, 0, 0, 0, 413, 0, 1299, 414, + 910, 911, 912, 913, 914, 915, 0, 923, 0, 923, + 0, 0, 0, 0, 415, 1668, 0, 412, 0, 0, + 416, 413, 412, 1315, 414, 0, 413, 0, 1320, 414, + 0, 0, 0, 680, 0, 0, 735, 736, 352, 415, + 0, 0, 0, 0, 415, 416, 0, 0, 0, 0, + 416, 352, 0, 988, 990, 992, 994, 996, 998, 1000, + 1002, 1003, 1004, 0, 0, 1005, 1007, 1009, 1010, 1011, + 1012, 0, 1015, 1016, 0, 1019, 1020, 1021, 1023, 1024, + 1025, 1027, 1029, 1030, 1031, 1032, 1034, 1036, 1038, 1039, + 1041, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 957, 1061, 721, 0, 0, 1064, 0, 0, + 0, 0, 0, 0, 0, 352, 0, 0, 1073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 718, 0, 718, 352, 0, 0, 0, 718, 0, 718, - 0, 718, 0, 0, 718, 0, 0, 0, 644, 0, - 0, 351, 0, 351, 0, 692, 884, 0, 885, 0, - 0, 0, 0, 890, 0, 0, 0, 0, 0, 894, - 0, 0, 0, 0, 0, 411, 718, 0, 903, 412, - 0, 1288, 413, 0, 0, 0, 0, 0, 0, 906, - 907, 908, 909, 910, 911, 0, 919, 414, 919, 0, - 0, 0, 0, 415, 0, 0, 0, 718, 0, 0, - 0, 0, 0, 0, 0, 1659, 0, 1360, 0, 0, - 0, 0, 0, 0, 0, 0, 732, 733, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, - 0, 0, 983, 985, 987, 989, 991, 993, 995, 997, - 998, 999, 351, 0, 1000, 1002, 1004, 1005, 1006, 1007, - 0, 1010, 1011, 0, 1014, 1015, 1016, 1018, 1019, 1020, - 1022, 1024, 1025, 1026, 1027, 1029, 1031, 1033, 1034, 1036, - 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 0, 1056, 0, 0, 0, 1059, 0, 0, 0, - 0, 0, 0, 953, 0, 0, 0, 1068, 0, 0, - 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, - 742, 743, 744, 745, 746, 0, 0, 749, 750, 751, - 752, 0, 754, 755, 756, 757, 0, 0, 0, 0, - 758, 0, 760, 761, 0, 0, 1094, 0, 764, 765, - 766, 0, 0, 1099, 770, 0, 0, 0, 0, 0, - 1109, 953, 1111, 0, 0, 0, 0, 0, 0, 0, - 0, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 0, - 0, 0, 0, 0, 772, 0, 773, 774, 775, 776, - 777, 778, 779, 780, 781, 782, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 783, 784, 0, 0, 0, - 0, 0, 0, 520, 703, 1167, 0, 0, 0, 718, - 0, 431, 432, 0, 0, 0, 0, 0, 1189, 0, - 692, 437, 438, 439, 440, 441, 0, 1194, 0, 0, - 692, 442, 0, 444, 0, 1118, 0, 447, 0, 406, - 0, 0, 0, 0, 1212, 449, 0, 0, 0, 0, - 0, 452, 0, 0, 453, 0, 0, 454, 0, 913, - 0, 457, 0, 0, 0, 0, 407, 408, 0, 0, - 0, 564, 0, 0, 461, 462, 0, 316, 317, 318, - 0, 320, 321, 322, 323, 324, 463, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 0, 338, - 339, 340, 0, 0, 343, 344, 345, 346, 464, 465, - 565, 0, 0, 0, 0, 0, 0, 406, 0, 0, - 0, 0, 406, 468, 469, 0, 0, 0, 0, 409, - 0, 0, 0, 410, 0, 0, 0, 0, 1245, 0, - 0, 0, 1250, 0, 407, 408, 0, 0, 58, 407, - 408, 0, 0, 0, 0, 0, 473, 474, 475, 476, - 477, 0, 478, 914, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 915, 566, 491, 492, 0, - 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 412, - 0, 0, 916, 497, 498, 0, 14, 409, 0, 499, - 500, 410, 409, 0, 0, 0, 410, 917, 0, 918, - 0, 503, 504, 415, 0, 0, 0, 0, 0, 1311, - 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, - 0, 1325, 1326, 1327, 732, 733, 0, 1330, 407, 408, - 0, 0, 0, 0, 0, 1336, 919, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 412, 411, 1289, - 413, 0, 412, 0, 1306, 413, 547, 0, 0, 0, - 0, 1354, 1355, 0, 0, 414, 0, 0, 1359, 0, - 414, 415, 0, 1118, 0, 0, 415, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1376, 0, 1378, - 0, 409, 0, 0, 1381, 410, 0, 0, 0, 0, - 1384, 0, 0, 0, 1387, 0, 0, 0, 0, 0, - 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, - 754, 755, 756, 757, 0, 0, 0, 0, 758, 759, - 760, 761, 762, 763, 0, 1406, 764, 765, 766, 767, - 768, 769, 770, 0, 0, 0, 406, 411, 0, 0, - 0, 412, 0, 1312, 413, 0, 0, 692, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, - 0, 0, 0, 407, 408, 415, 0, 0, 0, 0, - 0, 771, 772, 0, 773, 774, 775, 776, 777, 778, - 779, 780, 781, 782, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 783, 784, 0, 0, 0, 503, 675, + 745, 746, 747, 748, 749, 0, 0, 752, 753, 754, + 755, 407, 757, 758, 759, 760, 0, 0, 0, 0, + 761, 0, 763, 764, 0, 0, 0, 1100, 0, 957, + 0, 0, 0, 0, 1105, 0, 0, 0, 408, 409, + 0, 1115, 0, 1117, 0, 0, 0, 0, 0, 0, + 0, 0, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, + 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 0, 0, 0, 0, 0, 0, 0, 721, 778, 779, + 780, 781, 782, 783, 784, 785, 0, 680, 407, 0, + 0, 0, 0, 0, 0, 786, 787, 0, 0, 0, + 0, 410, 0, 0, 0, 411, 706, 1174, 0, 0, + 0, 0, 0, 0, 0, 408, 409, 0, 0, 0, + 1196, 0, 695, 0, 0, 0, 0, 0, 521, 1201, + 0, 0, 695, 0, 0, 0, 0, 1124, 0, 0, + 0, 0, 0, 0, 0, 0, 1219, 0, 0, 0, + 0, 0, 0, 680, 680, 680, 0, 0, 721, 407, + 721, 0, 721, 0, 721, 0, 721, 412, 721, 0, + 721, 413, 721, 1321, 414, 0, 0, 721, 410, 721, + 0, 0, 411, 0, 0, 721, 408, 409, 0, 415, + 0, 0, 0, 0, 0, 416, 0, 721, 0, 721, + 0, 0, 0, 0, 721, 0, 721, 0, 721, 0, + 0, 721, 0, 0, 0, 0, 0, 0, 0, 690, + 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, + 0, 312, 0, 0, 0, 0, 0, 313, 0, 0, + 0, 1255, 0, 721, 412, 1260, 407, 314, 413, 410, + 1322, 414, 0, 411, 0, 315, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, + 316, 0, 416, 408, 409, 721, 0, 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, + 0, 0, 0, 0, 0, 412, 0, 0, 0, 413, + 0, 1323, 414, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1319, 0, 410, 415, 0, 0, + 411, 0, 0, 416, 0, 0, 0, 0, 58, 0, + 0, 0, 0, 0, 0, 0, 1333, 1334, 1335, 0, + 0, 350, 1338, 0, 0, 0, 0, 0, 0, 0, + 1344, 923, 0, 432, 433, 59, 0, 0, 0, 0, + 0, 0, 0, 438, 439, 440, 441, 442, 0, 0, + 0, 548, 0, 443, 0, 445, 1362, 1363, 0, 448, + 0, 0, 412, 1367, 0, 0, 413, 450, 1325, 414, + 0, 1124, 0, 453, 0, 0, 454, 0, 0, 455, + 0, 351, 0, 458, 415, 1385, 0, 1387, 0, 0, + 416, 0, 1390, 565, 0, 0, 462, 463, 1393, 317, + 318, 319, 1396, 321, 322, 323, 324, 325, 464, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 0, 339, 340, 341, 0, 0, 344, 345, 346, 347, + 465, 466, 467, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1415, 0, 469, 470, 0, 0, 0, + 0, 0, 0, 0, 643, 0, 0, 0, 0, 721, + 471, 472, 473, 695, 0, 0, 0, 0, 0, 0, + 58, 0, 0, 0, 0, 0, 0, 0, 474, 475, + 476, 477, 478, 0, 479, 0, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 59, 567, 492, + 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 732, 733, 0, 0, 0, - 0, 1477, 0, 1478, 0, 0, 409, 0, 1481, 0, - 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 14, 0, + 0, 500, 501, 735, 736, 0, 0, 0, 1486, 502, + 1487, 503, 0, 504, 505, 1490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1490, 0, 1492, 0, 0, 0, 0, 0, 0, - 0, 1499, 1500, 1501, 0, 0, 0, 0, 1508, 0, - 0, 0, 0, 1511, 0, 0, 0, 1515, 1516, 1517, - 1518, 0, 0, 692, 1521, 0, 692, 1525, 0, 0, - 0, 0, 411, 0, 1537, 0, 412, 0, 1313, 413, - 0, 0, 0, 0, 0, 1545, 0, 0, 0, 742, - 743, 744, 745, 746, 414, 0, 749, 750, 751, 752, - 415, 754, 755, 756, 757, 0, 0, 0, 0, 758, - 0, 760, 761, 0, 0, 692, 0, 764, 765, 766, - 0, 0, 0, 770, 0, 0, 0, 0, 0, 0, - 1575, 1576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1583, 0, 0, 0, 0, 1588, + 0, 0, 0, 0, 0, 0, 0, 1498, 0, 0, + 1501, 0, 0, 0, 0, 0, 0, 0, 1508, 1509, + 1510, 0, 0, 0, 0, 1517, 0, 0, 0, 0, + 1520, 0, 0, 0, 1524, 1525, 1526, 1527, 0, 0, + 695, 1530, 0, 695, 1534, 0, 0, 0, 0, 0, + 0, 1546, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1554, 0, 0, 0, 0, 745, 746, 747, + 748, 749, 0, 0, 752, 753, 754, 755, 0, 757, + 758, 759, 760, 0, 0, 0, 0, 761, 0, 763, + 764, 0, 0, 695, 0, 767, 768, 769, 0, 0, + 0, 773, 0, 0, 0, 0, 0, 1583, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1594, 1595, 772, 0, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 0, 1606, 0, 1607, 0, - 0, 0, 0, 0, 783, 784, 0, 0, 0, 503, - 675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1627, 0, 0, 0, 0, - 1629, 1630, 0, 0, 0, 430, 0, 0, 431, 432, - 3, 0, 433, 434, 435, 0, 436, 0, 437, 438, - 439, 440, 441, 0, 1649, 0, 1651, 1652, 442, 443, - 444, 445, 446, 0, 447, 0, 1656, 0, 0, 0, - 0, 448, 449, 0, 0, 450, 0, 451, 452, 0, - 0, 453, 0, 8, 454, 455, 0, 456, 457, 0, - 0, 458, 459, 0, 0, 0, 0, 0, 460, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 466, 467, 0, + 0, 1591, 0, 0, 0, 0, 1596, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1602, 1603, + 0, 775, 0, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 0, 1615, 1616, 0, 0, 0, 0, + 0, 0, 786, 787, 0, 0, 0, 504, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 470, 471, 472, 0, 0, - 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 490, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 494, 495, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 0, 0, 0, 0, 501, 0, 502, 430, 503, 504, - 431, 432, 3, 0, 433, 434, 435, 0, 436, 0, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 443, 444, 445, 446, 0, 447, 0, 0, 0, - 0, 0, 0, 448, 449, 0, 0, 450, 0, 451, - 452, 0, 0, 453, 0, 8, 454, 455, 0, 456, - 457, 0, 0, 458, 459, 0, 0, 0, 0, 0, - 460, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 466, - 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 470, 471, 472, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 406, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 490, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 1351, 495, 407, 408, 0, + 0, 1637, 0, 0, 0, 0, 1639, 1640, 0, 0, + 0, 0, 431, 0, 0, 432, 433, 3, 0, 434, + 435, 436, 0, 437, 0, 438, 439, 440, 441, 442, + 0, 1657, 0, 1659, 1660, 443, 444, 445, 446, 447, + 0, 448, 0, 0, 1665, 0, 0, 0, 449, 450, + 0, 0, 451, 0, 452, 453, 0, 0, 454, 0, + 8, 455, 456, 0, 457, 458, 0, 0, 459, 460, + 0, 0, 0, 0, 0, 461, 0, 0, 462, 463, + 0, 317, 318, 319, 0, 321, 322, 323, 324, 325, + 464, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 0, 339, 340, 341, 0, 0, 344, 345, + 346, 347, 465, 466, 467, 468, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 431, 432, 0, 0, 501, 0, 502, 0, - 503, 504, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 406, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 409, 0, 452, 0, 410, 453, 0, 0, 454, 0, - 0, 0, 457, 0, 0, 0, 0, 407, 408, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 411, 0, 0, 0, - 412, 0, 1314, 413, 468, 469, 0, 0, 0, 0, - 409, 0, 0, 0, 410, 0, 0, 0, 414, 0, - 0, 0, 0, 0, 415, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 406, 478, 914, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 915, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 407, - 408, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 412, 0, 0, 916, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 0, 431, 432, 0, 917, 0, - 926, 0, 503, 504, 415, 437, 438, 439, 440, 441, - 0, 0, 0, 0, 0, 442, 0, 444, 0, 0, - 0, 447, 0, 597, 0, 0, 0, 0, 0, 449, - 0, 0, 409, 0, 0, 452, 410, 0, 453, 0, - 0, 454, 0, 0, 0, 457, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 564, 0, 0, 461, 462, - 0, 316, 317, 318, 0, 320, 321, 322, 323, 324, - 463, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 0, 338, 339, 340, 0, 0, 343, 344, - 345, 346, 464, 465, 565, 0, 0, 0, 411, 0, - 0, 0, 412, 0, 1315, 413, 0, 468, 469, 0, + 0, 0, 471, 472, 473, 0, 0, 0, 0, 0, + 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, + 474, 475, 476, 477, 478, 0, 479, 0, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 59, + 491, 492, 493, 0, 0, 0, 0, 0, 0, 494, + 495, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 14, 0, 0, 500, 501, 0, 0, 0, 0, 0, + 0, 502, 0, 503, 431, 504, 505, 432, 433, 3, + 0, 434, 435, 436, 0, 437, 0, 438, 439, 440, + 441, 442, 0, 0, 0, 0, 0, 443, 444, 445, + 446, 447, 0, 448, 0, 0, 0, 0, 0, 0, + 449, 450, 0, 0, 451, 0, 452, 453, 0, 0, + 454, 0, 8, 455, 456, 0, 457, 458, 0, 0, + 459, 460, 0, 0, 0, 0, 0, 461, 0, 0, + 462, 463, 0, 317, 318, 319, 0, 321, 322, 323, + 324, 325, 464, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 0, 339, 340, 341, 0, 0, + 344, 345, 346, 347, 465, 466, 467, 468, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, + 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 471, 472, 473, 0, 0, 0, + 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, + 0, 0, 474, 475, 476, 477, 478, 407, 479, 0, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 59, 491, 492, 493, 0, 0, 0, 0, 0, + 0, 494, 1359, 496, 408, 409, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 14, 0, 0, 500, 501, 0, 0, 432, + 433, 0, 0, 502, 0, 503, 0, 504, 505, 438, + 439, 440, 441, 442, 0, 0, 0, 0, 0, 443, + 0, 445, 0, 0, 0, 448, 0, 407, 0, 0, + 0, 0, 0, 450, 0, 0, 0, 410, 0, 453, + 0, 411, 454, 0, 0, 455, 0, 917, 0, 458, + 0, 0, 0, 0, 408, 409, 0, 0, 0, 565, + 0, 0, 462, 463, 0, 317, 318, 319, 0, 321, + 322, 323, 324, 325, 464, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 0, 339, 340, 341, + 0, 0, 344, 345, 346, 347, 465, 466, 566, 0, + 0, 0, 0, 412, 0, 0, 0, 413, 0, 1326, + 414, 469, 470, 0, 0, 0, 0, 410, 0, 0, + 0, 411, 0, 0, 0, 415, 0, 0, 0, 0, + 0, 416, 0, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 474, 475, 476, 477, 478, 407, + 479, 918, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 919, 567, 492, 493, 0, 0, 0, + 0, 0, 0, 494, 0, 0, 408, 409, 0, 0, + 0, 0, 0, 412, 0, 0, 0, 413, 0, 0, + 920, 498, 499, 0, 14, 0, 0, 500, 501, 0, + 0, 0, 432, 433, 0, 921, 0, 922, 0, 504, + 505, 416, 438, 439, 440, 441, 442, 0, 0, 0, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 407, 0, 0, 0, 0, 0, 450, 0, 0, 410, + 0, 0, 453, 411, 0, 454, 0, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 408, 409, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 566, 0, 0, 0, 412, 0, 0, 0, 413, + 0, 1328, 414, 0, 469, 470, 0, 0, 0, 0, + 410, 0, 0, 0, 411, 0, 0, 415, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 407, 479, 918, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 919, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 408, + 409, 0, 0, 0, 0, 0, 412, 0, 0, 0, + 413, 0, 0, 920, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 0, 432, 433, 0, 921, 0, + 930, 0, 504, 505, 416, 438, 439, 440, 441, 442, + 0, 0, 0, 0, 0, 443, 0, 445, 0, 0, + 0, 448, 0, 598, 0, 0, 0, 0, 0, 450, + 0, 0, 410, 0, 0, 453, 411, 0, 454, 0, + 0, 455, 0, 0, 0, 458, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 565, 0, 0, 462, 463, + 0, 317, 318, 319, 0, 321, 322, 323, 324, 325, + 464, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 0, 339, 340, 341, 0, 0, 344, 345, + 346, 347, 465, 466, 566, 0, 0, 0, 412, 0, + 0, 0, 413, 0, 1426, 414, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 414, 0, 0, 0, 0, 0, 415, 0, 0, 0, + 415, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, - 473, 474, 475, 476, 477, 406, 478, 0, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 59, - 566, 491, 492, 0, 0, 0, 0, 0, 0, 493, - 0, 0, 407, 408, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 598, 0, 0, 496, 497, 498, 0, - 14, 0, 0, 499, 500, 0, 0, 0, 431, 432, - 0, 1166, 0, 502, 0, 503, 504, 600, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 409, 0, 0, 452, 410, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 466, 0, 0, - 0, 411, 0, 0, 0, 412, 0, 1317, 413, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 640, - 0, 0, 0, 414, 0, 470, 471, 472, 0, 415, + 474, 475, 476, 477, 478, 407, 479, 0, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 59, + 567, 492, 493, 0, 0, 0, 0, 0, 0, 494, + 0, 0, 408, 409, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 599, 0, 0, 497, 498, 499, 0, + 14, 0, 0, 500, 501, 0, 0, 0, 432, 433, + 0, 1173, 0, 503, 0, 504, 505, 601, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 410, 0, 0, 453, 411, + 0, 454, 0, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 467, 0, 0, + 0, 412, 0, 0, 0, 413, 0, 1427, 414, 0, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 673, + 0, 0, 0, 415, 0, 471, 472, 473, 0, 416, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 406, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 407, 408, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 431, 432, 0, 0, 501, 0, 502, 0, 503, 504, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 409, 0, - 452, 0, 410, 453, 0, 0, 454, 0, 0, 0, - 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 466, - 0, 0, 0, 0, 411, 0, 0, 0, 412, 0, - 1318, 413, 468, 469, 0, 0, 0, 0, 0, 0, - 0, 670, 0, 0, 0, 0, 414, 470, 471, 472, - 0, 0, 415, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 406, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 0, 0, 407, 408, 0, + 0, 0, 0, 474, 475, 476, 477, 478, 407, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 408, 409, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 432, 433, 0, 0, 502, 0, 503, 0, 504, 505, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 1539, 445, 446, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 410, 0, + 453, 0, 411, 454, 0, 0, 455, 456, 0, 0, + 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, + 1540, 0, 0, 0, 412, 0, 0, 0, 413, 0, + 1428, 414, 469, 470, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 0, 58, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 407, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 408, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 431, 432, 0, 0, 501, 0, 502, 0, - 503, 504, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 1530, 444, 445, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 409, 0, 452, 0, 410, 453, 0, 0, 454, 455, - 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 1531, 0, 0, 0, 411, 0, 0, 0, - 412, 0, 1320, 413, 468, 469, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, - 0, 0, 0, 0, 415, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 406, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 407, - 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 431, 432, 0, 0, 501, 0, - 502, 0, 503, 504, 437, 438, 439, 440, 441, 0, - 0, 0, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 409, 0, 452, 0, 410, 453, 0, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 466, 0, 0, 0, 0, 411, 0, - 0, 0, 412, 0, 1417, 413, 468, 469, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 432, 433, 0, 0, 502, 0, 503, 0, + 504, 505, 438, 439, 440, 441, 442, 0, 0, 0, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, + 410, 0, 453, 0, 411, 454, 0, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 467, 0, 0, 0, 0, 412, 0, 0, 0, + 413, 0, 1431, 414, 469, 470, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 415, 471, + 472, 473, 0, 0, 416, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 407, 479, 0, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 59, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 408, + 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 432, 433, 0, 0, 502, 0, + 503, 0, 504, 505, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 410, 0, 453, 0, 411, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 962, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 412, 0, + 0, 0, 413, 0, 1462, 414, 469, 470, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 415, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 407, 479, 918, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 919, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, + 0, 408, 409, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 963, 0, 503, 964, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 410, 0, 453, 0, 411, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 467, 0, 0, 0, 0, + 412, 0, 0, 0, 413, 0, 1555, 414, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 414, 470, 471, 472, 0, 0, 415, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 406, 478, 0, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 59, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, - 0, 407, 408, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 431, 432, 0, 0, - 501, 0, 502, 0, 503, 504, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 406, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 409, 0, 452, 0, 410, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 407, 408, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 0, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 466, 0, 0, 0, 0, - 411, 0, 0, 0, 412, 0, 1418, 413, 468, 469, - 0, 409, 0, 0, 0, 410, 0, 0, 0, 0, - 0, 0, 414, 978, 979, 980, 0, 0, 415, 0, + 0, 0, 415, 983, 984, 985, 0, 0, 416, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 406, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 59, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 407, 408, 411, 0, 0, - 0, 412, 0, 1419, 413, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 0, 414, - 431, 432, 501, 0, 502, 415, 503, 504, 708, 0, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 406, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 409, 0, - 452, 0, 410, 453, 709, 0, 454, 0, 0, 0, - 457, 0, 407, 408, 0, 0, 0, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 565, - 0, 0, 0, 0, 411, 0, 0, 0, 412, 0, - 1421, 413, 468, 469, 0, 409, 0, 0, 0, 410, - 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, - 0, 0, 415, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 0, 478, 406, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 0, 0, 0, 0, 407, - 408, 411, 0, 0, 0, 412, 0, 1453, 413, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 0, 414, 431, 432, 501, 601, 502, 415, - 503, 504, 708, 0, 437, 438, 439, 440, 441, 0, - 0, 0, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 409, 0, 452, 0, 410, 453, 709, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 565, 0, 0, 0, 0, 411, 0, - 0, 0, 412, 0, 1546, 413, 468, 469, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 0, 0, + 432, 433, 502, 0, 503, 0, 504, 505, 711, 0, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 0, 445, 0, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, + 453, 0, 0, 454, 712, 0, 455, 0, 0, 0, + 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 0, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 0, 0, 432, 433, 502, 602, 503, 0, + 504, 505, 711, 0, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 712, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 0, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 414, 0, 0, 0, 0, 0, 415, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 0, 478, 914, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 915, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 0, 0, 431, 432, - 501, 0, 502, 0, 503, 504, 708, 0, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 709, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 918, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 919, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 0, 0, 432, 433, + 502, 0, 503, 0, 504, 505, 711, 0, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 0, 0, 0, 453, 0, + 0, 454, 712, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 0, 0, 431, 432, 501, 826, 502, 0, 503, 504, - 708, 0, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 452, 0, 0, 453, 709, 0, 454, 0, - 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 468, 469, 0, 0, 0, 0, + 0, 0, 0, 474, 475, 476, 477, 478, 0, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 0, 0, 432, 433, 502, 829, 503, 0, 504, 505, + 711, 0, 438, 439, 440, 441, 442, 0, 0, 0, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, + 0, 0, 453, 0, 0, 454, 712, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 0, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 0, 479, 0, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 59, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 431, 432, 0, 0, 501, 0, - 502, 0, 503, 504, 437, 438, 439, 440, 441, 0, - 0, 0, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 0, 0, 452, 0, 0, 453, 0, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 565, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 468, 469, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 432, 433, 0, 0, 502, 0, + 503, 0, 504, 505, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 1110, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 0, 478, 914, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 915, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 918, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 919, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 431, 432, 0, 0, - 958, 0, 502, 959, 503, 504, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 0, 452, 0, 0, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 1104, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 468, 469, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 502, 0, 503, 0, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 0, 453, 0, 0, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 914, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 915, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 431, 432, - 0, 0, 501, 0, 502, 0, 503, 504, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 432, 433, + 0, 0, 502, 602, 503, 0, 504, 505, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 0, 0, 0, 453, 0, + 0, 454, 0, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 651, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 431, 432, 0, 0, 501, 601, 502, 0, 503, 504, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 452, 0, 0, 453, 0, 0, 454, 0, 0, 0, - 457, 0, 0, 0, 0, 0, 648, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 565, + 0, 0, 0, 474, 475, 476, 477, 478, 0, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 432, 433, 0, 0, 502, 0, 503, 0, 504, 505, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 0, 445, 0, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, + 453, 0, 0, 454, 0, 0, 455, 0, 0, 0, + 458, 0, 0, 662, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 0, 0, 0, 0, 0, 0, + 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 0, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 0, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 431, 432, 0, 0, 501, 0, 502, 0, - 503, 504, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 452, 0, 0, 453, 0, 0, 454, 0, - 0, 0, 457, 0, 0, 659, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 468, 469, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 0, 0, 432, 433, 502, 0, 503, 0, + 504, 505, 694, 0, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 0, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 0, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 0, 0, 431, 432, 501, 0, - 502, 0, 503, 504, 691, 0, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 0, 452, 0, 0, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 0, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 468, 469, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 0, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 59, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 502, 0, 503, 0, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 0, 453, 0, 0, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 0, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 59, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 431, 432, - 0, 0, 501, 0, 502, 0, 503, 504, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 698, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 0, 0, + 432, 433, 502, 0, 503, 0, 504, 505, 702, 0, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 0, 445, 0, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, + 453, 0, 0, 454, 0, 0, 455, 0, 0, 0, + 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 695, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 0, 0, 431, 432, 501, 0, 502, 0, 503, 504, - 699, 0, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 452, 0, 0, 453, 0, 0, 454, 0, - 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 468, 469, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 0, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 432, 433, 0, 0, 502, 0, 503, 0, + 504, 505, 438, 439, 440, 441, 442, 0, 0, 1042, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, + 0, 0, 453, 0, 0, 454, 0, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 0, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 0, 479, 0, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 59, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 431, 432, 0, 0, 501, 0, - 502, 0, 503, 504, 437, 438, 439, 440, 441, 0, - 0, 1037, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 0, 0, 452, 0, 0, 453, 0, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 565, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 468, 469, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 432, 433, 0, 0, 502, 0, + 503, 0, 504, 505, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 0, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 0, 478, 0, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 59, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 0, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 59, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 431, 432, 0, 0, - 501, 0, 502, 0, 503, 504, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 0, 452, 0, 0, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 0, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 468, 469, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 502, 0, 503, 1062, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 0, 453, 0, 0, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 0, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 59, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 431, 432, - 0, 0, 501, 0, 502, 1057, 503, 504, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1114, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 432, 433, + 0, 0, 502, 0, 503, 0, 504, 505, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 0, 0, 0, 453, 0, + 0, 454, 0, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1108, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 431, 432, 0, 0, 501, 0, 502, 0, 503, 504, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 452, 0, 0, 453, 0, 0, 454, 0, 0, 0, - 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 565, + 0, 0, 0, 474, 475, 476, 477, 478, 0, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 432, 433, 0, 0, 502, 0, 503, 1175, 504, 505, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 0, 445, 0, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, + 453, 0, 0, 454, 0, 0, 455, 0, 0, 0, + 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 0, 0, 0, 0, 0, 0, + 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 0, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 0, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 431, 432, 0, 0, 501, 0, 502, 1168, - 503, 504, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 452, 0, 0, 453, 0, 0, 454, 0, - 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 468, 469, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 432, 433, 0, 0, 502, 0, 503, 1190, + 504, 505, 438, 439, 440, 441, 442, 0, 0, 0, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, + 0, 0, 453, 0, 0, 454, 0, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 0, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 0, 479, 0, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 59, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 431, 432, 0, 0, 501, 0, - 502, 1183, 503, 504, 437, 438, 439, 440, 441, 0, - 0, 0, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 0, 0, 452, 0, 0, 453, 0, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 565, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 468, 469, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 432, 433, 0, 0, 502, 0, + 503, 1388, 504, 505, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 0, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 0, 478, 0, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 59, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 0, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 59, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 431, 432, 0, 0, - 501, 0, 502, 1379, 503, 504, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 0, 452, 0, 0, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 0, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 468, 469, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 502, 0, 503, 1397, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 0, 453, 0, 0, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 0, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 59, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 431, 432, - 0, 0, 501, 0, 502, 1388, 503, 504, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 432, 433, + 0, 0, 502, 0, 503, 1442, 504, 505, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 0, 0, 0, 453, 0, + 0, 454, 0, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 431, 432, 0, 0, 501, 0, 502, 1433, 503, 504, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 452, 0, 0, 453, 0, 0, 454, 0, 0, 0, - 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 565, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 474, 475, 476, 477, 478, 0, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 432, 433, 0, 0, 502, 0, 503, 1516, 504, 505, + 438, 439, 440, 441, 442, 0, 0, 0, 0, 0, + 443, 0, 445, 0, 0, 0, 448, 0, 0, 0, + 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, + 453, 0, 0, 454, 0, 0, 455, 0, 0, 0, + 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 565, 0, 0, 462, 463, 0, 317, 318, 319, 0, + 321, 322, 323, 324, 325, 464, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 0, 339, 340, + 341, 0, 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, + 0, 1553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 0, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 0, - 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 474, 475, 476, 477, 478, + 0, 479, 0, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 59, 567, 492, 493, 0, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 0, 499, 500, - 0, 0, 431, 432, 0, 0, 501, 0, 502, 1507, - 503, 504, 437, 438, 439, 440, 441, 0, 0, 0, - 0, 0, 442, 0, 444, 0, 0, 0, 447, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 452, 0, 0, 453, 0, 0, 454, 0, - 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 564, 0, 0, 461, 462, 0, 316, 317, - 318, 0, 320, 321, 322, 323, 324, 463, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 0, - 338, 339, 340, 0, 0, 343, 344, 345, 346, 464, - 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 468, 469, 0, 0, 0, 0, - 0, 0, 0, 1544, 0, 0, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 14, 0, 0, 500, 501, + 0, 0, 432, 433, 0, 0, 502, 0, 503, 0, + 504, 505, 438, 439, 440, 441, 442, 0, 0, 0, + 0, 0, 443, 0, 445, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, + 0, 0, 453, 0, 0, 454, 0, 0, 455, 0, + 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 565, 0, 0, 462, 463, 0, 317, 318, + 319, 0, 321, 322, 323, 324, 325, 464, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 0, + 339, 340, 341, 0, 0, 344, 345, 346, 347, 465, + 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, + 0, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 473, 474, 475, - 476, 477, 0, 478, 0, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 59, 566, 491, 492, - 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 474, 475, 476, + 477, 478, 0, 479, 0, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 59, 567, 492, 493, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 496, 497, 498, 0, 14, 0, 0, - 499, 500, 0, 0, 431, 432, 0, 0, 501, 0, - 502, 0, 503, 504, 437, 438, 439, 440, 441, 0, - 0, 0, 0, 0, 442, 0, 444, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 449, 0, - 0, 0, 0, 0, 452, 0, 0, 453, 0, 0, - 454, 0, 0, 0, 457, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 564, 0, 0, 461, 462, 0, - 316, 317, 318, 0, 320, 321, 322, 323, 324, 463, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 0, 338, 339, 340, 0, 0, 343, 344, 345, - 346, 464, 465, 565, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 468, 469, 0, 0, - 0, 0, 0, 0, 0, 1586, 0, 0, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 14, 0, 0, + 500, 501, 0, 0, 432, 433, 0, 0, 502, 0, + 503, 0, 504, 505, 438, 439, 440, 441, 442, 0, + 0, 0, 0, 0, 443, 0, 445, 0, 0, 0, + 448, 0, 0, 0, 0, 0, 0, 0, 450, 0, + 0, 0, 0, 0, 453, 0, 0, 454, 0, 0, + 455, 0, 0, 0, 458, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 462, 463, 0, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, + 0, 0, 0, 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 473, - 474, 475, 476, 477, 0, 478, 0, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 59, 566, - 491, 492, 0, 0, 0, 0, 0, 0, 493, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 474, + 475, 476, 477, 478, 0, 479, 0, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 59, 567, + 492, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 497, 498, 0, 14, - 0, 0, 499, 500, 0, 0, 431, 432, 0, 0, - 501, 0, 502, 0, 503, 504, 437, 438, 439, 440, - 441, 0, 0, 0, 0, 0, 442, 0, 444, 0, - 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 0, 452, 0, 0, 453, - 0, 0, 454, 0, 0, 0, 457, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 0, 0, 461, - 462, 0, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 468, 469, - 0, 0, 0, 0, 0, 0, 0, 1587, 0, 0, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 14, + 0, 0, 500, 501, 0, 0, 432, 433, 0, 0, + 502, 0, 503, 0, 504, 505, 438, 439, 440, 441, + 442, 0, 0, 0, 0, 0, 443, 0, 445, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 0, 453, 0, 0, 454, + 0, 0, 455, 0, 0, 0, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 565, 0, 0, 462, + 463, 0, 317, 318, 319, 0, 321, 322, 323, 324, + 325, 464, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 0, 339, 340, 341, 0, 0, 344, + 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 473, 474, 475, 476, 477, 0, 478, 0, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 59, 566, 491, 492, 0, 0, 0, 0, 0, 0, - 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 496, 497, 498, - 0, 14, 0, 0, 499, 500, 0, 0, 431, 432, - 0, 0, 501, 0, 502, 0, 503, 504, 437, 438, - 439, 440, 441, 0, 0, 0, 0, 0, 442, 0, - 444, 0, 0, 0, 447, 0, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 0, 0, 452, 0, - 0, 453, 0, 0, 454, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, - 0, 461, 462, 0, 316, 317, 318, 0, 320, 321, - 322, 323, 324, 463, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 0, 338, 339, 340, 0, - 0, 343, 344, 345, 346, 464, 465, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, + 0, 474, 475, 476, 477, 478, 0, 479, 0, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 59, 567, 492, 493, 0, 0, 0, 0, 0, 0, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 14, 0, 0, 500, 501, 0, 0, 432, 433, + 0, 0, 502, 0, 503, 0, 504, 505, 438, 439, + 440, 441, 442, 0, 0, 0, 0, 0, 443, 0, + 445, 0, 0, 0, 448, 0, 0, 0, 0, 0, + 0, 0, 450, 0, 0, 0, 0, 0, 453, 0, + 0, 454, 0, 0, 455, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 0, 462, 463, 0, 317, 318, 319, 0, 321, 322, + 323, 324, 325, 464, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 0, 339, 340, 341, 0, + 0, 344, 345, 346, 347, 465, 466, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 469, 470, 0, -68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 735, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 473, 474, 475, 476, 477, 0, 478, - 0, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 59, 566, 491, 492, 0, 0, 0, 0, - 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, - 497, 498, 0, 14, 0, 0, 499, 500, 0, 0, - 431, 432, 0, 0, 501, 0, 502, 0, 503, 504, - 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, - 442, 0, 444, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 452, 0, 0, 453, 0, 0, 454, 0, 0, 0, - 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 564, 0, 0, 461, 462, 0, 316, 317, 318, 0, - 320, 321, 322, 323, 324, 463, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 0, 338, 339, - 340, 0, 0, 343, 344, 345, 346, 464, 465, 565, + 0, 0, 0, 474, 475, 476, 477, 478, 0, 479, + 0, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 59, 567, 492, 493, 0, 0, 0, 0, + 735, 736, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 14, 0, 0, 500, 501, 0, 0, + 0, 0, 0, 0, 1373, 0, 503, 0, 504, 505, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 762, + 763, 764, 765, 766, 0, 0, 767, 768, 769, 770, + 771, 772, 773, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 745, 746, 747, 748, 749, 0, + 0, 752, 753, 754, 755, 0, 757, 758, 759, 760, + 0, 0, 0, 0, 761, 0, 763, 764, 0, 0, + 0, 774, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 692, 0, 0, 0, 0, 0, + 311, 1368, 0, 786, 787, 0, 312, 0, 504, 678, + 735, 736, 313, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, + 315, 777, 778, 779, 780, 781, 782, 783, 784, 785, + 0, 0, 0, 0, 0, 316, 0, 0, 0, 786, + 787, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 473, 474, 475, 476, 477, - 0, 478, 0, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 59, 566, 491, 492, 0, 687, - 0, 0, 0, 0, 493, 310, 0, 0, 0, 0, - 0, 311, 0, 0, 0, 0, 0, 312, 0, 0, - 0, 496, 497, 498, 0, 14, 0, 313, 499, 500, - 0, 0, 0, 0, 0, 314, 1364, 0, 502, 0, - 503, 504, 0, 0, 0, 0, 0, 0, 0, 0, - 315, 0, 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 689, 0, - 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, - 311, 0, 0, 0, 0, 0, 312, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 313, 0, 58, 0, - 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, - 0, 349, 0, 0, 0, 0, 0, 0, 0, 315, - 0, 0, 0, 0, 0, 59, 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, 0, + 0, 0, 0, 0, 745, 746, 747, 748, 749, 0, + 0, 752, 753, 754, 755, 0, 757, 758, 759, 760, + 0, 0, 0, 58, 761, 0, 763, 764, 0, 0, + 0, 0, 767, 768, 769, 0, 350, 0, 773, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, + 59, 0, 0, 0, 0, 312, 0, 0, 0, 0, + 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 314, 0, 0, 0, 0, 0, 0, 775, 315, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, + 0, 0, 0, 0, 316, 0, 351, 0, 0, 786, + 787, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, + 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, + 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 314, 0, 58, 0, 0, 0, 0, 0, 315, 0, + 0, 0, 0, 0, 0, 350, 0, 0, 0, 0, + 0, 0, 0, 316, 0, 0, 0, 0, 0, 59, + 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 351, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 350, 0, 310, 0, 0, 0, 0, 0, 311, - 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 313, 0, 58, 0, 0, - 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, - 349, 0, 0, 0, 0, 0, 0, 0, 315, 0, - 0, 0, 0, 0, 59, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 350, 0, 310, 0, 0, 0, 0, 0, 311, 0, - 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 313, 0, 58, 0, 0, 0, - 0, 0, 314, 0, 0, 0, 0, 0, 0, 349, - 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, - 0, 0, 0, 59, 316, 317, 318, 319, 320, 321, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 350, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 0, 0, 0, 0, 610, 312, + 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, + 611, 0, 0, 0, 0, 314, 612, 0, 0, 0, + 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, + 0, 0, 0, 0, 351, 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, - 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, + 342, 343, 344, 345, 346, 347, 348, 349, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 311, 0, 0, 0, 0, 0, 312, 0, + 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 314, 0, 58, 0, 0, 0, + 0, 0, 315, 0, 0, 0, 0, 0, 0, 350, + 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, + 0, 0, 0, 59, 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, 735, 736, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, - 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, - 0, 0, 609, 311, 0, 0, 0, 0, 0, 312, - 0, 0, 0, 0, 610, 0, 0, 0, 0, 313, - 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 315, 0, 0, 0, 0, 0, 350, 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, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, - 0, 0, 311, 0, 0, 0, 0, 0, 312, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, - 58, 0, 0, 0, 0, 0, 314, 0, 0, 0, - 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, - 0, 315, 0, 732, 733, 0, 0, 59, 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, 732, 733, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, + 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 0, 867, 868, 869, 870, 871, 872, 873, + 874, 745, 746, 747, 748, 749, 875, 876, 752, 753, + 754, 755, 877, 757, 758, 759, 760, -359, 351, 735, + 736, 761, 762, 763, 764, 878, 879, 0, 0, 767, + 768, 769, 880, 881, 882, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 349, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 0, 609, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 0, 0, 864, 865, 866, - 867, 868, 869, 870, 871, 742, 743, 744, 745, 746, - 872, 873, 749, 750, 751, 752, 874, 754, 755, 756, - 757, -356, 350, 732, 733, 758, 759, 760, 761, 875, - 876, 0, 0, 764, 765, 766, 877, 878, 879, 770, - 0, 0, 0, 0, 0, 0, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 880, 772, - 0, 773, 774, 775, 776, 777, 778, 779, 780, 781, - 782, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 783, 784, 0, 0, 0, 503, 675, 0, 0, 864, - 865, 866, 867, 868, 869, 870, 871, 742, 743, 744, - 745, 746, 872, 873, 749, 750, 751, 752, 874, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 759, 760, - 761, 875, 876, 0, 0, 764, 765, 766, 877, 878, - 879, 770, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 732, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1069, 0, 0, 0, 0, 0, 0, - 880, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 0, 503, 675, 864, - 865, 866, 867, 868, 869, 870, 871, 742, 743, 744, - 745, 746, 872, 873, 749, 750, 751, 752, 874, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 759, 760, - 761, 875, 876, 0, 0, 764, 765, 766, 877, 878, - 879, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 1264, 0, 0, 770, 0, 0, 0, - 880, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 0, 503, 675, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 796, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 806, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 822, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 837, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1140, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1144, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1146, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1156, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1157, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1158, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1159, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1160, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1285, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1298, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1301, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1436, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1451, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1452, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1471, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1473, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1475, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1479, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1549, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1550, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1551, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1559, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 732, 733, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 732, 733, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1561, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1572, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 742, 743, 744, 745, 746, 0, 0, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 732, 733, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 732, 733, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 0, - 0, 1577, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 764, 765, 766, 0, 0, - 0, 770, 742, 743, 744, 745, 746, 732, 733, 749, - 750, 751, 752, 0, 754, 755, 756, 757, 0, 0, - 0, 0, 758, 0, 760, 761, 0, 0, 0, 0, - 764, 765, 766, 0, 0, 0, 770, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 1641, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 772, 0, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 783, 784, 827, - 0, 742, 743, 744, 745, 746, 732, 733, 749, 750, - 751, 752, 0, 754, 755, 756, 757, 0, 0, 0, - 0, 758, 0, 760, 761, 0, 0, 0, 0, 764, - 765, 766, 0, 0, 0, 770, 0, 0, 0, 0, - 0, 732, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 883, 775, 0, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 786, 787, 0, 0, + 0, 504, 678, 0, 0, 867, 868, 869, 870, 871, + 872, 873, 874, 745, 746, 747, 748, 749, 875, 876, + 752, 753, 754, 755, 877, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 762, 763, 764, 878, 879, 0, + 0, 767, 768, 769, 880, 881, 882, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 0, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 783, 784, 1091, 0, - 742, 743, 744, 745, 746, 0, 0, 749, 750, 751, - 752, 0, 754, 755, 756, 757, 0, 0, 0, 0, - 758, 0, 760, 761, 0, 0, 0, 0, 764, 765, - 766, 0, 0, 0, 770, 742, 743, 744, 745, 746, - 732, 733, 749, 750, 751, 752, 0, 754, 755, 756, - 757, 0, 0, 0, 0, 758, 0, 760, 761, 0, - 0, 0, 0, 764, 765, 766, 0, 0, 0, 770, - 0, 0, 0, 0, 772, 0, 773, 774, 775, 776, - 777, 778, 779, 780, 781, 782, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 783, 784, 1237, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 772, - 0, 773, 774, 775, 776, 777, 778, 779, 780, 781, - 782, 970, 0, 0, 0, 0, 0, 0, 0, 0, - 783, 784, 1252, 0, 742, 743, 744, 745, 746, 732, - 733, 749, 750, 751, 752, 0, 754, 755, 756, 757, - 0, 0, 0, 0, 758, 0, 760, 761, 0, 0, - 0, 0, 764, 765, 766, 0, 0, 0, 770, 0, - 0, 0, 0, 316, 317, 318, 0, 320, 321, 322, - 323, 324, 463, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 0, 338, 339, 340, 0, 0, - 343, 344, 345, 346, 0, 0, 0, 0, 772, 0, - 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 783, - 784, 1386, 0, 742, 743, 744, 745, 746, 0, 0, - 749, 750, 751, 752, 0, 754, 755, 756, 757, 231, - 232, 0, 0, 758, 0, 760, 761, 0, 0, 971, - 0, 764, 765, 766, 0, 0, 233, 770, 0, 0, - 0, 972, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 732, 733, 0, 0, 0, 0, + 0, 0, 0, 0, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074, + 0, 0, 0, 0, 0, 0, 883, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 0, 504, 678, 867, 868, 869, 870, 871, + 872, 873, 874, 745, 746, 747, 748, 749, 875, 876, + 752, 753, 754, 755, 877, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 762, 763, 764, 878, 879, 0, + 0, 767, 768, 769, 880, 881, 882, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 1274, + 0, 0, 773, 0, 0, 0, 883, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 0, 504, 678, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 799, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 809, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 825, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 840, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1151, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1153, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1163, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1164, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1166, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1295, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1307, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1310, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1445, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1460, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1461, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1482, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1484, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1488, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1558, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1559, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1560, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 735, 736, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 735, + 736, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1570, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1580, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 745, 746, + 747, 748, 749, 0, 0, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 735, + 736, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 735, 736, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 0, 0, 1585, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1650, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, + 0, 767, 768, 769, 0, 0, 0, 773, 745, 746, + 747, 748, 749, 735, 736, 752, 753, 754, 755, 0, + 757, 758, 759, 760, 0, 0, 0, 0, 761, 0, + 763, 764, 0, 0, 0, 0, 767, 768, 769, 0, + 0, 0, 773, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 1651, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 775, 0, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 786, 787, 830, 0, 745, 746, 747, + 748, 749, 735, 736, 752, 753, 754, 755, 0, 757, + 758, 759, 760, 0, 0, 0, 0, 761, 0, 763, + 764, 0, 0, 0, 0, 767, 768, 769, 0, 0, + 0, 773, 0, 0, 0, 0, 0, 735, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 0, 773, - 774, 775, 776, 777, 778, 779, 780, 781, 782, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 783, 784, - 1391, 0, 0, 0, 0, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 0, 0, 252, 253, 254, 0, 0, - 0, 0, 0, 0, 255, 256, 257, 258, 259, 0, - 0, 260, 261, 262, 263, 264, 265, 266, 742, 743, - 744, 745, 746, 732, 733, 749, 750, 751, 752, 0, - 754, 755, 756, 757, 0, 0, 0, 0, 758, 0, - 760, 761, 0, 0, 0, 0, 764, 765, 766, 0, - 0, 0, 770, 0, 0, 0, 0, 267, 0, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 0, - 0, 278, 279, 0, 0, 0, 0, 0, 280, 281, - 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 772, 0, 773, 774, 775, 776, 777, 778, - 779, 780, 781, 782, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 783, 784, 0, 0, 742, 743, 744, - 745, 746, 732, 733, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 930, 0, 764, 765, 766, 0, 0, - 0, 770, 0, 0, 0, 0, 0, 732, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 775, 0, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 786, 787, 1097, 0, 745, 746, 747, 748, + 749, 0, 0, 752, 753, 754, 755, 0, 757, 758, + 759, 760, 0, 0, 0, 0, 761, 0, 763, 764, + 0, 0, 0, 0, 767, 768, 769, 0, 0, 0, + 773, 745, 746, 747, 748, 749, 735, 736, 752, 753, + 754, 755, 0, 757, 758, 759, 760, 0, 0, 0, + 0, 761, 0, 763, 764, 0, 0, 0, 0, 767, + 768, 769, 0, 0, 0, 773, 0, 0, 0, 0, + 775, 0, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 786, 787, 1247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 775, 0, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 975, 0, 0, + 0, 0, 0, 0, 0, 0, 786, 787, 1262, 0, + 745, 746, 747, 748, 749, 735, 736, 752, 753, 754, + 755, 0, 757, 758, 759, 760, 0, 0, 0, 0, + 761, 0, 763, 764, 0, 0, 0, 0, 767, 768, + 769, 0, 0, 0, 773, 0, 0, 0, 0, 317, + 318, 319, 0, 321, 322, 323, 324, 325, 464, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 0, 339, 340, 341, 0, 0, 344, 345, 346, 347, + 0, 0, 0, 0, 775, 0, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 786, 787, 1395, 0, 745, + 746, 747, 748, 749, 0, 0, 752, 753, 754, 755, + 0, 757, 758, 759, 760, 231, 232, 0, 0, 761, + 0, 763, 764, 0, 0, 976, 0, 767, 768, 769, + 0, 0, 233, 773, 0, 0, 0, 977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 0, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 742, 743, 744, 745, - 746, 0, 0, 749, 750, 751, 752, 0, 754, 755, - 756, 757, 0, 0, 0, 0, 758, 0, 760, 761, - 0, 0, 1169, 0, 764, 765, 766, 732, 733, 0, - 770, 742, 743, 744, 745, 746, 0, 0, 749, 750, - 751, 752, 0, 754, 755, 756, 757, 0, 0, 0, - 0, 758, 0, 760, 761, 0, 0, 0, 0, 764, - 765, 766, 732, 733, 0, 770, 0, 0, 0, 0, - 772, 0, 773, 774, 775, 776, 777, 778, 779, 780, - 781, 782, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 783, 784, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 1242, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 0, 0, 0, - 0, 742, 743, 744, 745, 746, 783, 784, 749, 750, - 751, 752, 0, 754, 755, 756, 757, 0, 0, 0, - 0, 758, 0, 760, 761, 0, 0, 0, 0, 764, - 765, 766, 732, 733, 0, 770, 742, 743, 744, 745, - 746, 0, 0, 749, 750, 751, 752, 0, 754, 755, - 756, 757, 0, 0, 0, 0, 758, 0, 760, 761, - 0, 0, 0, 0, 764, 765, 766, 1254, 0, 0, - 770, 732, 733, 0, 0, 772, 0, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 783, 784, 1349, 0, + 735, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 772, 0, 773, 774, 775, 776, 777, 778, 779, 780, - 781, 782, 0, 0, 0, 0, 742, 743, 744, 745, - 746, 783, 784, 749, 750, 751, 752, 0, 754, 755, - 756, 757, 0, 0, 0, 0, 758, 0, 760, 761, - 0, 0, 0, 0, 764, 765, 766, 0, 0, 0, - 770, 732, 733, 0, 0, 742, 743, 744, 745, 746, - 0, 0, 749, 750, 751, 752, 0, 754, 755, 756, - 757, 0, 0, 0, 0, 758, 0, 760, 761, 0, - 0, 0, 1573, 764, 765, 766, 732, 733, 0, 770, - 772, 0, 773, 774, 775, 776, 777, 778, 779, 780, - 781, 782, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 783, 784, 0, 0, 0, 0, 0, 0, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 0, 772, - 0, 773, 774, 775, 776, 777, 778, 779, 780, 781, - 782, 0, 0, 0, 0, 742, 743, 744, 745, 746, - 783, 784, 749, 750, 751, 752, 0, 754, 755, 756, - 757, 0, 0, 0, 0, 758, 0, 760, 761, 0, - 0, 0, 0, 764, 765, 766, 732, 733, 0, 770, - 742, 743, 744, 745, 746, 0, 0, 749, 750, 751, - 752, 0, 754, 755, 756, 757, 0, 0, 0, 0, - 758, 0, 760, 761, 0, 0, 0, 0, 764, 765, - 766, 1657, 0, 0, 770, 732, 733, 0, 0, 772, - 0, 773, 774, 775, 776, 777, 778, 779, 780, 781, - 782, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 783, 784, 0, 0, 0, 0, 1658, 0, 0, 0, - 0, 0, 0, 0, 772, 0, 773, 774, 775, 776, - 777, 778, 779, 780, 781, 782, 0, 0, 0, 0, - 742, 743, 744, 745, 746, 783, 784, 749, 750, 751, - 752, 0, 754, 755, 756, 757, 0, 0, 0, 0, - 758, 0, 760, 761, 0, 0, 0, 0, 764, 765, - 766, 0, 0, 0, 770, 732, 733, 0, 0, 742, - 743, 744, 745, 746, 0, 0, 749, 750, 751, 752, - 0, 754, 755, 756, 757, 0, 0, 0, 0, 758, - 0, 760, 761, 0, 0, 0, 1664, 764, 765, 766, - 732, 733, 0, 770, 772, 0, 773, 774, 775, 776, - 777, 778, 779, 780, 781, 782, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 783, 784, 0, 0, 0, + 0, 0, 0, 775, 0, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 785, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 786, 787, 1400, 0, 0, 0, + 0, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, + 0, 252, 253, 254, 0, 0, 0, 0, 0, 0, + 255, 256, 257, 258, 259, 0, 0, 260, 261, 262, + 263, 264, 265, 266, 745, 746, 747, 748, 749, 735, + 736, 752, 753, 754, 755, 0, 757, 758, 759, 760, + 0, 0, 0, 0, 761, 0, 763, 764, 0, 0, + 0, 0, 767, 768, 769, 0, 0, 0, 773, 0, + 0, 0, 0, 267, 0, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 0, 0, 278, 279, 0, + 0, 0, 0, 0, 280, 281, 0, 0, 286, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 775, 0, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 786, + 787, 0, 0, 745, 746, 747, 748, 749, 735, 736, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 934, + 0, 767, 768, 769, 0, 0, 0, 773, 0, 0, + 0, 0, 0, 735, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 772, 0, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 0, 0, 0, 0, 742, - 743, 744, 745, 746, 783, 784, 749, 750, 751, 752, - 0, 754, 755, 756, 757, 0, 0, 0, 0, 758, - 0, 760, 761, 0, 0, 0, 0, 764, 765, 766, - 732, 733, 0, -746, 742, 743, 744, 745, 746, 0, - 0, 749, 750, 751, 752, 0, 754, 755, 756, 757, - 0, 0, 0, 0, 758, 0, 760, 761, 0, 0, - 0, 0, 764, 765, 766, 732, 733, 0, 0, 0, - 0, 0, 0, 772, 0, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 783, 784, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 772, 0, - 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 0, 0, 0, 0, 742, 743, 744, 745, 746, 783, - 784, 749, 750, 751, 752, 0, 754, 755, 756, 757, - 0, 0, 0, 0, 758, 0, 760, 761, 0, 0, - 0, 0, 764, 0, 766, 732, 733, 0, 0, 742, - 743, 744, 745, 746, 0, 0, 749, 750, 751, 752, - 0, 754, 755, 756, 757, 0, 0, 0, 0, 758, - 0, 760, 761, 732, 733, 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 783, - 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 0, 0, 0, 0, 742, - 743, 744, 745, 746, 783, 784, 749, 750, 751, 752, - 0, 754, 755, 756, 757, 0, 0, 0, 0, 758, - 0, 760, 761, 732, 733, 0, 0, 742, 743, 744, - 745, 746, 0, 0, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 732, 733, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 775, 0, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 0, 0, 745, 746, 747, 748, 749, 0, 0, 752, + 753, 754, 755, 0, 757, 758, 759, 760, 0, 0, + 0, 0, 761, 0, 763, 764, 0, 0, 1176, 0, + 767, 768, 769, 735, 736, 0, 773, 745, 746, 747, + 748, 749, 0, 0, 752, 753, 754, 755, 0, 757, + 758, 759, 760, 0, 0, 0, 0, 761, 0, 763, + 764, 0, 0, 0, 0, 767, 768, 769, 735, 736, + 0, 773, 0, 0, 0, 0, 775, 0, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 785, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 786, 787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 783, 784, 0, 0, 0, 0, - 0, 0, 0, 0, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 742, 743, 744, - 745, 746, 783, 784, 749, 750, 751, 752, 0, 754, - 755, 756, 757, 0, 0, 0, 0, 758, 0, 760, - 761, 0, 0, 0, 0, 742, 743, 744, 745, 746, - 0, 0, 749, 750, 751, 752, 0, 754, 755, 756, - 757, 0, 0, 0, 0, 758, 0, 760, 761, 0, + 0, 775, 1252, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 0, 0, 0, 0, 745, 746, 747, + 748, 749, 786, 787, 752, 753, 754, 755, 0, 757, + 758, 759, 760, 0, 0, 0, 0, 761, 0, 763, + 764, 0, 0, 0, 0, 767, 768, 769, 735, 736, + 0, 773, 745, 746, 747, 748, 749, 0, 0, 752, + 753, 754, 755, 0, 757, 758, 759, 760, 0, 0, + 0, 0, 761, 0, 763, 764, 0, 0, 0, 0, + 767, 768, 769, 1264, 0, 0, 773, 735, 736, 0, + 0, 775, 0, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 786, 787, 1357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 775, 0, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 785, 0, 0, + 0, 0, 745, 746, 747, 748, 749, 786, 787, 752, + 753, 754, 755, 0, 757, 758, 759, 760, 0, 0, + 0, 0, 761, 0, 763, 764, 0, 0, 0, 0, + 767, 768, 769, 0, 0, 0, 773, 735, 736, 0, + 0, 745, 746, 747, 748, 749, 0, 0, 752, 753, + 754, 755, 0, 757, 758, 759, 760, 0, 0, 0, + 0, 761, 0, 763, 764, 0, 0, 0, 1581, 767, + 768, 769, 735, 736, 0, 773, 775, 0, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 785, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 786, 787, 0, + 0, 0, 0, 0, 0, 0, 0, 1641, 0, 0, + 0, 0, 0, 0, 0, 775, 0, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 0, 0, 0, + 0, 745, 746, 747, 748, 749, 786, 787, 752, 753, + 754, 755, 0, 757, 758, 759, 760, 0, 0, 0, + 0, 761, 0, 763, 764, 0, 0, 0, 0, 767, + 768, 769, 735, 736, 0, 773, 745, 746, 747, 748, + 749, 0, 0, 752, 753, 754, 755, 0, 757, 758, + 759, 760, 0, 0, 0, 0, 761, 0, 763, 764, + 0, 0, 0, 0, 767, 768, 769, 1666, 0, 0, + 773, 735, 736, 0, 0, 775, 0, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 786, 787, 0, 0, + 0, 0, 1667, 0, 0, 0, 0, 0, 0, 0, + 775, 0, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 0, 0, 0, 0, 745, 746, 747, 748, + 749, 786, 787, 752, 753, 754, 755, 0, 757, 758, + 759, 760, 0, 0, 0, 0, 761, 0, 763, 764, + 0, 0, 0, 0, 767, 768, 769, 0, 0, 0, + 773, 735, 736, 0, 0, 745, 746, 747, 748, 749, + 0, 0, 752, 753, 754, 755, 0, 757, 758, 759, + 760, 0, 0, 0, 0, 761, 0, 763, 764, 0, + 0, 0, 1673, 767, 768, 769, 735, 736, 0, 773, + 775, 0, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 786, 787, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, + 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 0, 0, 0, 0, 745, 746, 747, 748, 749, + 786, 787, 752, 753, 754, 755, 0, 757, 758, 759, + 760, 0, 0, 0, 0, 761, 0, 763, 764, 0, + 0, 0, 0, 767, 768, 769, 735, 736, 0, -753, + 745, 746, 747, 748, 749, 0, 0, 752, 753, 754, + 755, 0, 757, 758, 759, 760, 0, 0, 0, 0, + 761, 0, 763, 764, 0, 0, 0, 0, 767, 768, + 769, 735, 736, 0, 0, 0, 0, 0, 0, 775, + 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 786, 787, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 775, 0, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 0, 0, 0, 0, + 745, 746, 747, 748, 749, 786, 787, 752, 753, 754, + 755, 0, 757, 758, 759, 760, 0, 0, 0, 0, + 761, 0, 763, 764, 0, 0, 0, 0, 767, 0, + 769, 735, 736, 0, 0, 745, 746, 747, 748, 749, + 0, 0, 752, 753, 754, 755, 0, 757, 758, 759, + 760, 0, 0, 0, 0, 761, 0, 763, 764, 735, + 736, 0, 0, 767, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 786, 787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 0, 0, 0, 0, 745, 746, 747, 748, 749, + 786, 787, 752, 753, 754, 755, 0, 757, 758, 759, + 760, 0, 0, 0, 0, 761, 0, 763, 764, 0, + 0, 0, 0, 745, 746, 747, 748, 749, 0, 0, + 752, 753, 754, 755, 0, 757, 758, 759, 760, 0, + 0, 0, 0, 761, 0, 763, 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 974, 0, 0, 0, 0, 775, 776, 777, 778, 779, - 780, 781, 782, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 783, 784, 0, 0, 0, 0, 0, 0, - 0, 1238, 0, 0, 776, 777, 778, 779, 780, 781, - 782, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 783, 784, 316, 317, 318, 0, 320, 321, 322, 323, - 324, 463, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 0, 338, 339, 340, 0, 0, 343, - 344, 345, 346, 316, 317, 318, 0, 320, 321, 322, - 323, 324, 463, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 0, 338, 339, 340, 0, 0, - 343, 344, 345, 346, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 975, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 979, 0, + 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 786, 787, 0, 0, 0, 0, 0, 0, 0, 1248, + 0, 0, 779, 780, 781, 782, 783, 784, 785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 786, 787, + 317, 318, 319, 0, 321, 322, 323, 324, 325, 464, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 0, 339, 340, 341, 0, 0, 344, 345, 346, + 347, 317, 318, 319, 0, 321, 322, 323, 324, 325, + 464, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 0, 339, 340, 341, 0, 0, 344, 345, + 346, 347, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 981, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 183, 0, 184, 185, 186, 187, 188, 1249, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 1250, + 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 976, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 182, 0, 183, 0, 184, 185, 186, 187, 188, 1239, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 1240, 200, 201, 202, 0, 0, 203, 204, 205, - 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 207, 208, 0, 0, + 0, 0, 0, 0, 207, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 209 + 0, 0, 0, 0, 0, 0, 209 }; static const yytype_int16 yycheck[] = { - 14, 15, 211, 571, 622, 388, 688, 375, 690, 482, - 443, 647, 227, 710, 375, 712, 471, 472, 520, 161, - 690, 585, 443, 587, 591, 589, 921, 590, 537, 813, - 227, 815, 927, 817, 417, 1172, 382, 905, 851, 721, - 80, 627, 52, 32, 4, 7, 467, 0, 21, 63, - 64, 65, 561, 6, 19, 1404, 52, 56, 14, 15, - 103, 19, 1367, 62, 127, 128, 18, 19, 141, 502, - 124, 45, 125, 127, 128, 32, 29, 168, 31, 130, - 33, 161, 443, 56, 32, 1527, 39, 19, 33, 6, - 104, 105, 106, 107, 19, 168, 49, 480, 481, 19, - 125, 687, 55, 689, 19, 691, 467, 19, 158, 125, - 135, 59, 60, 699, 142, 143, 144, 62, 1518, 135, - 1520, 178, 708, 214, 1524, 1525, 79, 186, 125, 180, - 178, 105, 49, 125, 187, 14, 15, 190, 135, 212, - 141, 101, 102, 1585, 141, 1552, 209, 210, 101, 102, - 180, 180, 211, 183, 575, 209, 210, 1462, 373, 301, - 156, 594, 187, 860, 212, 215, 187, 192, 677, 851, - 180, 187, 168, 1522, 122, 218, 373, 125, 126, 219, - 179, 211, 168, 1583, 213, 213, 883, 135, 189, 134, - 187, 388, 1329, 1600, 186, 187, 141, 189, 189, 896, - 192, 192, 899, 192, 186, 161, 639, 640, 20, 21, - 166, 141, 168, 227, 575, 171, 168, 179, 49, 640, - 417, 186, 419, 168, 56, 198, 212, 180, 186, 211, - 62, 664, 180, 193, 667, 192, 209, 446, 168, 187, - 188, 1427, 20, 21, 192, 125, 199, 195, 210, 670, - 32, 460, 212, 210, 186, 135, 212, 210, 203, 216, - 91, 186, 210, 646, 304, 140, 186, 212, 216, 156, - 186, 186, 150, 1168, 186, 730, 958, 59, 60, 640, - 158, 168, 161, 480, 481, 1153, 669, 166, 721, 168, - 168, 1104, 171, 178, 186, 190, 125, 213, 180, 194, - 1437, 1487, 1488, 178, 116, 117, 135, 187, 153, 670, - 125, 46, 124, 158, 126, 127, 128, 129, 186, 1505, - 135, 213, 134, 153, 186, 212, 127, 128, 158, 214, - 215, 66, 125, 180, 212, 193, 350, 190, 116, 117, - 122, 194, 135, 211, 126, 1213, 124, 194, 126, 127, - 128, 129, 189, 786, 212, 156, 134, 194, 187, 373, - 946, 576, 577, 578, 378, 580, 581, 168, 213, 584, - 215, 586, 187, 588, 388, 212, 1562, 1563, 799, 576, - 577, 578, 728, 580, 581, 215, 180, 584, 1557, 586, - 186, 588, 61, 590, 187, 1263, 190, 209, 210, 178, - 1569, 189, 141, 417, 968, 419, 188, 186, 209, 210, - 192, 150, 795, 195, 141, 211, 155, 626, 851, 197, - 198, 199, 1104, 150, 845, 439, 440, 186, 210, 168, - 186, 209, 210, 1328, 216, 20, 21, 186, 799, 1608, - 1609, 168, 651, 1227, 186, 1340, 183, 184, 957, 646, - 168, 169, 170, 186, 193, 186, 186, 213, 913, 932, - 141, 186, 211, 846, 847, 186, 480, 481, 168, 942, - 186, 213, 669, 186, 211, 186, 859, 150, 186, 1097, - 213, 199, 213, 213, 845, 918, 1168, 696, 213, 1171, - 211, 4, 5, 926, 7, 168, 161, 213, 1168, 193, - 213, 1183, 213, 211, 189, 888, 889, 716, 891, 194, - 150, 189, 895, 1183, 897, 898, 194, 900, 212, 1086, - 212, 1084, 35, 978, 979, 980, 180, 212, 168, 114, - 115, 116, 117, 187, 212, 732, 733, 193, 1322, 124, - 193, 126, 127, 128, 129, 63, 64, 65, 189, 134, - 193, 136, 137, 194, 180, 168, 212, 179, 180, 212, - 182, 758, 576, 577, 578, 180, 580, 581, 194, 212, - 584, 212, 586, 1357, 588, 209, 590, 180, 180, 194, - 180, 20, 21, 180, 11, 180, 104, 105, 106, 107, - 1154, 194, 194, 168, 194, 22, 23, 194, 795, 194, - 186, 179, 168, 189, 182, 180, 192, 185, 823, 168, - 195, 196, 197, 198, 199, 168, 831, 156, 632, 834, - 189, 180, 178, 192, 209, 210, 823, 180, 843, 168, - 180, 156, 646, 189, 831, 850, 156, 834, 20, 21, - 855, 74, 1206, 168, 156, 78, 843, 168, 168, 846, - 847, 156, 794, 850, 180, 669, 168, 190, 855, 92, - 93, 194, 859, 168, 97, 98, 99, 100, 168, 1102, - 56, 172, 881, 1309, 1458, 56, 62, 116, 117, 32, - 56, 62, 1364, 172, 173, 124, 62, 126, 127, 128, - 129, 888, 889, 190, 891, 134, 56, 194, 895, 713, - 897, 898, 62, 900, 56, 56, 59, 60, 168, 180, - 62, 62, 180, 180, 1332, 186, 168, 180, 186, 186, - 935, 180, 937, 186, 142, 1422, 144, 186, 1161, 178, - 1113, 1114, 1115, 180, 116, 117, 168, 190, 935, 186, - 937, 194, 124, 56, 190, 127, 128, 129, 194, 1182, - 180, 935, 134, 937, 1137, 1188, 195, 196, 197, 198, - 199, 190, 1195, 172, 190, 194, 1199, 142, 194, 122, - 209, 210, 125, 126, 105, 190, 32, 178, 792, 194, - 190, 795, 135, 190, 194, 172, 173, 194, 470, 471, - 472, 187, 172, 173, 174, 175, 86, 87, 1362, 142, - 143, 144, 1235, 59, 60, 168, 169, 170, 178, 823, - 375, 214, 215, 212, 1247, 214, 215, 831, 1436, 1321, - 834, 178, 1205, 34, 1506, 34, 168, 209, 210, 843, - 1198, 178, 846, 847, 187, 188, 850, 1198, 520, 192, - 1037, 855, 195, 212, 179, 859, 168, 4, 5, 172, - 173, 174, 179, 180, 181, 211, 215, 210, 1073, 168, - 168, 1497, 21, 216, 168, 547, 122, 24, 1565, 1566, - 126, 1568, 211, 30, 888, 889, 1073, 891, 443, 189, - 178, 895, 1564, 897, 898, 178, 900, 1084, 189, 42, - 1323, 10, 11, 12, 212, 212, 1464, 193, 193, 193, - 212, 193, 467, 190, 193, 193, 1603, 193, 193, 193, - 67, 68, 193, 193, 168, 212, 1113, 1114, 1115, 1601, - 1353, 935, 135, 937, 180, 168, 168, 168, 193, 212, - 193, 210, 188, 211, 193, 212, 192, 168, 194, 195, - 1137, 193, 193, 212, 101, 102, 180, 193, 193, 161, - 212, 212, 212, 32, 210, 193, 193, 212, 193, 1577, - 216, 36, 644, 212, 212, 215, 180, 9, 65, 42, - 180, 1404, 1445, 1541, 1542, 1448, 180, 180, 180, 1661, - 59, 60, 180, 180, 141, 210, 212, 179, 212, 168, - 672, 213, 1375, 193, 193, 168, 211, 180, 1207, 179, - 189, 158, 159, 160, 180, 179, 212, 179, 1205, 180, - 575, 168, 42, 130, 13, 193, 212, 187, 193, 186, - 161, 178, 215, 1591, 193, 189, 186, 178, 735, 736, - 737, 738, 739, 740, 741, 12, 193, 186, 158, 168, - 747, 748, 7, 122, 168, 213, 753, 126, 730, 194, - 168, 212, 168, 210, 168, 762, 763, 179, 186, 1073, - 767, 768, 769, 1496, 771, 186, 179, 211, 1283, 1502, - 1084, 213, 212, 212, 168, 640, 213, 212, 193, 212, - 1463, 1290, 193, 1, 179, 212, 1283, 212, 66, 1522, - 180, 168, 194, 375, 194, 194, 42, 1530, 168, 1113, - 1114, 1115, 212, 385, 212, 670, 213, 213, 213, 188, - 213, 32, 394, 192, 212, 194, 195, 213, 168, 801, - 213, 212, 404, 1137, 211, 211, 211, 168, 168, 168, - 193, 210, 414, 180, 212, 168, 212, 216, 59, 60, - 212, 423, 213, 212, 168, 212, 212, 211, 180, 168, - 1359, 433, 213, 1586, 211, 211, 32, 1540, 212, 212, - 212, 443, 1377, 168, 212, 1374, 448, 194, 450, 734, - 735, 736, 737, 738, 739, 740, 741, 459, 1375, 69, - 1377, 212, 747, 748, 212, 467, 468, 469, 753, 212, - 212, 1205, 212, 194, 194, 213, 212, 762, 763, 212, - 482, 122, 767, 768, 769, 126, 771, 213, 490, 212, - 212, 493, 180, 52, 496, 497, 498, 499, 500, 213, - 213, 903, 211, 1432, 179, 179, 213, 509, 179, 32, - 211, 913, 180, 186, 799, 179, 698, 213, 213, 213, - 213, 213, 213, 213, 211, 211, 79, 211, 1, 212, - 44, 213, 213, 133, 82, 1455, 59, 60, 1456, 1, - 792, 1476, 1456, 1456, 944, 225, 1463, 188, 1456, 1283, - 1456, 192, 1432, 194, 195, 964, 1372, 1395, 1484, 1476, - 845, 1398, 1259, 1485, 427, 52, 559, 439, 1564, 210, - 1443, 439, 1178, 575, -1, 216, 978, 979, 980, 690, - -1, 983, -1, 985, -1, 987, -1, 989, -1, 991, - -1, 993, -1, 995, -1, 997, -1, -1, -1, 122, - 1002, 603, 1004, 126, -1, -1, -1, -1, 1010, 1538, + 14, 15, 211, 572, 625, 389, 444, 521, 713, 483, + 715, 376, 376, 691, 592, 693, 693, 591, 444, 227, + 161, 420, 421, 538, 909, 586, 1179, 588, 80, 590, + 383, 816, 925, 818, 418, 820, 472, 473, 931, 854, + 1317, 227, 468, 7, 630, 21, 724, 562, 4, 63, + 64, 65, 18, 19, 1376, 20, 21, 19, 32, 52, + 19, 19, 141, 158, 19, 503, 180, 19, 19, 14, + 15, 56, 19, 52, 156, 103, 130, 62, 1412, 444, + 56, 168, 153, 32, 1536, 33, 168, 158, 193, 168, + 104, 105, 106, 107, 186, 45, 168, 481, 482, 0, + 142, 215, 144, 468, 690, 6, 692, 212, 694, 127, + 128, 1527, 125, 1529, 62, 140, 702, 1533, 1534, 211, + 215, 150, 135, 828, 141, 711, 180, 214, 29, 158, + 31, 213, 33, 212, 125, 142, 143, 144, 39, 168, + 212, 1593, 14, 15, 215, 101, 102, 962, 49, 1471, + 576, 116, 117, 178, 55, 105, 1561, 595, 863, 124, + 301, 126, 127, 128, 129, 680, 374, 219, 168, 134, + 178, 1505, 189, 178, 187, 1591, 854, 156, 79, 192, + 180, 389, 887, 212, 1337, 180, 134, 180, 374, 168, + 218, 209, 210, 141, 179, 900, 187, 1531, 903, 190, + 101, 102, 168, 1608, 642, 643, 213, 212, 20, 21, + 418, 576, 420, 227, 613, 179, 161, 643, 192, 618, + 168, 166, 198, 168, 186, 6, 171, 186, 186, 667, + 1507, 186, 670, 209, 186, 186, 210, 193, 447, 186, + 178, 125, 216, 192, 209, 210, 210, 673, 180, 20, + 21, 135, 461, 305, 124, 203, 212, 127, 128, 49, + 141, 127, 128, 125, 212, 649, 153, 212, 49, 150, + 161, 158, 1436, 481, 482, 1160, 214, 215, 643, 180, + 156, 213, 1175, 187, 962, 963, 724, 168, 672, 161, + 156, 141, 168, 1446, 166, 1110, 168, 733, 199, 171, + 125, 91, 168, 187, 116, 117, 183, 184, 673, 210, + 135, 46, 124, 180, 126, 127, 128, 129, 168, 186, + 172, 173, 134, 190, 186, 187, 213, 189, 215, 150, + 192, 66, 1496, 1497, 211, 1220, 212, 351, 125, 209, + 210, 186, 61, 209, 210, 116, 117, 168, 135, 125, + 1514, 789, 189, 124, 141, 192, 127, 128, 129, 135, + 374, 189, 187, 134, 950, 379, 194, 186, 213, 577, + 578, 579, 125, 581, 582, 389, 802, 585, 731, 587, + 125, 589, 135, 591, 212, 197, 198, 199, 1273, 186, + 135, 577, 578, 579, 213, 581, 582, 209, 210, 585, + 187, 587, 180, 589, 418, 183, 420, 1571, 1572, 808, + 150, 187, 973, 186, 798, 189, 854, 186, 192, 168, + 629, 141, 848, 822, 186, 824, 440, 441, 168, 32, + 150, 180, 1110, 211, 187, 155, 186, 802, 209, 210, + 213, 649, 187, 1336, 213, 654, 961, 186, 168, 32, + 1566, 213, 1237, 186, 186, 1348, 59, 60, 168, 169, + 170, 1577, 936, 213, 672, 849, 850, 481, 482, 56, + 141, 180, 946, 193, 213, 62, 59, 60, 862, 186, + 213, 917, 1103, 848, 922, 194, 885, 20, 21, 199, + 699, 189, 930, 4, 5, 186, 7, 1175, 1175, 186, + 1178, 1617, 1618, 161, 186, 186, 213, 168, 892, 893, + 719, 895, 1190, 1190, 1092, 899, 1090, 901, 902, 122, + 904, 186, 213, 126, 35, 56, 213, 735, 736, 211, + 211, 62, 74, 193, 4, 5, 78, 186, 212, 122, + 193, 186, 193, 126, 186, 1330, 211, 983, 984, 985, + 92, 93, 212, 761, 24, 97, 98, 99, 100, 212, + 30, 212, 211, 577, 578, 579, 211, 581, 582, 211, + 190, 585, 180, 587, 194, 589, 156, 591, 186, 209, + 1365, 114, 115, 116, 117, 188, 194, 193, 168, 192, + 798, 124, 195, 126, 127, 128, 129, 67, 68, 180, + 1161, 134, 180, 136, 137, 188, 212, 210, 186, 192, + 180, 194, 195, 216, 189, 939, 194, 941, 826, 194, + 189, 635, 156, 189, 194, 194, 834, 210, 194, 837, + 180, 101, 102, 216, 168, 649, 186, 212, 846, 168, + 826, 849, 850, 212, 194, 853, 212, 156, 834, 190, + 858, 837, 1213, 194, 862, 180, 797, 178, 672, 168, + 846, 186, 195, 196, 197, 198, 199, 853, 189, 194, + 1108, 141, 858, 178, 168, 884, 209, 210, 168, 20, + 21, 186, 1467, 180, 892, 893, 180, 895, 158, 159, + 160, 899, 186, 901, 902, 1373, 904, 156, 168, 11, + 180, 180, 716, 63, 64, 65, 186, 186, 178, 168, + 22, 23, 156, 180, 194, 194, 142, 143, 144, 1340, + 187, 56, 186, 193, 168, 189, 179, 62, 192, 182, + 1168, 939, 185, 941, 190, 1119, 1120, 1121, 194, 168, + 210, 168, 56, 56, 104, 105, 106, 107, 62, 62, + 56, 1189, 180, 939, 172, 941, 62, 1195, 186, 56, + 1144, 180, 168, 180, 1202, 62, 180, 186, 1206, 186, + 172, 173, 186, 114, 115, 116, 117, 118, 190, 178, + 121, 795, 194, 124, 798, 126, 127, 128, 129, 214, + 215, 180, 180, 134, 180, 136, 137, 186, 186, 190, + 186, 179, 180, 194, 182, 56, 190, 1245, 180, 1370, + 194, 168, 826, 190, 190, 1329, 168, 194, 194, 1257, + 834, 190, 190, 837, 1445, 194, 194, 190, 1212, 86, + 87, 194, 846, 172, 1042, 849, 850, 1515, 142, 853, + 1205, 1205, 20, 21, 858, 168, 169, 170, 862, 376, + 105, 187, 193, 194, 195, 196, 197, 198, 199, 178, + 178, 172, 173, 174, 175, 172, 173, 174, 209, 210, + 1078, 1576, 212, 178, 214, 215, 34, 34, 892, 893, + 212, 895, 1090, 1588, 178, 899, 168, 901, 902, 179, + 904, 168, 1078, 1331, 32, 1573, 179, 180, 181, 10, + 11, 12, 168, 168, 1473, 32, 1611, 1306, 211, 21, + 168, 1119, 1120, 1121, 189, 211, 178, 444, 189, 178, + 212, 59, 60, 1361, 42, 939, 193, 941, 212, 190, + 193, 1609, 59, 60, 212, 168, 1144, 193, 116, 117, + 193, 468, 212, 193, 193, 193, 124, 193, 126, 127, + 128, 129, 193, 193, 193, 135, 134, 168, 212, 211, + 168, 168, 193, 210, 1585, 193, 193, 212, 168, 193, + 193, 180, 193, 161, 1412, 212, 193, 193, 193, 193, + 1454, 1550, 1551, 1457, 122, 36, 212, 212, 126, 180, + 212, 180, 1670, 212, 212, 122, 9, 180, 125, 126, + 1384, 180, 212, 215, 1212, 1214, 32, 180, 135, 180, + 180, 65, 210, 212, 179, 212, 193, 195, 196, 197, + 198, 199, 42, 213, 193, 168, 168, 211, 180, 179, + 1599, 209, 210, 59, 60, 179, 189, 212, 179, 42, + 212, 186, 180, 130, 193, 193, 193, 13, 186, 576, + 188, 187, 189, 180, 192, 161, 194, 195, 186, 215, + 187, 188, 178, 12, 1078, 192, 186, 1505, 195, 158, + 168, 7, 210, 1511, 168, 194, 1090, 168, 216, 213, + 168, 213, 168, 210, 186, 186, 1294, 212, 1472, 216, + 211, 1300, 32, 1531, 179, 179, 122, 168, 213, 125, + 126, 1539, 212, 212, 212, 1119, 1120, 1121, 1294, 135, + 213, 193, 376, 193, 1, 212, 643, 212, 179, 59, + 60, 66, 386, 180, 168, 194, 194, 194, 42, 212, + 1144, 395, 213, 212, 212, 168, 213, 213, 212, 211, + 213, 405, 180, 213, 168, 211, 673, 212, 211, 213, + 168, 415, 168, 168, 193, 213, 1594, 212, 1367, 212, + 424, 187, 188, 212, 212, 1549, 192, 32, 168, 195, + 434, 168, 212, 180, 1383, 212, 1384, 211, 1386, 168, + 444, 213, 122, 211, 210, 449, 126, 451, 211, 32, + 216, 471, 472, 473, 59, 60, 460, 168, 1212, 194, + 1386, 212, 212, 212, 468, 469, 470, 212, 69, 213, + 737, 738, 739, 740, 741, 742, 743, 744, 212, 483, + 212, 212, 212, 750, 751, 212, 194, 491, 213, 756, + 494, 194, 1441, 497, 498, 499, 500, 501, 765, 766, + 212, 521, 212, 770, 771, 772, 510, 774, 188, 180, + 212, 212, 192, 213, 194, 195, 32, 122, 213, 213, + 213, 126, 52, 211, 1472, 186, 179, 179, 548, 179, + 210, 180, 211, 211, 211, 802, 216, 1485, 186, 213, + 1294, 32, 179, 59, 60, 213, 32, 213, 213, 213, + 213, 211, 738, 739, 740, 741, 742, 743, 744, 1485, + 701, 212, 79, 1, 750, 751, 213, 213, 59, 60, + 756, 44, 576, 59, 60, 133, 82, 1464, 795, 765, + 766, 848, 1465, 188, 770, 771, 772, 192, 774, 194, + 195, 225, 948, 1465, 1465, 1465, 1465, 1, 1547, 1441, + 604, 1549, 969, 1381, 1404, 210, 122, 1493, 1407, 1269, + 126, 216, 1494, 428, 560, 52, 1573, -1, 1452, 1185, + 693, 494, -1, -1, -1, -1, -1, 647, -1, -1, + 1384, 122, 1386, -1, -1, 126, 122, -1, 440, 643, + 126, 440, -1, -1, -1, -1, 650, 651, -1, 653, + -1, -1, -1, -1, 658, 675, -1, -1, -1, -1, + 664, -1, -1, -1, -1, -1, -1, -1, -1, 673, + -1, -1, 188, -1, -1, -1, 192, -1, 194, 195, + 684, 685, 686, 687, 688, 689, -1, 691, -1, 693, + -1, -1, -1, -1, 210, 1644, -1, 188, -1, -1, + 216, 192, 188, 194, 195, -1, 192, -1, 194, 195, + -1, -1, -1, 733, -1, -1, 20, 21, 1472, 210, + -1, -1, -1, -1, 210, 216, -1, -1, -1, -1, + 216, 1485, -1, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, -1, -1, 749, 750, 751, 752, 753, + 754, -1, 756, 757, -1, 759, 760, 761, 762, 763, + 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, + 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 1536, 787, 804, -1, -1, 791, -1, -1, + -1, -1, -1, -1, -1, 1549, -1, -1, 802, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1022, -1, 1024, 1540, -1, -1, -1, 1029, -1, 1031, - -1, 1033, -1, -1, 1036, -1, -1, -1, 640, -1, - -1, 1375, -1, 1377, -1, 647, 648, -1, 650, -1, - -1, -1, -1, 655, -1, -1, -1, -1, -1, 661, - -1, -1, -1, -1, -1, 188, 1068, -1, 670, 192, - -1, 194, 195, -1, -1, -1, -1, -1, -1, 681, - 682, 683, 684, 685, 686, -1, 688, 210, 690, -1, - -1, -1, -1, 216, -1, -1, -1, 1099, -1, -1, - -1, -1, -1, -1, -1, 1634, -1, 11, -1, -1, - -1, -1, -1, -1, -1, -1, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1463, - -1, -1, 734, 735, 736, 737, 738, 739, 740, 741, - 742, 743, 1476, -1, 746, 747, 748, 749, 750, 751, - -1, 753, 754, -1, 756, 757, 758, 759, 760, 761, - 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, - 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, - 782, -1, 784, -1, -1, -1, 788, -1, -1, -1, - -1, -1, -1, 1527, -1, -1, -1, 799, -1, -1, - -1, -1, -1, -1, -1, -1, 1540, -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, 122, 123, - 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, - 134, -1, 136, 137, -1, -1, 838, -1, 142, 143, - 144, -1, -1, 845, 148, -1, -1, -1, -1, -1, - 852, 1585, 854, -1, -1, -1, -1, -1, -1, -1, - -1, 863, 864, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 877, 878, 879, 880, -1, - -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, + 124, 32, 126, 127, 128, 129, -1, -1, -1, -1, + 134, -1, 136, 137, -1, -1, -1, 841, -1, 1593, + -1, -1, -1, -1, 848, -1, -1, -1, 59, 60, + -1, 855, -1, 857, -1, -1, -1, -1, -1, -1, + -1, -1, 866, 867, 868, 869, 870, 871, 872, 873, + 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, + -1, -1, -1, -1, -1, -1, -1, 907, 192, 193, + 194, 195, 196, 197, 198, 199, -1, 917, 32, -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, -1, - -1, -1, -1, 1198, 916, 917, -1, -1, -1, 1321, - -1, 4, 5, -1, -1, -1, -1, -1, 930, -1, - 932, 14, 15, 16, 17, 18, -1, 939, -1, -1, - 942, 24, -1, 26, -1, 947, -1, 30, -1, 32, - -1, -1, -1, -1, 956, 38, -1, -1, -1, -1, - -1, 44, -1, -1, 47, -1, -1, 50, -1, 52, - -1, 54, -1, -1, -1, -1, 59, 60, -1, -1, - -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, - -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, - 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, - 103, -1, -1, -1, -1, -1, -1, 32, -1, -1, - -1, -1, 32, 116, 117, -1, -1, -1, -1, 122, - -1, -1, -1, 126, -1, -1, -1, -1, 1050, -1, - -1, -1, 1054, -1, 59, 60, -1, -1, 141, 59, - 60, -1, -1, -1, -1, -1, 149, 150, 151, 152, - 153, -1, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, - -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, + -1, 122, -1, -1, -1, 126, 920, 921, -1, -1, + -1, -1, -1, -1, -1, 59, 60, -1, -1, -1, + 934, -1, 936, -1, -1, -1, -1, -1, 1205, 943, + -1, -1, 946, -1, -1, -1, -1, 951, -1, -1, + -1, -1, -1, -1, -1, -1, 960, -1, -1, -1, + -1, -1, -1, 983, 984, 985, -1, -1, 988, 32, + 990, -1, 992, -1, 994, -1, 996, 188, 998, -1, + 1000, 192, 1002, 194, 195, -1, -1, 1007, 122, 1009, + -1, -1, 126, -1, -1, 1015, 59, 60, -1, 210, + -1, -1, -1, -1, -1, 216, -1, 1027, -1, 1029, + -1, -1, -1, -1, 1034, -1, 1036, -1, 1038, -1, + -1, 1041, -1, -1, -1, -1, -1, -1, -1, 12, + -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, + -1, 24, -1, -1, -1, -1, -1, 30, -1, -1, + -1, 1055, -1, 1073, 188, 1059, 32, 40, 192, 122, + 194, 195, -1, 126, -1, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 210, -1, -1, -1, + 63, -1, 216, 59, 60, 1105, -1, 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, -1, -1, -1, -1, -1, 188, -1, -1, -1, 192, - -1, -1, 195, 196, 197, -1, 199, 122, -1, 202, - 203, 126, 122, -1, -1, -1, 126, 210, -1, 212, - -1, 214, 215, 216, -1, -1, -1, -1, -1, 1141, - -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, - -1, 1163, 1164, 1165, 20, 21, -1, 1169, 59, 60, - -1, -1, -1, -1, -1, 1177, 1178, -1, -1, -1, - -1, -1, -1, 188, -1, -1, -1, 192, 188, 194, - 195, -1, 192, -1, 194, 195, 1198, -1, -1, -1, - -1, 1203, 1204, -1, -1, 210, -1, -1, 1210, -1, - 210, 216, -1, 1215, -1, -1, 216, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1229, -1, 1231, - -1, 122, -1, -1, 1236, 126, -1, -1, -1, -1, - 1242, -1, -1, -1, 1246, -1, -1, -1, -1, -1, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, -1, -1, -1, -1, 134, 135, - 136, 137, 138, 139, -1, 1287, 142, 143, 144, 145, - 146, 147, 148, -1, -1, -1, 32, 188, -1, -1, - -1, 192, -1, 194, 195, -1, -1, 1309, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 210, - -1, -1, -1, 59, 60, 216, -1, -1, -1, -1, - -1, 187, 188, -1, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 209, 210, -1, -1, -1, 214, 215, + -1, 194, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1148, -1, 122, 210, -1, -1, + 126, -1, -1, 216, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, 1170, 1171, 1172, -1, + -1, 154, 1176, -1, -1, -1, -1, -1, -1, -1, + 1184, 1185, -1, 4, 5, 168, -1, -1, -1, -1, + -1, -1, -1, 14, 15, 16, 17, 18, -1, -1, + -1, 1205, -1, 24, -1, 26, 1210, 1211, -1, 30, + -1, -1, 188, 1217, -1, -1, 192, 38, 194, 195, + -1, 1225, -1, 44, -1, -1, 47, -1, -1, 50, + -1, 214, -1, 54, 210, 1239, -1, 1241, -1, -1, + 216, -1, 1246, 64, -1, -1, 67, 68, 1252, 70, + 71, 72, 1256, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, + 101, 102, 103, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1297, -1, 116, 117, -1, -1, -1, + -1, -1, -1, -1, 125, -1, -1, -1, -1, 1329, + 131, 132, 133, 1317, -1, -1, -1, -1, -1, -1, + 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, + 151, 152, 153, -1, 155, -1, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 20, 21, -1, -1, -1, - -1, 1383, -1, 1385, -1, -1, 122, -1, 1390, -1, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, + -1, 202, 203, 20, 21, -1, -1, -1, 1392, 210, + 1394, 212, -1, 214, 215, 1399, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1413, -1, 1415, -1, -1, -1, -1, -1, -1, - -1, 1423, 1424, 1425, -1, -1, -1, -1, 1430, -1, - -1, -1, -1, 1435, -1, -1, -1, 1439, 1440, 1441, - 1442, -1, -1, 1445, 1446, -1, 1448, 1449, -1, -1, - -1, -1, 188, -1, 1456, -1, 192, -1, 194, 195, - -1, -1, -1, -1, -1, 1467, -1, -1, -1, 114, - 115, 116, 117, 118, 210, -1, 121, 122, 123, 124, - 216, 126, 127, 128, 129, -1, -1, -1, -1, 134, - -1, 136, 137, -1, -1, 1497, -1, 142, 143, 144, - -1, -1, -1, 148, -1, -1, -1, -1, -1, -1, - 1512, 1513, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1526, -1, -1, -1, -1, 1531, + -1, -1, -1, -1, -1, -1, -1, 1421, -1, -1, + 1424, -1, -1, -1, -1, -1, -1, -1, 1432, 1433, + 1434, -1, -1, -1, -1, 1439, -1, -1, -1, -1, + 1444, -1, -1, -1, 1448, 1449, 1450, 1451, -1, -1, + 1454, 1455, -1, 1457, 1458, -1, -1, -1, -1, -1, + -1, 1465, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1476, -1, -1, -1, -1, 114, 115, 116, + 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, + 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, + 137, -1, -1, 1507, -1, 142, 143, 144, -1, -1, + -1, 148, -1, -1, -1, -1, -1, 1521, 1522, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1543, 1544, 188, -1, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, -1, 1558, -1, 1560, -1, - -1, -1, -1, -1, 209, 210, -1, -1, -1, 214, - 215, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1587, -1, -1, -1, -1, - 1592, 1593, -1, -1, -1, 1, -1, -1, 4, 5, - 6, -1, 8, 9, 10, -1, 12, -1, 14, 15, - 16, 17, 18, -1, 1616, -1, 1618, 1619, 24, 25, - 26, 27, 28, -1, 30, -1, 1628, -1, -1, -1, - -1, 37, 38, -1, -1, 41, -1, 43, 44, -1, - -1, 47, -1, 49, 50, 51, -1, 53, 54, -1, - -1, 57, 58, -1, -1, -1, -1, -1, 64, -1, - -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, - -1, 97, 98, 99, 100, 101, 102, 103, 104, -1, + -1, 1535, -1, -1, -1, -1, 1540, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1552, 1553, + -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, -1, 1568, 1569, -1, -1, -1, -1, + -1, -1, 209, 210, -1, -1, -1, 214, 215, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 131, 132, 133, -1, -1, - -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, - -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, - -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, - -1, -1, 178, 179, 180, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, - 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, - -1, -1, -1, -1, 210, -1, 212, 1, 214, 215, - 4, 5, 6, -1, 8, 9, 10, -1, 12, -1, - 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, - 24, 25, 26, 27, 28, -1, 30, -1, -1, -1, - -1, -1, -1, 37, 38, -1, -1, 41, -1, 43, - 44, -1, -1, 47, -1, 49, 50, 51, -1, 53, - 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, - 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, - 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, - 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 131, 132, 133, - -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, - -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, - 32, 155, -1, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, - -1, -1, -1, -1, 178, 179, 180, 59, 60, -1, + -1, 1595, -1, -1, -1, -1, 1600, 1601, -1, -1, + -1, -1, 1, -1, -1, 4, 5, 6, -1, 8, + 9, 10, -1, 12, -1, 14, 15, 16, 17, 18, + -1, 1625, -1, 1627, 1628, 24, 25, 26, 27, 28, + -1, 30, -1, -1, 1638, -1, -1, -1, 37, 38, + -1, -1, 41, -1, 43, 44, -1, -1, 47, -1, + 49, 50, 51, -1, 53, 54, -1, -1, 57, 58, + -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, + -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, + 99, 100, 101, 102, 103, 104, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, - -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, - 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, + -1, -1, 131, 132, 133, -1, -1, -1, -1, -1, + -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, + 149, 150, 151, 152, 153, -1, 155, -1, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, + 179, 180, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, + 199, -1, -1, 202, 203, -1, -1, -1, -1, -1, + -1, 210, -1, 212, 1, 214, 215, 4, 5, 6, + -1, 8, 9, 10, -1, 12, -1, 14, 15, 16, + 17, 18, -1, -1, -1, -1, -1, 24, 25, 26, + 27, 28, -1, 30, -1, -1, -1, -1, -1, -1, + 37, 38, -1, -1, 41, -1, 43, 44, -1, -1, + 47, -1, 49, 50, 51, -1, 53, 54, -1, -1, + 57, 58, -1, -1, -1, -1, -1, 64, -1, -1, + 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, + 97, 98, 99, 100, 101, 102, 103, 104, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 131, 132, 133, -1, -1, -1, + -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, + -1, -1, 149, 150, 151, 152, 153, 32, 155, -1, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, + -1, 178, 179, 180, 59, 60, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, + 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, + 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, + 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, + -1, 26, -1, -1, -1, 30, -1, 32, -1, -1, + -1, -1, -1, 38, -1, -1, -1, 122, -1, 44, + -1, 126, 47, -1, -1, 50, -1, 52, -1, 54, + -1, -1, -1, -1, 59, 60, -1, -1, -1, 64, + -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, + -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, + -1, -1, -1, 188, -1, -1, -1, 192, -1, 194, + 195, 116, 117, -1, -1, -1, -1, 122, -1, -1, + -1, 126, -1, -1, -1, 210, -1, -1, -1, -1, + -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, + -1, -1, -1, -1, 149, 150, 151, 152, 153, 32, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, + -1, -1, -1, 178, -1, -1, 59, 60, -1, -1, + -1, -1, -1, 188, -1, -1, -1, 192, -1, -1, + 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, + -1, -1, 4, 5, -1, 210, -1, 212, -1, 214, + 215, 216, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, - 32, -1, -1, -1, -1, -1, 38, -1, -1, -1, - 122, -1, 44, -1, 126, 47, -1, -1, 50, -1, + 32, -1, -1, -1, -1, -1, 38, -1, -1, 122, + -1, -1, 44, 126, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, 59, 60, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, - 102, 103, -1, -1, -1, -1, 188, -1, -1, -1, - 192, -1, 194, 195, 116, 117, -1, -1, -1, -1, - 122, -1, -1, -1, 126, -1, -1, -1, 210, -1, - -1, -1, -1, -1, 216, -1, -1, -1, -1, 141, + 102, 103, -1, -1, -1, 188, -1, -1, -1, 192, + -1, 194, 195, -1, 116, 117, -1, -1, -1, -1, + 122, -1, -1, -1, 126, -1, -1, 210, -1, -1, + -1, -1, -1, 216, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, 32, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, @@ -3535,17 +3564,17 @@ static const yytype_int16 yycheck[] = 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, - 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, + 24, 25, 26, 27, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, 122, -1, - 44, -1, 126, 47, -1, -1, 50, -1, -1, -1, + 44, -1, 126, 47, -1, -1, 50, 51, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, - -1, -1, -1, -1, 188, -1, -1, -1, 192, -1, + 104, -1, -1, -1, 188, -1, -1, -1, 192, -1, 194, 195, 116, 117, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, 210, 131, 132, 133, + -1, -1, -1, -1, -1, -1, 210, -1, -1, -1, -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, 32, 155, -1, 157, 158, 159, 160, 161, 162, 163, @@ -3555,18 +3584,18 @@ static const yytype_int16 yycheck[] = -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, - -1, -1, 24, 25, 26, 27, -1, -1, 30, -1, + -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, - 122, -1, 44, -1, 126, 47, -1, -1, 50, 51, + 122, -1, 44, -1, 126, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, - 102, 103, 104, -1, -1, -1, 188, -1, -1, -1, + 102, 103, -1, -1, -1, -1, 188, -1, -1, -1, 192, -1, 194, 195, 116, 117, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 210, -1, - -1, -1, -1, -1, 216, -1, -1, -1, -1, 141, + -1, -1, -1, -1, -1, -1, -1, -1, 210, 131, + 132, 133, -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, 32, 155, -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, @@ -3579,75 +3608,75 @@ static const yytype_int16 yycheck[] = 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, 122, -1, 44, -1, 126, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, + -1, -1, -1, -1, 64, -1, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, 188, -1, -1, -1, 192, -1, 194, 195, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 210, 131, 132, 133, -1, -1, 216, -1, -1, -1, + 210, -1, -1, -1, -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, - 150, 151, 152, 153, 32, 155, -1, 157, 158, 159, + 150, 151, 152, 153, 32, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, 59, 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, - 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, + 210, -1, 212, 213, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, - -1, 32, 30, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, 122, -1, 44, -1, 126, 47, - -1, -1, 50, -1, -1, -1, 54, -1, 59, 60, + -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, 188, -1, -1, -1, 192, -1, 194, 195, 116, 117, - -1, 122, -1, -1, -1, 126, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 210, 131, 132, 133, -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, - -1, 149, 150, 151, 152, 153, -1, 155, 32, 157, + -1, 149, 150, 151, 152, 153, -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, - 178, -1, -1, -1, -1, 59, 60, 188, -1, -1, - -1, 192, -1, 194, 195, -1, -1, 195, 196, 197, - -1, 199, -1, -1, 202, 203, -1, -1, -1, 210, - 4, 5, 210, -1, 212, 216, 214, 215, 12, -1, + 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, + -1, 199, -1, -1, 202, 203, -1, -1, -1, -1, + 4, 5, 210, -1, 212, -1, 214, 215, 12, -1, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, - 24, -1, 26, -1, -1, 32, 30, -1, -1, -1, - -1, -1, -1, -1, 38, -1, -1, -1, 122, -1, - 44, -1, 126, 47, 48, -1, 50, -1, -1, -1, - 54, -1, 59, 60, -1, -1, -1, -1, -1, -1, + 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, + -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, + 44, -1, -1, 47, 48, -1, 50, -1, -1, -1, + 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, - -1, -1, -1, -1, 188, -1, -1, -1, 192, -1, - 194, 195, 116, 117, -1, 122, -1, -1, -1, 126, - -1, -1, -1, -1, -1, -1, 210, -1, -1, -1, - -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, - -1, 155, 32, 157, 158, 159, 160, 161, 162, 163, + -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, - -1, -1, -1, -1, 178, -1, -1, -1, -1, 59, - 60, 188, -1, -1, -1, 192, -1, 194, 195, -1, + -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, - -1, -1, -1, 210, 4, 5, 210, 211, 212, 216, + -1, -1, -1, -1, 4, 5, 210, 211, 212, -1, 214, 215, 12, -1, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, - -1, -1, 122, -1, 44, -1, 126, 47, 48, -1, + -1, -1, -1, -1, 44, -1, -1, 47, 48, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, - 100, 101, 102, 103, -1, -1, -1, -1, 188, -1, - -1, -1, 192, -1, 194, 195, 116, 117, -1, -1, + 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 210, -1, -1, -1, -1, -1, 216, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, @@ -3701,7 +3730,7 @@ static const yytype_int16 yycheck[] = 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, + -1, -1, -1, -1, 64, -1, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, @@ -3716,13 +3745,13 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, - 210, -1, 212, 213, 214, 215, 14, 15, 16, 17, + 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, - 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, @@ -3730,18 +3759,18 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, - -1, 149, 150, 151, 152, 153, -1, 155, 156, 157, + -1, 149, 150, 151, 152, 153, -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, - -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, + -1, -1, 210, 211, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, + -1, -1, -1, -1, 60, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, @@ -3756,12 +3785,12 @@ static const yytype_int16 yycheck[] = -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, - 4, 5, -1, -1, 210, 211, 212, -1, 214, 215, + 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, - 54, -1, -1, -1, -1, -1, 60, -1, -1, -1, + 54, -1, -1, 57, -1, -1, -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, @@ -3776,28 +3805,28 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, - -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, - 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, - -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, - -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, - -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, - -1, -1, 54, -1, -1, 57, -1, -1, -1, -1, - -1, -1, 64, -1, -1, 67, 68, -1, 70, 71, - 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, - 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, - 102, 103, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, + -1, -1, -1, -1, 4, 5, 210, -1, 212, -1, + 214, 215, 12, -1, 14, 15, 16, 17, 18, -1, + -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, + 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, + -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, + 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 64, -1, -1, 67, 68, -1, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, + 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, - -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, - 152, 153, -1, 155, -1, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, - 202, 203, -1, -1, -1, -1, 4, 5, 210, -1, - 212, -1, 214, 215, 12, -1, 14, 15, 16, 17, + -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, + 150, 151, 152, 153, -1, 155, -1, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, + -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, + 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, @@ -3815,30 +3844,30 @@ static const yytype_int16 yycheck[] = 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, - -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, - -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, - 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, - 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, - -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, - -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, - -1, 67, 68, -1, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, - -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, + -1, -1, -1, -1, -1, 193, -1, 195, 196, 197, + -1, 199, -1, -1, 202, 203, -1, -1, -1, -1, + 4, 5, 210, -1, 212, -1, 214, 215, 12, -1, + 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, + 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, + -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, + 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, + 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, + 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, - -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, - -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, - -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, 195, - 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, - -1, -1, 4, 5, 210, -1, 212, -1, 214, 215, - 12, -1, 14, 15, 16, 17, 18, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, + -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, + -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, + -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, + -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, + 214, 215, 14, 15, 16, 17, 18, -1, -1, 21, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, @@ -3859,7 +3888,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, - -1, 21, -1, -1, 24, -1, 26, -1, -1, -1, + -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, -1, -1, @@ -3878,7 +3907,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, -1, -1, - 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, + 210, -1, 212, 213, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, -1, 47, @@ -3896,9 +3925,9 @@ static const yytype_int16 yycheck[] = 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, + -1, -1, -1, -1, -1, 193, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, 4, 5, - -1, -1, 210, -1, 212, 213, 214, 215, 14, 15, + -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, 44, -1, @@ -3916,9 +3945,9 @@ static const yytype_int16 yycheck[] = -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, - 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, + 4, 5, -1, -1, 210, -1, 212, 213, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, @@ -4031,7 +4060,7 @@ static const yytype_int16 yycheck[] = 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, @@ -4039,7 +4068,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, - -1, -1, 4, 5, -1, -1, 210, -1, 212, 213, + -1, -1, 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, @@ -4091,7 +4120,7 @@ static const yytype_int16 yycheck[] = 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, -1, 157, @@ -4111,63 +4140,76 @@ static const yytype_int16 yycheck[] = 86, 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, 117, -1, 9, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, -1, -1, -1, -1, - -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, + 20, 21, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, 199, -1, -1, 202, 203, -1, -1, - 4, 5, -1, -1, 210, -1, 212, -1, 214, 215, - 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, - 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, - -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, - 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, - 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 64, -1, -1, 67, 68, -1, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, -1, 92, 93, - 94, -1, -1, 97, 98, 99, 100, 101, 102, 103, + -1, -1, -1, -1, 210, -1, 212, -1, 214, 215, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, -1, -1, -1, -1, 134, 135, + 136, 137, 138, 139, -1, -1, 142, 143, 144, 145, + 146, 147, 148, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 114, 115, 116, 117, 118, -1, + -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, + -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, + -1, 187, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 12, -1, -1, -1, -1, -1, + 18, 11, -1, 209, 210, -1, 24, -1, 214, 215, + 20, 21, 30, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + 48, 191, 192, 193, 194, 195, 196, 197, 198, 199, + -1, -1, -1, -1, -1, 63, -1, -1, -1, 209, + 210, -1, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 114, 115, 116, 117, 118, -1, + -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, + -1, -1, -1, 141, 134, -1, 136, 137, -1, -1, + -1, -1, 142, 143, 144, -1, 154, -1, 148, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, + 168, -1, -1, -1, -1, 24, -1, -1, -1, -1, + -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, 188, 48, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + -1, -1, -1, -1, 63, -1, 214, -1, -1, 209, + 210, 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, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, + -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, + 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 40, -1, 141, -1, -1, -1, -1, -1, 48, -1, + -1, -1, -1, -1, -1, 154, -1, -1, -1, -1, + -1, -1, -1, 63, -1, -1, -1, -1, -1, 168, + 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, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 214, -1, 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, - -1, -1, -1, -1, -1, 149, 150, 151, 152, 153, - -1, 155, -1, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, -1, 12, - -1, -1, -1, -1, 178, 18, -1, -1, -1, -1, - -1, 24, -1, -1, -1, -1, -1, 30, -1, -1, - -1, 195, 196, 197, -1, 199, -1, 40, 202, 203, - -1, -1, -1, -1, -1, 48, 210, -1, 212, -1, - 214, 215, -1, -1, -1, -1, -1, -1, -1, -1, - 63, -1, -1, -1, -1, -1, -1, 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, - -1, -1, -1, -1, -1, -1, -1, -1, 12, -1, - -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, - 24, -1, -1, -1, -1, -1, 30, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 40, -1, 141, -1, - -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, - -1, 154, -1, -1, -1, -1, -1, -1, -1, 63, - -1, -1, -1, -1, -1, 168, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 214, -1, 18, -1, -1, -1, -1, -1, 24, + -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 154, -1, -1, -1, -1, -1, + -1, -1, -1, 18, -1, -1, -1, -1, 168, 24, -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 40, -1, 141, -1, -1, + 180, -1, -1, -1, -1, 40, 186, -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, - 154, -1, -1, -1, -1, -1, -1, -1, 63, -1, - -1, -1, -1, -1, 168, 70, 71, 72, 73, 74, + -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, + -1, -1, -1, -1, 214, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 214, -1, 18, -1, -1, -1, -1, -1, 24, -1, + -1, -1, 18, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, 141, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, 154, @@ -4175,387 +4217,388 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 168, 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, -1, -1, -1, + 96, 97, 98, 99, 100, 101, 102, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 214, - -1, 216, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, - -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, - -1, -1, 168, 24, -1, -1, -1, -1, -1, 30, - -1, -1, -1, -1, 180, -1, -1, -1, -1, 40, - -1, -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 63, -1, -1, -1, -1, -1, 214, 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, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, - -1, -1, 24, -1, -1, -1, -1, -1, 30, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, - 141, -1, -1, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, - -1, 63, -1, 20, 21, -1, -1, 168, 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, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 214, -1, -1, -1, -1, -1, -1, + -1, -1, 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, + -1, -1, -1, 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, 214, 20, + 21, 134, 135, 136, 137, 138, 139, -1, -1, 142, + 143, 144, 145, 146, 147, 148, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 154, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, -1, 168, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, -1, -1, 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, 214, 20, 21, 134, 135, 136, 137, 138, - 139, -1, -1, 142, 143, 144, 145, 146, 147, 148, - -1, -1, -1, -1, -1, -1, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 187, 188, - -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 209, 210, -1, -1, -1, 214, 215, -1, -1, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 20, 21, -1, -1, 134, 135, 136, - 137, 138, 139, -1, -1, 142, 143, 144, 145, 146, - 147, 148, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 180, -1, -1, -1, -1, -1, -1, - 187, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, -1, 214, 215, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, -1, -1, -1, -1, 134, 135, 136, - 137, 138, 139, -1, -1, 142, 143, 144, 145, 146, - 147, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, 180, -1, -1, 148, -1, -1, -1, - 187, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, -1, 214, 215, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, 20, 21, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 20, 21, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, 20, 21, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 20, 21, - -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, - -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 187, 188, -1, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, + -1, 214, 215, -1, -1, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 20, + 21, -1, -1, 134, 135, 136, 137, 138, 139, -1, + -1, 142, 143, 144, 145, 146, 147, 148, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + -1, -1, -1, -1, -1, -1, 187, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, -1, 214, 215, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, -1, + -1, -1, -1, 134, 135, 136, 137, 138, 139, -1, + -1, 142, 143, 144, 145, 146, 147, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, 180, + -1, -1, 148, -1, -1, -1, 187, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, -1, 214, 215, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, 20, 21, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 114, 115, + 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, + 21, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 20, 21, -1, -1, -1, -1, + -1, -1, -1, 209, 210, -1, -1, 213, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, + -1, 142, 143, 144, -1, -1, -1, 148, 114, 115, + 116, 117, 118, 20, 21, 121, 122, 123, 124, -1, + 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, + 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, + -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 209, 210, 211, -1, 114, 115, 116, + 117, 118, 20, 21, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, - -1, 148, 114, 115, 116, 117, 118, 20, 21, 121, - 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, - -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, - 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, + -1, 148, -1, -1, -1, -1, -1, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 213, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 209, 210, 211, - -1, 114, 115, 116, 117, 118, 20, 21, 121, 122, + -1, -1, 209, 210, 211, -1, 114, 115, 116, 117, + 118, -1, -1, 121, 122, 123, 124, -1, 126, 127, + 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, + -1, -1, -1, -1, 142, 143, 144, -1, -1, -1, + 148, 114, 115, 116, 117, 118, 20, 21, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, -1, -1, - -1, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 209, 210, 211, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, + 193, 194, 195, 196, 197, 198, 199, 18, -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, 211, -1, - 114, 115, 116, 117, 118, -1, -1, 121, 122, 123, + 114, 115, 116, 117, 118, 20, 21, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, - 144, -1, -1, -1, 148, 114, 115, 116, 117, 118, - 20, 21, 121, 122, 123, 124, -1, 126, 127, 128, - 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, - -1, -1, -1, 142, 143, 144, -1, -1, -1, 148, + 144, -1, -1, -1, 148, -1, -1, -1, -1, 70, + 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + -1, 92, 93, 94, -1, -1, 97, 98, 99, 100, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 209, 210, 211, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, - -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 18, -1, -1, -1, -1, -1, -1, -1, -1, - 209, 210, 211, -1, 114, 115, 116, 117, 118, 20, + -1, -1, -1, -1, -1, 209, 210, 211, -1, 114, + 115, 116, 117, 118, -1, -1, 121, 122, 123, 124, + -1, 126, 127, 128, 129, 20, 21, -1, -1, 134, + -1, 136, 137, -1, -1, 156, -1, 142, 143, 144, + -1, -1, 37, 148, -1, -1, -1, 168, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 209, 210, 211, -1, -1, -1, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, -1, + -1, 126, 127, 128, -1, -1, -1, -1, -1, -1, + 135, 136, 137, 138, 139, -1, -1, 142, 143, 144, + 145, 146, 147, 148, 114, 115, 116, 117, 118, 20, 21, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, -1, -1, 148, -1, - -1, -1, -1, 70, 71, 72, -1, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, - 97, 98, 99, 100, -1, -1, -1, -1, 188, -1, + -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, -1, -1, 202, 203, -1, + -1, -1, -1, -1, 209, 210, -1, -1, 178, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, - 210, 211, -1, 114, 115, 116, 117, 118, -1, -1, - 121, 122, 123, 124, -1, 126, 127, 128, 129, 20, - 21, -1, -1, 134, -1, 136, 137, -1, -1, 156, - -1, 142, 143, 144, -1, -1, 37, 148, -1, -1, - -1, 168, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, + 210, -1, -1, 114, 115, 116, 117, 118, 20, 21, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, 140, + -1, 142, 143, 144, -1, -1, -1, 148, -1, -1, + -1, -1, -1, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, - 211, -1, -1, -1, -1, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, -1, -1, 126, 127, 128, -1, -1, - -1, -1, -1, -1, 135, 136, 137, 138, 139, -1, - -1, 142, 143, 144, 145, 146, 147, 148, 114, 115, - 116, 117, 118, 20, 21, 121, 122, 123, 124, -1, - 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, - 136, 137, -1, -1, -1, -1, 142, 143, 144, -1, - -1, -1, 148, -1, -1, -1, -1, 188, -1, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, - -1, 202, 203, -1, -1, -1, -1, -1, 209, 210, - -1, -1, 178, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 209, 210, -1, -1, 114, 115, 116, - 117, 118, 20, 21, 121, 122, 123, 124, -1, 126, + -1, -1, 114, 115, 116, 117, 118, -1, -1, 121, + 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, + -1, -1, 134, -1, 136, 137, -1, -1, 140, -1, + 142, 143, 144, 20, 21, -1, 148, 114, 115, 116, + 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, 140, -1, 142, 143, 144, -1, -1, - -1, 148, -1, -1, -1, -1, -1, 20, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 137, -1, -1, -1, -1, 142, 143, 144, 20, 21, + -1, 148, -1, -1, -1, -1, 188, -1, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, + 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, + 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, + 137, -1, -1, -1, -1, 142, 143, 144, 20, 21, + -1, 148, 114, 115, 116, 117, 118, -1, -1, 121, + 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, + -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, + 142, 143, 144, 180, -1, -1, 148, 20, 21, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, 114, 115, 116, 117, - 118, -1, -1, 121, 122, 123, 124, -1, 126, 127, - 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, - -1, -1, 140, -1, 142, 143, 144, 20, 21, -1, - 148, 114, 115, 116, 117, 118, -1, -1, 121, 122, + -1, -1, 209, 210, 176, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, + -1, -1, 114, 115, 116, 117, 118, 209, 210, 121, + 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, + -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, + 142, 143, 144, -1, -1, -1, 148, 20, 21, -1, + -1, 114, 115, 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, - -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, - 143, 144, 20, 21, -1, 148, -1, -1, -1, -1, - 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 188, 189, 190, 191, 192, + -1, 134, -1, 136, 137, -1, -1, -1, 180, 142, + 143, 144, 20, 21, -1, 148, 188, -1, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, + -1, -1, -1, -1, -1, -1, -1, 180, -1, -1, + -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, @@ -4566,8 +4609,8 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, 142, 143, 144, 180, -1, -1, 148, 20, 21, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 209, 210, 176, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, + -1, -1, 180, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, 127, @@ -4580,7 +4623,7 @@ static const yytype_int16 yycheck[] = 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, - -1, 180, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, 127, 128, @@ -4589,95 +4632,58 @@ static const yytype_int16 yycheck[] = 114, 115, 116, 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, - 144, 180, -1, -1, 148, 20, 21, -1, -1, 188, + 144, 20, 21, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 209, 210, -1, -1, -1, -1, 180, -1, -1, -1, + 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, - 134, -1, 136, 137, -1, -1, -1, -1, 142, 143, - 144, -1, -1, -1, 148, 20, 21, -1, -1, 114, - 115, 116, 117, 118, -1, -1, 121, 122, 123, 124, - -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, - -1, 136, 137, -1, -1, -1, 180, 142, 143, 144, - 20, 21, -1, 148, 188, -1, 190, 191, 192, 193, + 134, -1, 136, 137, -1, -1, -1, -1, 142, -1, + 144, 20, 21, -1, -1, 114, 115, 116, 117, 118, + -1, -1, 121, 122, 123, 124, -1, 126, 127, 128, + 129, -1, -1, -1, -1, 134, -1, 136, 137, 20, + 21, -1, -1, 142, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, - 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, - -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, - -1, 136, 137, -1, -1, -1, -1, 142, 143, 144, - 20, 21, -1, 148, 114, 115, 116, 117, 118, -1, - -1, 121, 122, 123, 124, -1, 126, 127, 128, 129, - -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, - -1, -1, 142, 143, 144, 20, 21, -1, -1, -1, - -1, -1, -1, 188, -1, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - -1, -1, -1, -1, 114, 115, 116, 117, 118, 209, - 210, 121, 122, 123, 124, -1, 126, 127, 128, 129, - -1, -1, -1, -1, 134, -1, 136, 137, -1, -1, - -1, -1, 142, -1, 144, 20, 21, -1, -1, 114, - 115, 116, 117, 118, -1, -1, 121, 122, 123, 124, - -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, - -1, 136, 137, 20, 21, -1, -1, 142, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, - 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, -1, -1, -1, -1, 114, - 115, 116, 117, 118, 209, 210, 121, 122, 123, 124, - -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, - -1, 136, 137, 20, 21, -1, -1, 114, 115, 116, - 117, 118, -1, -1, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, - -1, -1, -1, -1, 191, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, 114, 115, 116, - 117, 118, 209, 210, 121, 122, 123, 124, -1, 126, - 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, - 137, -1, -1, -1, -1, 114, 115, 116, 117, 118, - -1, -1, 121, 122, 123, 124, -1, 126, 127, 128, + -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, -1, -1, -1, -1, 114, 115, 116, 117, 118, + 209, 210, 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, -1, -1, -1, 134, -1, 136, 137, -1, + -1, -1, -1, 114, 115, 116, 117, 118, -1, -1, + 121, 122, 123, 124, -1, 126, 127, 128, 129, -1, + -1, -1, -1, 134, -1, 136, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 18, -1, -1, -1, -1, 192, 193, 194, 195, 196, - 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, - -1, 18, -1, -1, 193, 194, 195, 196, 197, 198, + -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, + -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 209, 210, 70, 71, 72, -1, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, -1, 92, 93, 94, -1, -1, 97, - 98, 99, 100, 70, 71, 72, -1, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, -1, 92, 93, 94, -1, -1, - 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 156, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 70, -1, 72, -1, 74, 75, 76, 77, 78, 156, + 209, 210, -1, -1, -1, -1, -1, -1, -1, 18, + -1, -1, 193, 194, 195, 196, 197, 198, 199, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 168, 92, 93, 94, -1, -1, 97, 98, 99, - 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, + 90, -1, 92, 93, 94, -1, -1, 97, 98, 99, + 100, 70, 71, 72, -1, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, -1, 92, 93, 94, -1, -1, 97, 98, + 99, 100, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 156, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 168, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, + 72, -1, 74, 75, 76, 77, 78, 156, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 168, + 92, 93, 94, -1, -1, 97, 98, 99, 100, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 168 + -1, -1, -1, -1, -1, -1, 168 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -4686,171 +4692,172 @@ static const yytype_int16 yystos[] = { 0, 218, 0, 6, 29, 31, 33, 39, 49, 55, 79, 101, 102, 180, 199, 210, 219, 222, 228, 230, - 231, 236, 266, 270, 303, 381, 388, 392, 403, 447, - 452, 457, 18, 19, 168, 258, 259, 260, 161, 237, - 238, 168, 169, 170, 199, 232, 233, 234, 178, 389, - 168, 214, 221, 56, 62, 384, 384, 384, 141, 168, - 289, 33, 62, 134, 203, 212, 262, 263, 264, 265, - 289, 180, 4, 5, 7, 35, 400, 61, 379, 187, - 186, 189, 186, 233, 21, 56, 198, 209, 235, 384, - 385, 387, 385, 379, 458, 448, 453, 168, 141, 229, + 231, 236, 266, 270, 304, 382, 389, 393, 404, 449, + 454, 459, 18, 19, 168, 258, 259, 260, 161, 237, + 238, 168, 169, 170, 199, 232, 233, 234, 178, 390, + 168, 214, 221, 56, 62, 385, 385, 385, 141, 168, + 290, 33, 62, 134, 203, 212, 262, 263, 264, 265, + 290, 180, 4, 5, 7, 35, 401, 61, 380, 187, + 186, 189, 186, 233, 21, 56, 198, 209, 235, 385, + 386, 388, 386, 380, 460, 450, 455, 168, 141, 229, 264, 264, 264, 212, 142, 143, 144, 186, 211, 56, - 62, 271, 273, 56, 62, 390, 56, 62, 401, 56, - 62, 380, 14, 15, 161, 166, 168, 171, 212, 224, - 259, 161, 238, 168, 232, 232, 168, 180, 179, 385, + 62, 271, 273, 56, 62, 391, 56, 62, 402, 56, + 62, 381, 14, 15, 161, 166, 168, 171, 212, 224, + 259, 161, 238, 168, 232, 232, 168, 180, 179, 386, 180, 56, 62, 220, 168, 168, 168, 168, 172, 227, - 213, 260, 264, 264, 264, 264, 274, 168, 391, 404, - 178, 382, 172, 173, 223, 14, 15, 161, 166, 168, - 224, 256, 257, 235, 386, 180, 459, 449, 454, 172, + 213, 260, 264, 264, 264, 264, 274, 168, 392, 405, + 178, 383, 172, 173, 223, 14, 15, 161, 166, 168, + 224, 256, 257, 235, 387, 180, 461, 451, 456, 172, 213, 34, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 97, 98, 99, 100, 116, 117, 168, - 269, 272, 178, 189, 105, 398, 399, 377, 158, 215, - 261, 353, 172, 173, 174, 186, 213, 187, 178, 178, + 269, 272, 178, 189, 105, 399, 400, 378, 158, 215, + 261, 354, 172, 173, 174, 186, 213, 187, 178, 178, 178, 20, 21, 37, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 126, 127, 128, 135, 136, 137, 138, 139, 142, 143, 144, 145, 146, 147, 148, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 202, 203, - 209, 210, 34, 34, 212, 267, 178, 275, 393, 74, - 78, 92, 93, 97, 98, 99, 100, 408, 168, 405, - 179, 378, 260, 259, 215, 150, 168, 375, 376, 256, - 18, 24, 30, 40, 48, 63, 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, 154, - 214, 289, 407, 409, 410, 413, 418, 446, 460, 450, - 455, 168, 168, 168, 211, 21, 168, 211, 153, 213, - 353, 363, 364, 189, 268, 278, 383, 178, 189, 397, - 178, 402, 353, 211, 259, 212, 42, 186, 189, 192, - 374, 193, 193, 193, 212, 193, 193, 212, 193, 193, - 193, 193, 193, 193, 212, 289, 32, 59, 60, 122, - 126, 188, 192, 195, 210, 216, 417, 190, 412, 367, - 370, 168, 135, 212, 6, 49, 302, 180, 213, 446, - 1, 4, 5, 8, 9, 10, 12, 14, 15, 16, - 17, 18, 24, 25, 26, 27, 28, 30, 37, 38, - 41, 43, 44, 47, 50, 51, 53, 54, 57, 58, - 64, 67, 68, 79, 101, 102, 103, 104, 116, 117, - 131, 132, 133, 149, 150, 151, 152, 153, 155, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 169, 170, 171, 178, 179, 180, 195, 196, 197, 202, - 203, 210, 212, 214, 215, 226, 228, 239, 240, 243, - 246, 247, 249, 251, 252, 253, 254, 276, 277, 279, - 283, 288, 289, 290, 294, 295, 296, 297, 298, 299, - 300, 301, 303, 307, 308, 315, 318, 321, 326, 329, - 330, 332, 333, 334, 336, 341, 344, 345, 352, 407, - 462, 476, 487, 491, 504, 507, 168, 180, 394, 395, - 289, 359, 376, 211, 64, 103, 169, 283, 345, 168, - 168, 418, 125, 135, 187, 373, 419, 424, 426, 345, - 428, 422, 168, 414, 430, 432, 434, 436, 438, 440, - 442, 444, 345, 193, 212, 32, 192, 32, 192, 210, - 216, 211, 345, 210, 216, 418, 168, 180, 461, 168, - 180, 365, 446, 451, 168, 180, 368, 456, 345, 150, - 168, 372, 406, 363, 193, 193, 345, 250, 193, 291, - 409, 462, 212, 289, 193, 4, 101, 102, 193, 212, - 125, 288, 319, 330, 345, 275, 193, 212, 60, 345, - 212, 345, 168, 193, 193, 212, 180, 193, 161, 57, - 345, 212, 275, 193, 212, 193, 193, 212, 193, 193, - 125, 288, 345, 345, 345, 215, 275, 321, 325, 325, - 325, 212, 212, 212, 212, 212, 212, 12, 418, 12, - 418, 12, 345, 486, 502, 193, 345, 193, 225, 12, - 486, 503, 36, 345, 345, 345, 345, 345, 12, 48, - 319, 345, 319, 215, 180, 180, 345, 9, 321, 327, - 168, 212, 180, 180, 180, 180, 180, 65, 304, 266, - 130, 180, 20, 21, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 134, 135, - 136, 137, 138, 139, 142, 143, 144, 145, 146, 147, - 148, 187, 188, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 209, 210, 327, 212, 180, 187, 179, - 383, 179, 210, 266, 360, 193, 213, 42, 180, 373, - 288, 345, 446, 446, 416, 446, 213, 446, 446, 213, - 168, 411, 446, 267, 446, 267, 446, 267, 365, 366, - 368, 369, 213, 421, 280, 319, 211, 211, 345, 180, - 179, 189, 180, 179, 189, 180, 179, 213, 212, 42, - 125, 186, 187, 189, 192, 371, 477, 479, 275, 406, - 292, 212, 289, 193, 212, 316, 193, 193, 193, 498, - 319, 288, 319, 186, 106, 107, 108, 109, 110, 111, - 112, 113, 119, 120, 125, 138, 139, 145, 146, 147, - 187, 13, 418, 503, 345, 345, 275, 187, 309, 311, - 345, 313, 189, 161, 345, 500, 319, 483, 488, 319, - 481, 418, 288, 345, 215, 266, 345, 345, 345, 345, - 345, 345, 406, 52, 156, 168, 195, 210, 212, 345, - 463, 466, 469, 485, 490, 406, 212, 466, 490, 406, - 140, 179, 180, 181, 470, 284, 275, 286, 174, 175, - 223, 406, 186, 506, 178, 406, 12, 186, 506, 506, - 150, 155, 193, 289, 335, 275, 248, 328, 210, 213, - 319, 463, 465, 158, 212, 306, 376, 158, 324, 325, - 18, 156, 168, 407, 18, 156, 168, 407, 131, 132, - 133, 276, 331, 345, 331, 345, 331, 345, 331, 345, - 331, 345, 331, 345, 331, 345, 331, 345, 345, 345, - 345, 331, 345, 331, 345, 345, 345, 345, 168, 331, - 345, 345, 156, 168, 345, 345, 345, 407, 345, 345, - 345, 331, 345, 331, 345, 345, 345, 345, 331, 345, - 331, 345, 331, 345, 345, 331, 345, 21, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 127, - 128, 156, 168, 209, 210, 342, 345, 213, 319, 345, - 396, 265, 7, 353, 358, 418, 168, 288, 345, 180, - 194, 194, 194, 180, 194, 194, 180, 194, 194, 268, - 194, 268, 194, 268, 180, 194, 180, 194, 282, 446, - 213, 211, 446, 446, 345, 168, 168, 446, 288, 345, - 418, 418, 19, 446, 69, 319, 465, 475, 193, 345, - 168, 345, 446, 492, 494, 496, 418, 506, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 275, 180, 194, 506, - 213, 255, 418, 418, 213, 418, 213, 418, 506, 418, - 418, 506, 418, 194, 324, 213, 213, 213, 213, 213, - 213, 19, 325, 212, 135, 371, 210, 345, 213, 140, - 186, 180, 469, 183, 184, 211, 473, 186, 180, 183, - 211, 472, 19, 213, 469, 179, 182, 471, 19, 345, - 179, 486, 282, 282, 345, 19, 486, 179, 278, 19, - 406, 211, 213, 212, 212, 337, 339, 11, 22, 23, - 241, 242, 345, 266, 463, 186, 213, 213, 168, 305, - 305, 125, 135, 187, 192, 322, 323, 267, 193, 212, - 193, 212, 325, 325, 325, 212, 212, 211, 18, 156, - 168, 407, 189, 156, 168, 345, 212, 212, 156, 168, - 345, 1, 211, 213, 180, 179, 211, 56, 62, 356, - 66, 357, 180, 194, 180, 420, 425, 427, 446, 429, - 423, 168, 415, 431, 194, 435, 194, 439, 194, 365, - 443, 368, 445, 180, 194, 213, 42, 371, 194, 194, - 319, 194, 168, 465, 213, 213, 213, 168, 213, 180, - 194, 213, 194, 418, 418, 418, 194, 213, 418, 212, - 213, 345, 194, 194, 194, 194, 213, 194, 194, 213, - 194, 324, 267, 212, 319, 345, 345, 345, 466, 469, - 345, 156, 168, 463, 473, 211, 345, 485, 211, 319, - 466, 179, 182, 185, 474, 211, 319, 194, 194, 176, - 319, 179, 319, 19, 345, 345, 418, 267, 275, 345, - 11, 244, 324, 211, 210, 186, 211, 213, 168, 168, - 168, 168, 186, 211, 268, 346, 345, 348, 345, 213, - 319, 345, 193, 212, 345, 212, 211, 345, 213, 319, - 212, 211, 343, 180, 46, 357, 45, 105, 354, 324, - 433, 437, 441, 446, 212, 168, 345, 478, 480, 275, - 293, 213, 180, 194, 168, 212, 317, 194, 194, 194, - 499, 194, 503, 310, 312, 314, 501, 484, 489, 482, - 212, 327, 268, 213, 319, 180, 213, 469, 473, 212, - 135, 371, 180, 469, 211, 180, 285, 287, 180, 180, - 319, 213, 213, 194, 268, 275, 245, 180, 267, 213, - 463, 168, 211, 189, 374, 322, 211, 140, 275, 320, - 418, 213, 446, 213, 213, 213, 350, 345, 345, 213, - 213, 345, 32, 355, 354, 356, 280, 212, 212, 168, - 345, 194, 345, 493, 495, 497, 212, 212, 506, 345, - 345, 345, 212, 69, 475, 212, 212, 213, 345, 320, - 213, 345, 135, 371, 473, 345, 345, 345, 345, 474, - 486, 345, 212, 281, 486, 345, 180, 338, 194, 242, - 25, 104, 246, 295, 296, 297, 299, 345, 268, 211, - 189, 374, 418, 373, 125, 345, 194, 194, 446, 213, - 213, 213, 361, 355, 372, 213, 475, 475, 194, 213, - 212, 213, 212, 212, 212, 319, 503, 213, 319, 475, - 463, 464, 213, 180, 505, 345, 345, 213, 505, 505, - 280, 505, 505, 345, 335, 340, 125, 125, 345, 275, - 213, 418, 373, 373, 345, 345, 347, 349, 194, 272, - 362, 212, 463, 467, 468, 468, 345, 345, 475, 475, - 464, 506, 506, 506, 468, 213, 52, 211, 135, 371, - 179, 179, 213, 179, 211, 505, 335, 345, 373, 345, - 345, 180, 351, 180, 272, 463, 186, 506, 213, 213, - 213, 213, 468, 468, 213, 213, 213, 213, 213, 345, - 211, 345, 345, 211, 179, 211, 345, 180, 180, 275, - 213, 212, 213, 213, 180, 463, 213 + 209, 210, 34, 34, 212, 267, 178, 275, 394, 74, + 78, 92, 93, 97, 98, 99, 100, 409, 168, 406, + 179, 379, 260, 259, 180, 215, 150, 168, 376, 377, + 256, 18, 24, 30, 40, 48, 63, 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, + 154, 214, 290, 408, 410, 411, 414, 420, 448, 462, + 452, 457, 168, 168, 168, 211, 21, 168, 211, 153, + 213, 354, 364, 365, 189, 268, 278, 384, 178, 189, + 398, 178, 403, 354, 211, 259, 212, 42, 186, 189, + 192, 375, 193, 193, 193, 212, 193, 193, 212, 193, + 193, 193, 193, 193, 193, 212, 290, 32, 59, 60, + 122, 126, 188, 192, 195, 210, 216, 419, 190, 413, + 368, 371, 168, 135, 212, 6, 49, 303, 180, 213, + 448, 1, 4, 5, 8, 9, 10, 12, 14, 15, + 16, 17, 18, 24, 25, 26, 27, 28, 30, 37, + 38, 41, 43, 44, 47, 50, 51, 53, 54, 57, + 58, 64, 67, 68, 79, 101, 102, 103, 104, 116, + 117, 131, 132, 133, 149, 150, 151, 152, 153, 155, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 169, 170, 171, 178, 179, 180, 195, 196, 197, + 202, 203, 210, 212, 214, 215, 226, 228, 239, 240, + 243, 246, 247, 249, 251, 252, 253, 254, 276, 277, + 279, 284, 289, 290, 291, 295, 296, 297, 298, 299, + 300, 301, 302, 304, 308, 309, 316, 319, 322, 327, + 330, 331, 333, 334, 335, 337, 342, 345, 346, 353, + 408, 464, 479, 490, 494, 507, 510, 168, 180, 395, + 396, 290, 360, 377, 211, 64, 103, 169, 284, 346, + 168, 168, 420, 125, 135, 187, 374, 421, 426, 428, + 346, 430, 424, 168, 415, 432, 434, 436, 438, 440, + 442, 444, 446, 346, 193, 212, 32, 192, 32, 192, + 210, 216, 211, 346, 210, 216, 420, 168, 180, 463, + 168, 180, 186, 366, 417, 448, 453, 168, 369, 417, + 458, 346, 150, 168, 373, 407, 364, 193, 193, 346, + 250, 193, 292, 410, 464, 212, 290, 193, 4, 101, + 102, 193, 212, 125, 289, 320, 331, 346, 275, 193, + 212, 60, 346, 212, 346, 168, 193, 193, 212, 180, + 193, 161, 57, 346, 212, 275, 193, 212, 193, 193, + 212, 193, 193, 125, 289, 346, 346, 346, 215, 275, + 322, 326, 326, 326, 212, 212, 212, 212, 212, 212, + 12, 420, 12, 420, 12, 346, 489, 505, 193, 346, + 193, 225, 12, 489, 506, 36, 346, 346, 346, 346, + 346, 12, 48, 320, 346, 320, 215, 180, 180, 346, + 9, 322, 328, 168, 212, 180, 180, 180, 180, 180, + 65, 305, 266, 130, 180, 20, 21, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 134, 135, 136, 137, 138, 139, 142, 143, 144, + 145, 146, 147, 148, 187, 188, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 209, 210, 328, 212, + 180, 187, 179, 384, 179, 210, 266, 361, 193, 213, + 42, 180, 374, 289, 346, 448, 448, 418, 448, 213, + 448, 448, 213, 168, 412, 448, 267, 448, 267, 448, + 267, 366, 367, 369, 370, 213, 423, 280, 320, 211, + 211, 346, 180, 179, 189, 417, 179, 189, 417, 179, + 213, 212, 42, 125, 186, 187, 189, 192, 372, 480, + 482, 275, 407, 293, 212, 290, 193, 212, 317, 193, + 193, 193, 501, 320, 289, 320, 186, 106, 107, 108, + 109, 110, 111, 112, 113, 119, 120, 125, 138, 139, + 145, 146, 147, 187, 13, 420, 282, 506, 346, 346, + 275, 187, 310, 312, 346, 314, 189, 161, 346, 503, + 320, 486, 491, 320, 484, 420, 289, 346, 215, 266, + 346, 346, 346, 346, 346, 346, 407, 52, 156, 168, + 195, 210, 212, 346, 465, 468, 472, 488, 493, 407, + 212, 468, 493, 407, 140, 179, 180, 181, 473, 285, + 275, 287, 174, 175, 223, 407, 186, 509, 178, 407, + 12, 186, 509, 509, 150, 155, 193, 290, 336, 275, + 248, 329, 69, 210, 213, 320, 465, 467, 158, 212, + 307, 377, 158, 325, 326, 18, 156, 168, 408, 18, + 156, 168, 408, 131, 132, 133, 276, 332, 346, 332, + 346, 332, 346, 332, 346, 332, 346, 332, 346, 332, + 346, 332, 346, 346, 346, 346, 332, 346, 332, 346, + 346, 346, 346, 168, 332, 346, 346, 156, 168, 346, + 346, 346, 408, 346, 346, 346, 332, 346, 332, 346, + 346, 346, 346, 332, 346, 332, 346, 332, 346, 346, + 332, 346, 21, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 127, 128, 156, 168, 209, 210, + 343, 346, 213, 320, 346, 397, 265, 7, 354, 359, + 420, 168, 289, 346, 180, 194, 194, 194, 417, 194, + 194, 180, 194, 194, 268, 194, 268, 194, 268, 194, + 417, 194, 417, 283, 448, 213, 509, 211, 448, 448, + 346, 168, 168, 448, 289, 346, 420, 420, 19, 448, + 69, 320, 467, 478, 193, 346, 168, 346, 448, 495, + 497, 499, 420, 509, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 275, 194, 417, 213, 509, 213, 255, 420, + 420, 213, 420, 213, 420, 509, 420, 420, 509, 420, + 194, 325, 213, 213, 213, 213, 213, 213, 19, 326, + 212, 135, 372, 210, 346, 213, 140, 186, 180, 472, + 183, 184, 211, 476, 186, 180, 183, 211, 475, 19, + 213, 472, 179, 182, 474, 19, 346, 179, 489, 283, + 283, 346, 19, 489, 179, 278, 19, 407, 211, 213, + 212, 212, 338, 340, 11, 22, 23, 241, 242, 346, + 266, 168, 213, 467, 465, 186, 213, 213, 168, 306, + 306, 125, 135, 187, 192, 323, 324, 267, 193, 212, + 193, 212, 326, 326, 326, 212, 212, 211, 18, 156, + 168, 408, 189, 156, 168, 346, 212, 212, 156, 168, + 346, 1, 211, 213, 180, 179, 211, 56, 62, 357, + 66, 358, 180, 194, 180, 422, 427, 429, 448, 431, + 425, 168, 416, 433, 194, 437, 194, 441, 194, 445, + 366, 447, 369, 194, 417, 213, 42, 372, 194, 194, + 320, 194, 467, 213, 213, 213, 168, 213, 180, 194, + 213, 194, 420, 420, 420, 194, 213, 212, 420, 346, + 194, 194, 194, 194, 213, 194, 194, 213, 194, 325, + 267, 212, 320, 346, 346, 346, 468, 472, 346, 156, + 168, 465, 476, 211, 346, 488, 211, 320, 468, 179, + 182, 185, 477, 211, 320, 194, 194, 176, 320, 179, + 320, 19, 346, 346, 420, 267, 275, 346, 11, 244, + 325, 213, 211, 210, 186, 211, 213, 168, 168, 168, + 168, 186, 211, 268, 347, 346, 349, 346, 213, 320, + 346, 193, 212, 346, 212, 211, 346, 213, 320, 212, + 211, 344, 180, 46, 358, 45, 105, 355, 325, 435, + 439, 443, 212, 448, 168, 346, 481, 483, 275, 294, + 213, 194, 417, 168, 212, 318, 194, 194, 194, 502, + 282, 194, 311, 313, 315, 504, 487, 492, 485, 212, + 328, 268, 213, 320, 180, 213, 472, 476, 212, 135, + 372, 180, 472, 211, 180, 286, 288, 180, 180, 320, + 213, 213, 194, 268, 275, 245, 180, 267, 213, 465, + 168, 211, 189, 375, 323, 211, 140, 275, 321, 420, + 213, 448, 213, 213, 213, 351, 346, 346, 213, 213, + 346, 32, 356, 355, 357, 280, 212, 212, 346, 168, + 194, 346, 496, 498, 500, 212, 213, 212, 346, 346, + 346, 212, 69, 478, 212, 212, 213, 346, 321, 213, + 346, 135, 372, 476, 346, 346, 346, 346, 477, 489, + 346, 212, 281, 489, 346, 180, 339, 194, 242, 25, + 104, 246, 296, 297, 298, 300, 346, 268, 211, 189, + 375, 420, 374, 125, 346, 194, 194, 448, 213, 213, + 213, 362, 356, 373, 213, 478, 478, 213, 194, 212, + 213, 212, 212, 212, 280, 282, 320, 478, 465, 466, + 213, 180, 508, 346, 346, 213, 508, 508, 280, 508, + 508, 346, 336, 341, 125, 125, 346, 275, 213, 420, + 374, 374, 346, 346, 348, 350, 194, 272, 363, 212, + 465, 469, 470, 471, 471, 346, 346, 478, 478, 466, + 213, 213, 509, 471, 213, 52, 211, 135, 372, 179, + 179, 186, 509, 179, 211, 508, 336, 346, 374, 346, + 346, 180, 352, 180, 272, 465, 186, 509, 213, 213, + 213, 213, 471, 471, 213, 213, 213, 346, 211, 346, + 346, 211, 179, 213, 211, 346, 180, 180, 275, 213, + 212, 213, 213, 180, 465, 213 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -4866,9 +4873,9 @@ static const yytype_int16 yyr1[] = 246, 246, 246, 247, 248, 247, 250, 249, 251, 252, 253, 255, 254, 256, 256, 256, 256, 256, 256, 257, 257, 258, 258, 258, 259, 259, 259, 259, 259, 259, - 259, 259, 260, 260, 261, 261, 262, 262, 262, 263, - 263, 264, 264, 264, 264, 264, 264, 264, 265, 265, - 266, 266, 267, 267, 267, 268, 268, 269, 269, 269, + 259, 259, 260, 260, 261, 261, 261, 262, 262, 262, + 263, 263, 264, 264, 264, 264, 264, 264, 264, 265, + 265, 266, 266, 267, 267, 267, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, @@ -4877,73 +4884,74 @@ static const yytype_int16 yyr1[] = 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 270, 271, 271, 271, 272, 274, 273, 275, - 275, 276, 276, 276, 277, 277, 277, 277, 277, 277, + 269, 269, 269, 270, 271, 271, 271, 272, 274, 273, + 275, 275, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 278, 278, 278, 279, 280, - 280, 281, 281, 282, 282, 284, 285, 283, 286, 287, - 283, 288, 288, 288, 288, 288, 289, 289, 289, 290, - 290, 292, 293, 291, 291, 294, 294, 294, 294, 294, - 294, 295, 296, 297, 297, 297, 298, 298, 298, 299, - 299, 300, 300, 300, 301, 302, 302, 302, 303, 303, - 304, 304, 305, 305, 306, 306, 306, 306, 307, 307, - 309, 310, 308, 311, 312, 308, 313, 314, 308, 316, - 317, 315, 318, 318, 318, 318, 318, 318, 319, 319, - 320, 320, 320, 321, 321, 321, 322, 322, 322, 322, - 323, 323, 324, 324, 325, 325, 326, 328, 327, 329, - 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 331, 331, 331, 331, 332, - 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, - 332, 332, 332, 332, 332, 332, 333, 333, 334, 334, - 335, 335, 336, 337, 338, 336, 339, 340, 336, 341, - 341, 341, 341, 342, 343, 341, 344, 344, 344, 344, - 344, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 346, 347, 345, - 345, 345, 345, 348, 349, 345, 345, 345, 350, 351, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 352, 352, 352, 352, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 353, 353, 353, 354, 354, 354, 355, 355, 356, - 356, 356, 357, 357, 358, 359, 360, 359, 361, 359, - 362, 359, 359, 363, 363, 364, 364, 365, 365, 366, - 366, 367, 367, 367, 368, 369, 369, 370, 370, 370, - 371, 371, 372, 372, 372, 372, 372, 372, 373, 373, - 373, 374, 374, 375, 375, 375, 375, 375, 376, 376, - 376, 376, 376, 377, 378, 377, 379, 379, 380, 380, - 380, 381, 382, 381, 383, 383, 383, 383, 384, 384, - 384, 386, 385, 387, 387, 388, 389, 388, 390, 390, - 390, 391, 393, 394, 392, 395, 396, 392, 397, 397, - 398, 398, 399, 400, 400, 401, 401, 401, 402, 402, - 404, 405, 403, 406, 406, 406, 406, 406, 407, 407, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 408, 408, 408, 408, 408, - 408, 408, 408, 409, 410, 410, 410, 411, 411, 412, - 412, 412, 414, 415, 413, 416, 416, 417, 417, 418, - 418, 418, 418, 418, 418, 419, 420, 418, 418, 418, - 421, 418, 418, 418, 418, 418, 418, 418, 418, 418, - 418, 418, 418, 418, 422, 423, 418, 418, 424, 425, - 418, 426, 427, 418, 428, 429, 418, 418, 430, 431, - 418, 432, 433, 418, 418, 434, 435, 418, 436, 437, - 418, 418, 438, 439, 418, 440, 441, 418, 442, 443, - 418, 444, 445, 418, 446, 446, 446, 448, 449, 450, - 451, 447, 453, 454, 455, 456, 452, 458, 459, 460, - 461, 457, 462, 462, 462, 462, 462, 463, 463, 463, - 463, 463, 463, 463, 463, 464, 465, 466, 466, 467, - 467, 468, 468, 469, 469, 470, 470, 471, 471, 472, - 472, 473, 473, 473, 474, 474, 474, 475, 475, 476, - 476, 476, 476, 476, 476, 477, 478, 476, 479, 480, - 476, 481, 482, 476, 483, 484, 476, 485, 485, 485, - 486, 486, 487, 488, 489, 487, 490, 490, 491, 491, - 491, 492, 493, 491, 494, 495, 491, 496, 497, 491, - 491, 498, 499, 491, 491, 500, 501, 491, 502, 502, - 503, 503, 504, 504, 504, 504, 504, 505, 505, 506, - 506, 507, 507, 507, 507, 507, 507 + 277, 277, 277, 277, 277, 277, 278, 278, 278, 279, + 280, 280, 281, 281, 282, 282, 283, 283, 285, 286, + 284, 287, 288, 284, 289, 289, 289, 289, 289, 290, + 290, 290, 291, 291, 293, 294, 292, 292, 295, 295, + 295, 295, 295, 295, 296, 297, 298, 298, 298, 299, + 299, 299, 300, 300, 301, 301, 301, 302, 303, 303, + 303, 304, 304, 305, 305, 306, 306, 307, 307, 307, + 307, 308, 308, 310, 311, 309, 312, 313, 309, 314, + 315, 309, 317, 318, 316, 319, 319, 319, 319, 319, + 319, 320, 320, 321, 321, 321, 322, 322, 322, 323, + 323, 323, 323, 324, 324, 325, 325, 326, 326, 327, + 329, 328, 330, 330, 330, 330, 330, 330, 330, 331, + 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 331, 332, 332, + 332, 332, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 334, + 334, 335, 335, 336, 336, 337, 338, 339, 337, 340, + 341, 337, 342, 342, 342, 342, 343, 344, 342, 345, + 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 347, 348, 346, 346, 346, 346, 349, 350, + 346, 346, 346, 351, 352, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 354, 354, 354, 355, + 355, 355, 356, 356, 357, 357, 357, 358, 358, 359, + 360, 361, 360, 362, 360, 363, 360, 360, 364, 364, + 365, 365, 366, 366, 367, 367, 368, 368, 368, 369, + 370, 370, 371, 371, 371, 372, 372, 373, 373, 373, + 373, 373, 373, 374, 374, 374, 375, 375, 376, 376, + 376, 376, 376, 377, 377, 377, 377, 377, 378, 379, + 378, 380, 380, 381, 381, 381, 382, 383, 382, 384, + 384, 384, 384, 385, 385, 385, 387, 386, 388, 388, + 389, 390, 389, 391, 391, 391, 392, 394, 395, 393, + 396, 397, 393, 398, 398, 399, 399, 400, 401, 401, + 402, 402, 402, 403, 403, 405, 406, 404, 407, 407, + 407, 407, 407, 408, 408, 408, 408, 408, 408, 408, + 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, + 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, + 409, 409, 409, 409, 409, 409, 409, 409, 410, 411, + 411, 411, 412, 412, 413, 413, 413, 415, 416, 414, + 417, 417, 418, 418, 419, 419, 420, 420, 420, 420, + 420, 420, 421, 422, 420, 420, 420, 423, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + 420, 424, 425, 420, 420, 426, 427, 420, 428, 429, + 420, 430, 431, 420, 420, 432, 433, 420, 434, 435, + 420, 420, 436, 437, 420, 438, 439, 420, 420, 440, + 441, 420, 442, 443, 420, 444, 445, 420, 446, 447, + 420, 448, 448, 448, 450, 451, 452, 453, 449, 455, + 456, 457, 458, 454, 460, 461, 462, 463, 459, 464, + 464, 464, 464, 464, 465, 465, 465, 465, 465, 465, + 465, 465, 466, 467, 468, 468, 469, 469, 470, 470, + 471, 471, 472, 472, 473, 473, 474, 474, 475, 475, + 476, 476, 476, 477, 477, 477, 478, 478, 479, 479, + 479, 479, 479, 479, 480, 481, 479, 482, 483, 479, + 484, 485, 479, 486, 487, 479, 488, 488, 488, 489, + 489, 490, 491, 492, 490, 493, 493, 494, 494, 494, + 495, 496, 494, 497, 498, 494, 499, 500, 494, 494, + 501, 502, 494, 494, 503, 504, 494, 505, 505, 506, + 506, 507, 507, 507, 507, 507, 508, 508, 509, 509, + 510, 510, 510, 510, 510, 510 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -4959,84 +4967,85 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 4, 0, 6, 0, 6, 2, 3, 3, 0, 5, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 1, 5, 1, 3, 2, 3, 1, 1, 1, 1, - 4, 1, 2, 3, 3, 3, 3, 2, 1, 3, - 0, 3, 0, 2, 3, 0, 2, 1, 2, 2, + 1, 5, 1, 3, 2, 3, 2, 1, 1, 1, + 1, 4, 1, 2, 3, 3, 3, 3, 2, 1, + 3, 0, 3, 0, 2, 3, 0, 2, 1, 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, 3, 3, 2, 2, 3, 4, 3, 2, 2, - 2, 2, 2, 3, 3, 3, 4, 1, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 4, 3, 2, + 2, 2, 2, 2, 3, 3, 3, 4, 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, 0, 1, 1, 3, 0, 4, 3, - 7, 2, 2, 6, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 2, 2, 0, 2, 2, 3, 0, - 1, 0, 3, 1, 3, 0, 0, 7, 0, 0, - 7, 3, 2, 2, 2, 1, 1, 3, 2, 2, - 3, 0, 0, 5, 1, 2, 5, 5, 5, 6, - 2, 1, 1, 1, 2, 3, 2, 2, 3, 2, - 3, 2, 2, 3, 4, 1, 1, 0, 1, 1, - 1, 0, 1, 3, 9, 8, 8, 7, 3, 3, - 0, 0, 7, 0, 0, 7, 0, 0, 7, 0, - 0, 6, 5, 8, 10, 5, 8, 10, 1, 3, - 1, 2, 3, 1, 1, 2, 2, 2, 2, 2, - 1, 3, 0, 4, 1, 6, 6, 0, 7, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, + 1, 1, 1, 3, 0, 1, 1, 3, 0, 4, + 3, 7, 2, 2, 6, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, + 1, 1, 1, 2, 2, 2, 0, 2, 2, 3, + 0, 2, 0, 4, 0, 2, 1, 3, 0, 0, + 7, 0, 0, 7, 3, 2, 2, 2, 1, 1, + 3, 2, 2, 3, 0, 0, 5, 1, 2, 5, + 5, 5, 6, 2, 1, 1, 1, 2, 3, 2, + 2, 3, 2, 3, 2, 2, 3, 4, 1, 1, + 0, 1, 1, 1, 0, 1, 3, 9, 8, 8, + 7, 3, 3, 0, 0, 7, 0, 0, 7, 0, + 0, 7, 0, 0, 6, 5, 8, 10, 5, 8, + 10, 1, 3, 1, 2, 3, 1, 1, 2, 2, + 2, 2, 2, 1, 3, 0, 4, 1, 6, 6, + 0, 7, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, + 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, + 8, 5, 6, 1, 4, 3, 0, 0, 8, 0, + 0, 9, 3, 4, 5, 6, 0, 0, 5, 3, + 4, 4, 5, 4, 3, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 6, 8, 5, 6, - 1, 4, 3, 0, 0, 8, 0, 0, 9, 3, - 4, 5, 6, 0, 0, 5, 3, 4, 4, 3, - 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, - 2, 4, 4, 5, 4, 5, 3, 4, 1, 1, - 2, 4, 4, 7, 8, 3, 5, 0, 0, 8, - 3, 3, 3, 0, 0, 8, 3, 4, 0, 0, - 9, 4, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 2, 4, 1, 4, 4, 4, 4, 4, - 1, 6, 7, 6, 6, 7, 7, 6, 7, 6, - 6, 0, 4, 1, 0, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 5, 0, 0, 4, 0, 9, - 0, 10, 5, 3, 4, 1, 3, 1, 3, 1, - 3, 0, 2, 3, 3, 1, 3, 0, 2, 3, - 1, 1, 1, 2, 3, 5, 3, 3, 1, 1, - 1, 0, 1, 1, 4, 3, 3, 5, 4, 6, - 5, 5, 4, 0, 0, 4, 0, 1, 0, 1, - 1, 6, 0, 6, 0, 2, 3, 5, 0, 1, - 1, 0, 5, 2, 3, 4, 0, 4, 0, 1, - 1, 1, 0, 0, 9, 0, 0, 11, 0, 2, - 0, 1, 3, 1, 1, 0, 1, 1, 0, 3, - 0, 0, 7, 1, 4, 3, 3, 5, 1, 1, + 3, 3, 2, 2, 2, 2, 4, 4, 5, 4, + 5, 3, 4, 1, 1, 2, 4, 4, 7, 8, + 3, 5, 0, 0, 8, 3, 3, 3, 0, 0, + 8, 3, 4, 0, 0, 9, 4, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 3, 2, 4, 1, + 4, 4, 4, 4, 4, 1, 6, 7, 6, 6, + 7, 7, 6, 7, 6, 6, 0, 4, 1, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 5, + 0, 0, 4, 0, 9, 0, 10, 5, 3, 4, + 1, 3, 1, 3, 1, 3, 0, 2, 3, 3, + 1, 3, 0, 2, 3, 1, 1, 1, 2, 3, + 5, 3, 3, 1, 1, 1, 0, 1, 1, 4, + 3, 3, 5, 4, 6, 5, 5, 4, 0, 0, + 4, 0, 1, 0, 1, 1, 6, 0, 6, 0, + 2, 3, 5, 0, 1, 1, 0, 5, 2, 3, + 4, 0, 4, 0, 1, 1, 1, 0, 0, 9, + 0, 0, 11, 0, 2, 0, 1, 3, 1, 1, + 0, 1, 1, 0, 3, 0, 0, 7, 1, 4, + 3, 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 4, 4, 1, 3, 0, - 2, 3, 0, 0, 6, 1, 3, 3, 4, 1, - 1, 1, 1, 2, 3, 0, 0, 6, 4, 5, - 0, 9, 4, 2, 2, 3, 2, 3, 2, 2, - 3, 3, 3, 2, 0, 0, 6, 2, 0, 0, - 6, 0, 0, 6, 0, 0, 6, 1, 0, 0, - 6, 0, 0, 7, 1, 0, 0, 6, 0, 0, - 7, 1, 0, 0, 6, 0, 0, 7, 0, 0, - 6, 0, 0, 6, 1, 3, 3, 0, 0, 0, - 0, 10, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 10, 1, 1, 1, 1, 1, 3, 3, 5, - 5, 6, 6, 8, 8, 1, 1, 1, 3, 3, - 5, 1, 2, 0, 2, 2, 1, 2, 1, 2, - 1, 2, 1, 1, 2, 1, 1, 0, 1, 5, - 4, 6, 7, 5, 7, 0, 0, 10, 0, 0, - 10, 0, 0, 9, 0, 0, 7, 1, 3, 3, - 3, 1, 5, 0, 0, 10, 1, 3, 4, 4, - 4, 0, 0, 11, 0, 0, 11, 0, 0, 10, - 5, 0, 0, 10, 5, 0, 0, 10, 1, 3, - 1, 3, 4, 3, 5, 8, 10, 0, 3, 0, - 1, 9, 10, 10, 10, 9, 10 + 4, 4, 1, 3, 0, 2, 3, 0, 0, 6, + 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, + 2, 3, 0, 0, 6, 4, 5, 0, 9, 4, + 2, 2, 3, 2, 3, 2, 2, 3, 3, 3, + 2, 0, 0, 6, 2, 0, 0, 6, 0, 0, + 6, 0, 0, 6, 1, 0, 0, 6, 0, 0, + 7, 1, 0, 0, 6, 0, 0, 7, 1, 0, + 0, 6, 0, 0, 7, 0, 0, 6, 0, 0, + 6, 1, 3, 3, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 10, 1, + 1, 1, 1, 1, 3, 3, 5, 5, 6, 6, + 8, 8, 1, 1, 1, 3, 3, 5, 1, 2, + 1, 0, 0, 2, 2, 1, 2, 1, 2, 1, + 2, 1, 1, 2, 1, 1, 0, 1, 5, 4, + 6, 7, 5, 7, 0, 0, 10, 0, 0, 10, + 0, 0, 9, 0, 0, 7, 1, 3, 3, 3, + 1, 5, 0, 0, 10, 1, 3, 4, 4, 4, + 0, 0, 11, 0, 0, 11, 0, 0, 10, 5, + 0, 0, 9, 5, 0, 0, 10, 1, 3, 1, + 3, 4, 3, 4, 7, 9, 0, 3, 0, 1, + 9, 10, 10, 10, 9, 10 }; @@ -5777,6 +5786,10 @@ yydestruct (const char *yymsg, { delete ((*yyvaluep).pExpression); } break; + case YYSYMBOL_optional_expr_map_tuple_list: /* optional_expr_map_tuple_list */ + { delete ((*yyvaluep).pExpression); } + break; + case YYSYMBOL_type_declaration_no_options_list: /* type_declaration_no_options_list */ { deleteTypeDeclarationList(((*yyvaluep).pTypeDeclList)); } break; @@ -6081,6 +6094,10 @@ yydestruct (const char *yymsg, { delete ((*yyvaluep).pExpression); } break; + case YYSYMBOL_optional_make_struct_dim_decl: /* optional_make_struct_dim_decl */ + { delete ((*yyvaluep).pExpression); } + break; + case YYSYMBOL_optional_block: /* optional_block */ { delete ((*yyvaluep).pExpression); } break; @@ -7004,19 +7021,25 @@ YYLTYPE yylloc = yyloc_default; } break; - case 106: /* annotation_declaration_name: name_in_namespace */ + case 106: /* metadata_argument_list: metadata_argument_list "end of expression" */ + { + (yyval.aaList) = (yyvsp[-1].aaList); + } + break; + + case 107: /* annotation_declaration_name: name_in_namespace */ { (yyval.s) = (yyvsp[0].s); } break; - case 107: /* annotation_declaration_name: "require" */ + case 108: /* annotation_declaration_name: "require" */ { (yyval.s) = new string("require"); } break; - case 108: /* annotation_declaration_name: "private" */ + case 109: /* annotation_declaration_name: "private" */ { (yyval.s) = new string("private"); } break; - case 109: /* annotation_declaration_basic: annotation_declaration_name */ + case 110: /* annotation_declaration_basic: annotation_declaration_name */ { (yyval.fa) = new AnnotationDeclaration(); (yyval.fa)->at = tokAt(scanner,(yylsp[0])); @@ -7032,7 +7055,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 110: /* annotation_declaration_basic: annotation_declaration_name '(' annotation_argument_list ')' */ + case 111: /* annotation_declaration_basic: annotation_declaration_name '(' annotation_argument_list ')' */ { (yyval.fa) = new AnnotationDeclaration(); (yyval.fa)->at = tokAt(scanner,(yylsp[-3])); @@ -7050,13 +7073,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 111: /* annotation_declaration: annotation_declaration_basic */ + case 112: /* annotation_declaration: annotation_declaration_basic */ { (yyval.fa) = (yyvsp[0].fa); } break; - case 112: /* annotation_declaration: '!' annotation_declaration */ + case 113: /* annotation_declaration: '!' annotation_declaration */ { if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation.get()))->isSpecialized() ) { das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), @@ -7067,7 +7090,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 113: /* annotation_declaration: annotation_declaration "&&" annotation_declaration */ + case 114: /* annotation_declaration: annotation_declaration "&&" annotation_declaration */ { if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation.get()))->isSpecialized() ) { das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), @@ -7081,7 +7104,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 114: /* annotation_declaration: annotation_declaration "||" annotation_declaration */ + case 115: /* annotation_declaration: annotation_declaration "||" annotation_declaration */ { if ( !(yyvsp[-2].fa)->annotation || !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation.get()))->isSpecialized() ) { das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), @@ -7095,7 +7118,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 115: /* annotation_declaration: annotation_declaration "^^" annotation_declaration */ + case 116: /* annotation_declaration: annotation_declaration "^^" annotation_declaration */ { if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation.get()))->isSpecialized() ) { das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), @@ -7109,410 +7132,410 @@ YYLTYPE yylloc = yyloc_default; } break; - case 116: /* annotation_declaration: '(' annotation_declaration ')' */ + case 117: /* annotation_declaration: '(' annotation_declaration ')' */ { (yyval.fa) = (yyvsp[-1].fa); } break; - case 117: /* annotation_declaration: "|>" annotation_declaration */ + case 118: /* annotation_declaration: "|>" annotation_declaration */ { (yyval.fa) = (yyvsp[0].fa); (yyvsp[0].fa)->inherited = true; } break; - case 118: /* annotation_list: annotation_declaration */ + case 119: /* annotation_list: annotation_declaration */ { (yyval.faList) = new AnnotationList(); (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); } break; - case 119: /* annotation_list: annotation_list ',' annotation_declaration */ + case 120: /* annotation_list: annotation_list ',' annotation_declaration */ { (yyval.faList) = (yyvsp[-2].faList); (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); } break; - case 120: /* optional_annotation_list: %empty */ + case 121: /* optional_annotation_list: %empty */ { (yyval.faList) = nullptr; } break; - case 121: /* optional_annotation_list: '[' annotation_list ']' */ + case 122: /* optional_annotation_list: '[' annotation_list ']' */ { (yyval.faList) = (yyvsp[-1].faList); } break; - case 122: /* optional_function_argument_list: %empty */ + case 123: /* optional_function_argument_list: %empty */ { (yyval.pVarDeclList) = nullptr; } break; - case 123: /* optional_function_argument_list: '(' ')' */ + case 124: /* optional_function_argument_list: '(' ')' */ { (yyval.pVarDeclList) = nullptr; } break; - case 124: /* optional_function_argument_list: '(' function_argument_list ')' */ + case 125: /* optional_function_argument_list: '(' function_argument_list ')' */ { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 125: /* optional_function_type: %empty */ + case 126: /* optional_function_type: %empty */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); } break; - case 126: /* optional_function_type: ':' type_declaration */ + case 127: /* optional_function_type: ':' type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 127: /* function_name: "name" */ + case 128: /* function_name: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyval.s) = (yyvsp[0].s); } break; - case 128: /* function_name: "operator" '!' */ + case 129: /* function_name: "operator" '!' */ { (yyval.s) = new string("!"); } break; - case 129: /* function_name: "operator" '~' */ + case 130: /* function_name: "operator" '~' */ { (yyval.s) = new string("~"); } break; - case 130: /* function_name: "operator" "+=" */ + case 131: /* function_name: "operator" "+=" */ { (yyval.s) = new string("+="); } break; - case 131: /* function_name: "operator" "-=" */ + case 132: /* function_name: "operator" "-=" */ { (yyval.s) = new string("-="); } break; - case 132: /* function_name: "operator" "*=" */ + case 133: /* function_name: "operator" "*=" */ { (yyval.s) = new string("*="); } break; - case 133: /* function_name: "operator" "/=" */ + case 134: /* function_name: "operator" "/=" */ { (yyval.s) = new string("/="); } break; - case 134: /* function_name: "operator" "%=" */ + case 135: /* function_name: "operator" "%=" */ { (yyval.s) = new string("%="); } break; - case 135: /* function_name: "operator" "&=" */ + case 136: /* function_name: "operator" "&=" */ { (yyval.s) = new string("&="); } break; - case 136: /* function_name: "operator" "|=" */ + case 137: /* function_name: "operator" "|=" */ { (yyval.s) = new string("|="); } break; - case 137: /* function_name: "operator" "^=" */ + case 138: /* function_name: "operator" "^=" */ { (yyval.s) = new string("^="); } break; - case 138: /* function_name: "operator" "&&=" */ + case 139: /* function_name: "operator" "&&=" */ { (yyval.s) = new string("&&="); } break; - case 139: /* function_name: "operator" "||=" */ + case 140: /* function_name: "operator" "||=" */ { (yyval.s) = new string("||="); } break; - case 140: /* function_name: "operator" "^^=" */ + case 141: /* function_name: "operator" "^^=" */ { (yyval.s) = new string("^^="); } break; - case 141: /* function_name: "operator" "&&" */ + case 142: /* function_name: "operator" "&&" */ { (yyval.s) = new string("&&"); } break; - case 142: /* function_name: "operator" "||" */ + case 143: /* function_name: "operator" "||" */ { (yyval.s) = new string("||"); } break; - case 143: /* function_name: "operator" "^^" */ + case 144: /* function_name: "operator" "^^" */ { (yyval.s) = new string("^^"); } break; - case 144: /* function_name: "operator" '+' */ + case 145: /* function_name: "operator" '+' */ { (yyval.s) = new string("+"); } break; - case 145: /* function_name: "operator" '-' */ + case 146: /* function_name: "operator" '-' */ { (yyval.s) = new string("-"); } break; - case 146: /* function_name: "operator" '*' */ + case 147: /* function_name: "operator" '*' */ { (yyval.s) = new string("*"); } break; - case 147: /* function_name: "operator" '/' */ + case 148: /* function_name: "operator" '/' */ { (yyval.s) = new string("/"); } break; - case 148: /* function_name: "operator" '%' */ + case 149: /* function_name: "operator" '%' */ { (yyval.s) = new string("%"); } break; - case 149: /* function_name: "operator" '<' */ + case 150: /* function_name: "operator" '<' */ { (yyval.s) = new string("<"); } break; - case 150: /* function_name: "operator" '>' */ + case 151: /* function_name: "operator" '>' */ { (yyval.s) = new string(">"); } break; - case 151: /* function_name: "operator" ".." */ + case 152: /* function_name: "operator" ".." */ { (yyval.s) = new string("interval"); } break; - case 152: /* function_name: "operator" "==" */ + case 153: /* function_name: "operator" "==" */ { (yyval.s) = new string("=="); } break; - case 153: /* function_name: "operator" "!=" */ + case 154: /* function_name: "operator" "!=" */ { (yyval.s) = new string("!="); } break; - case 154: /* function_name: "operator" "<=" */ + case 155: /* function_name: "operator" "<=" */ { (yyval.s) = new string("<="); } break; - case 155: /* function_name: "operator" ">=" */ + case 156: /* function_name: "operator" ">=" */ { (yyval.s) = new string(">="); } break; - case 156: /* function_name: "operator" '&' */ + case 157: /* function_name: "operator" '&' */ { (yyval.s) = new string("&"); } break; - case 157: /* function_name: "operator" '|' */ + case 158: /* function_name: "operator" '|' */ { (yyval.s) = new string("|"); } break; - case 158: /* function_name: "operator" '^' */ + case 159: /* function_name: "operator" '^' */ { (yyval.s) = new string("^"); } break; - case 159: /* function_name: "++" "operator" */ + case 160: /* function_name: "++" "operator" */ { (yyval.s) = new string("++"); } break; - case 160: /* function_name: "--" "operator" */ + case 161: /* function_name: "--" "operator" */ { (yyval.s) = new string("--"); } break; - case 161: /* function_name: "operator" "++" */ + case 162: /* function_name: "operator" "++" */ { (yyval.s) = new string("+++"); } break; - case 162: /* function_name: "operator" "--" */ + case 163: /* function_name: "operator" "--" */ { (yyval.s) = new string("---"); } break; - case 163: /* function_name: "operator" "<<" */ + case 164: /* function_name: "operator" "<<" */ { (yyval.s) = new string("<<"); } break; - case 164: /* function_name: "operator" ">>" */ + case 165: /* function_name: "operator" ">>" */ { (yyval.s) = new string(">>"); } break; - case 165: /* function_name: "operator" "<<=" */ + case 166: /* function_name: "operator" "<<=" */ { (yyval.s) = new string("<<="); } break; - case 166: /* function_name: "operator" ">>=" */ + case 167: /* function_name: "operator" ">>=" */ { (yyval.s) = new string(">>="); } break; - case 167: /* function_name: "operator" "<<<" */ + case 168: /* function_name: "operator" "<<<" */ { (yyval.s) = new string("<<<"); } break; - case 168: /* function_name: "operator" ">>>" */ + case 169: /* function_name: "operator" ">>>" */ { (yyval.s) = new string(">>>"); } break; - case 169: /* function_name: "operator" "<<<=" */ + case 170: /* function_name: "operator" "<<<=" */ { (yyval.s) = new string("<<<="); } break; - case 170: /* function_name: "operator" ">>>=" */ + case 171: /* function_name: "operator" ">>>=" */ { (yyval.s) = new string(">>>="); } break; - case 171: /* function_name: "operator" '[' ']' */ + case 172: /* function_name: "operator" '[' ']' */ { (yyval.s) = new string("[]"); } break; - case 172: /* function_name: "operator" "?[" ']' */ + case 173: /* function_name: "operator" "?[" ']' */ { (yyval.s) = new string("?[]"); } break; - case 173: /* function_name: "operator" '.' */ + case 174: /* function_name: "operator" '.' */ { (yyval.s) = new string("."); } break; - case 174: /* function_name: "operator" "?." */ + case 175: /* function_name: "operator" "?." */ { (yyval.s) = new string("?."); } break; - case 175: /* function_name: "operator" '.' "name" */ + case 176: /* function_name: "operator" '.' "name" */ { (yyval.s) = new string(".`"+*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 176: /* function_name: "operator" '.' "name" ":=" */ + case 177: /* function_name: "operator" '.' "name" ":=" */ { (yyval.s) = new string(".`"+*(yyvsp[-1].s)+"`clone"); delete (yyvsp[-1].s); } break; - case 177: /* function_name: "operator" "?." "name" */ + case 178: /* function_name: "operator" "?." "name" */ { (yyval.s) = new string("?.`"+*(yyvsp[0].s)); delete (yyvsp[0].s);} break; - case 178: /* function_name: "operator" ":=" */ + case 179: /* function_name: "operator" ":=" */ { (yyval.s) = new string("clone"); } break; - case 179: /* function_name: "operator" "delete" */ + case 180: /* function_name: "operator" "delete" */ { (yyval.s) = new string("finalize"); } break; - case 180: /* function_name: "operator" "??" */ + case 181: /* function_name: "operator" "??" */ { (yyval.s) = new string("??"); } break; - case 181: /* function_name: "operator" "is" */ + case 182: /* function_name: "operator" "is" */ { (yyval.s) = new string("`is"); } break; - case 182: /* function_name: "operator" "as" */ + case 183: /* function_name: "operator" "as" */ { (yyval.s) = new string("`as"); } break; - case 183: /* function_name: "operator" "is" "name" */ + case 184: /* function_name: "operator" "is" "name" */ { (yyval.s) = (yyvsp[0].s); *(yyvsp[0].s) = "`is`" + *(yyvsp[0].s); } break; - case 184: /* function_name: "operator" "as" "name" */ + case 185: /* function_name: "operator" "as" "name" */ { (yyval.s) = (yyvsp[0].s); *(yyvsp[0].s) = "`as`" + *(yyvsp[0].s); } break; - case 185: /* function_name: "operator" '?' "as" */ + case 186: /* function_name: "operator" '?' "as" */ { (yyval.s) = new string("?as"); } break; - case 186: /* function_name: "operator" '?' "as" "name" */ + case 187: /* function_name: "operator" '?' "as" "name" */ { (yyval.s) = (yyvsp[0].s); *(yyvsp[0].s) = "?as`" + *(yyvsp[0].s); } break; - case 187: /* function_name: "bool" */ + case 188: /* function_name: "bool" */ { (yyval.s) = new string("bool"); } break; - case 188: /* function_name: "string" */ + case 189: /* function_name: "string" */ { (yyval.s) = new string("string"); } break; - case 189: /* function_name: "int" */ + case 190: /* function_name: "int" */ { (yyval.s) = new string("int"); } break; - case 190: /* function_name: "int2" */ + case 191: /* function_name: "int2" */ { (yyval.s) = new string("int2"); } break; - case 191: /* function_name: "int3" */ + case 192: /* function_name: "int3" */ { (yyval.s) = new string("int3"); } break; - case 192: /* function_name: "int4" */ + case 193: /* function_name: "int4" */ { (yyval.s) = new string("int4"); } break; - case 193: /* function_name: "uint" */ + case 194: /* function_name: "uint" */ { (yyval.s) = new string("uint"); } break; - case 194: /* function_name: "uint2" */ + case 195: /* function_name: "uint2" */ { (yyval.s) = new string("uint2"); } break; - case 195: /* function_name: "uint3" */ + case 196: /* function_name: "uint3" */ { (yyval.s) = new string("uint3"); } break; - case 196: /* function_name: "uint4" */ + case 197: /* function_name: "uint4" */ { (yyval.s) = new string("uint4"); } break; - case 197: /* function_name: "float" */ + case 198: /* function_name: "float" */ { (yyval.s) = new string("float"); } break; - case 198: /* function_name: "float2" */ + case 199: /* function_name: "float2" */ { (yyval.s) = new string("float2"); } break; - case 199: /* function_name: "float3" */ + case 200: /* function_name: "float3" */ { (yyval.s) = new string("float3"); } break; - case 200: /* function_name: "float4" */ + case 201: /* function_name: "float4" */ { (yyval.s) = new string("float4"); } break; - case 201: /* function_name: "range" */ + case 202: /* function_name: "range" */ { (yyval.s) = new string("range"); } break; - case 202: /* function_name: "urange" */ + case 203: /* function_name: "urange" */ { (yyval.s) = new string("urange"); } break; - case 203: /* function_name: "range64" */ + case 204: /* function_name: "range64" */ { (yyval.s) = new string("range64"); } break; - case 204: /* function_name: "urange64" */ + case 205: /* function_name: "urange64" */ { (yyval.s) = new string("urange64"); } break; - case 205: /* function_name: "int64" */ + case 206: /* function_name: "int64" */ { (yyval.s) = new string("int64"); } break; - case 206: /* function_name: "uint64" */ + case 207: /* function_name: "uint64" */ { (yyval.s) = new string("uint64"); } break; - case 207: /* function_name: "double" */ + case 208: /* function_name: "double" */ { (yyval.s) = new string("double"); } break; - case 208: /* function_name: "int8" */ + case 209: /* function_name: "int8" */ { (yyval.s) = new string("int8"); } break; - case 209: /* function_name: "uint8" */ + case 210: /* function_name: "uint8" */ { (yyval.s) = new string("uint8"); } break; - case 210: /* function_name: "int16" */ + case 211: /* function_name: "int16" */ { (yyval.s) = new string("int16"); } break; - case 211: /* function_name: "uint16" */ + case 212: /* function_name: "uint16" */ { (yyval.s) = new string("uint16"); } break; - case 212: /* global_function_declaration: optional_annotation_list "def" function_declaration */ + case 213: /* global_function_declaration: optional_annotation_list "def" function_declaration */ { (yyvsp[0].pFuncDecl)->atDecl = tokRangeAt(scanner,(yylsp[-1]),(yylsp[0])); assignDefaultArguments((yyvsp[0].pFuncDecl)); @@ -7530,25 +7553,25 @@ YYLTYPE yylloc = yyloc_default; } break; - case 213: /* optional_public_or_private_function: %empty */ + case 214: /* optional_public_or_private_function: %empty */ { (yyval.b) = yyextra->g_thisStructure ? !yyextra->g_thisStructure->privateStructure : yyextra->g_Program->thisModule->isPublic; } break; - case 214: /* optional_public_or_private_function: "private" */ + case 215: /* optional_public_or_private_function: "private" */ { (yyval.b) = false; } break; - case 215: /* optional_public_or_private_function: "public" */ + case 216: /* optional_public_or_private_function: "public" */ { (yyval.b) = true; } break; - case 216: /* function_declaration_header: function_name optional_function_argument_list optional_function_type */ + case 217: /* function_declaration_header: function_name optional_function_argument_list optional_function_type */ { (yyval.pFuncDecl) = ast_functionDeclarationHeader(scanner,(yyvsp[-2].s),(yyvsp[-1].pVarDeclList),(yyvsp[0].pTypeDecl),tokAt(scanner,(yylsp[-2]))); } break; - case 217: /* $@6: %empty */ + case 218: /* $@6: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -7557,7 +7580,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 218: /* function_declaration: optional_public_or_private_function $@6 function_declaration_header expression_block */ + case 219: /* function_declaration: optional_public_or_private_function $@6 function_declaration_header expression_block */ { (yyvsp[-1].pFuncDecl)->body = ExpressionPtr((yyvsp[0].pExpression)); (yyvsp[-1].pFuncDecl)->privateFunction = !(yyvsp[-3].b); @@ -7569,14 +7592,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 219: /* expression_block: "begin of code block" expressions "end of code block" */ + case 220: /* expression_block: "begin of code block" expressions "end of code block" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); (yyval.pExpression)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); } break; - case 220: /* expression_block: "begin of code block" expressions "end of code block" "finally" "begin of code block" expressions "end of code block" */ + case 221: /* expression_block: "begin of code block" expressions "end of code block" "finally" "begin of code block" expressions "end of code block" */ { auto pB = (ExprBlock *) (yyvsp[-5].pExpression); auto pF = (ExprBlock *) (yyvsp[-1].pExpression); @@ -7587,7 +7610,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 221: /* expr_call_pipe: expr expr_full_block_assumed_piped */ + case 222: /* expr_call_pipe: expr expr_full_block_assumed_piped */ { if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back(ExpressionPtr((yyvsp[0].pExpression))); @@ -7599,7 +7622,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 222: /* expr_call_pipe: expression_keyword expr_full_block_assumed_piped */ + case 223: /* expr_call_pipe: expression_keyword expr_full_block_assumed_piped */ { if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back(ExpressionPtr((yyvsp[0].pExpression))); @@ -7611,97 +7634,97 @@ YYLTYPE yylloc = yyloc_default; } break; - case 223: /* expr_call_pipe: "generator" '<' type_declaration_no_options '>' optional_capture_list expr_full_block_assumed_piped */ + case 224: /* expr_call_pipe: "generator" '<' type_declaration_no_options '>' optional_capture_list expr_full_block_assumed_piped */ { (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-3].pTypeDecl),(yyvsp[-1].pCaptList),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-5]))); } break; - case 224: /* expression_any: "end of expression" */ + case 225: /* expression_any: "end of expression" */ { (yyval.pExpression) = nullptr; } break; - case 225: /* expression_any: expr_pipe */ + case 226: /* expression_any: expr_pipe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 226: /* expression_any: expr_keyword */ + case 227: /* expression_any: expr_keyword */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 227: /* expression_any: expr_assign_pipe */ + case 228: /* expression_any: expr_assign_pipe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 228: /* expression_any: expr_assign "end of expression" */ + case 229: /* expression_any: expr_assign "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 229: /* expression_any: expression_delete "end of expression" */ + case 230: /* expression_any: expression_delete "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 230: /* expression_any: expression_let */ + case 231: /* expression_any: expression_let */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 231: /* expression_any: expression_while_loop */ + case 232: /* expression_any: expression_while_loop */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 232: /* expression_any: expression_unsafe */ + case 233: /* expression_any: expression_unsafe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 233: /* expression_any: expression_with */ + case 234: /* expression_any: expression_with */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 234: /* expression_any: expression_with_alias */ + case 235: /* expression_any: expression_with_alias */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 235: /* expression_any: expression_for_loop */ + case 236: /* expression_any: expression_for_loop */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 236: /* expression_any: expression_break "end of expression" */ + case 237: /* expression_any: expression_break "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 237: /* expression_any: expression_continue "end of expression" */ + case 238: /* expression_any: expression_continue "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 238: /* expression_any: expression_return */ + case 239: /* expression_any: expression_return */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 239: /* expression_any: expression_yield */ + case 240: /* expression_any: expression_yield */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 240: /* expression_any: expression_if_then_else */ + case 241: /* expression_any: expression_if_then_else */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 241: /* expression_any: expression_try_catch */ + case 242: /* expression_any: expression_try_catch */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 242: /* expression_any: expression_label "end of expression" */ + case 243: /* expression_any: expression_label "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 243: /* expression_any: expression_goto "end of expression" */ + case 244: /* expression_any: expression_goto "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 244: /* expression_any: "pass" "end of expression" */ + case 245: /* expression_any: "pass" "end of expression" */ { (yyval.pExpression) = nullptr; } break; - case 245: /* expressions: %empty */ + case 246: /* expressions: %empty */ { (yyval.pExpression) = new ExprBlock(); (yyval.pExpression)->at = LineInfo(yyextra->g_FileAccessStack.back(), @@ -7709,7 +7732,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 246: /* expressions: expressions expression_any */ + case 247: /* expressions: expressions expression_any */ { (yyval.pExpression) = (yyvsp[-1].pExpression); if ( (yyvsp[0].pExpression) ) { @@ -7718,13 +7741,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 247: /* expressions: expressions error */ + case 248: /* expressions: expressions error */ { delete (yyvsp[-1].pExpression); (yyval.pExpression) = nullptr; YYABORT; } break; - case 248: /* expr_keyword: "keyword" expr expression_block */ + case 249: /* expr_keyword: "keyword" expr expression_block */ { auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s)); pCall->arguments.push_back(ExpressionPtr((yyvsp[-1].pExpression))); @@ -7736,45 +7759,53 @@ YYLTYPE yylloc = yyloc_default; } break; - case 249: /* optional_expr_list: %empty */ + case 250: /* optional_expr_list: %empty */ + { (yyval.pExpression) = nullptr; } + break; + + case 251: /* optional_expr_list: expr_list optional_comma */ + { (yyval.pExpression) = (yyvsp[-1].pExpression); } + break; + + case 252: /* optional_expr_list_in_braces: %empty */ { (yyval.pExpression) = nullptr; } break; - case 250: /* optional_expr_list: expr_list */ - { (yyval.pExpression) = (yyvsp[0].pExpression); } + case 253: /* optional_expr_list_in_braces: '(' optional_expr_list optional_comma ')' */ + { (yyval.pExpression) = (yyvsp[-2].pExpression); } break; - case 251: /* optional_expr_list_in_braces: %empty */ + case 254: /* optional_expr_map_tuple_list: %empty */ { (yyval.pExpression) = nullptr; } break; - case 252: /* optional_expr_list_in_braces: '(' optional_expr_list ')' */ - { (yyval.pExpression) = (yyvsp[-1].pExpression); } + case 255: /* optional_expr_map_tuple_list: expr_map_tuple_list optional_comma */ + { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 253: /* type_declaration_no_options_list: type_declaration */ + case 256: /* type_declaration_no_options_list: type_declaration */ { (yyval.pTypeDeclList) = new vector(); (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; - case 254: /* type_declaration_no_options_list: type_declaration_no_options_list "end of expression" type_declaration */ - { + case 257: /* type_declaration_no_options_list: type_declaration_no_options_list c_or_s type_declaration */ + { (yyval.pTypeDeclList) = (yyvsp[-2].pTypeDeclList); (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; - case 255: /* $@7: %empty */ + case 258: /* $@7: %empty */ { yyextra->das_arrow_depth ++; } break; - case 256: /* $@8: %empty */ + case 259: /* $@8: %empty */ { yyextra->das_arrow_depth --; } break; - case 257: /* expression_keyword: "keyword" '<' $@7 type_declaration_no_options_list '>' $@8 expr */ + case 260: /* expression_keyword: "keyword" '<' $@7 type_declaration_no_options_list '>' $@8 expr */ { auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); @@ -7783,15 +7814,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 258: /* $@9: %empty */ + case 261: /* $@9: %empty */ { yyextra->das_arrow_depth ++; } break; - case 259: /* $@10: %empty */ + case 262: /* $@10: %empty */ { yyextra->das_arrow_depth --; } break; - case 260: /* expression_keyword: "type function" '<' $@9 type_declaration_no_options_list '>' $@10 optional_expr_list_in_braces */ + case 263: /* expression_keyword: "type function" '<' $@9 type_declaration_no_options_list '>' $@10 optional_expr_list_in_braces */ { auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); @@ -7800,7 +7831,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 261: /* expr_pipe: expr_assign " <|" expr_block */ + case 264: /* expr_pipe: expr_assign " <|" expr_block */ { Expression * pipeCall = (yyvsp[-2].pExpression)->tail(); if ( pipeCall->rtti_isCallLikeExpr() ) { @@ -7837,35 +7868,35 @@ YYLTYPE yylloc = yyloc_default; } break; - case 262: /* expr_pipe: "@ <|" expr_block */ + case 265: /* expr_pipe: "@ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 263: /* expr_pipe: "@@ <|" expr_block */ + case 266: /* expr_pipe: "@@ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 264: /* expr_pipe: "$ <|" expr_block */ + case 267: /* expr_pipe: "$ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 265: /* expr_pipe: expr_call_pipe */ + case 268: /* expr_pipe: expr_call_pipe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 266: /* name_in_namespace: "name" */ + case 269: /* name_in_namespace: "name" */ { (yyval.s) = (yyvsp[0].s); } break; - case 267: /* name_in_namespace: "name" "::" "name" */ + case 270: /* name_in_namespace: "name" "::" "name" */ { auto ita = yyextra->das_module_alias.find(*(yyvsp[-2].s)); if ( ita == yyextra->das_module_alias.end() ) { @@ -7879,17 +7910,17 @@ YYLTYPE yylloc = yyloc_default; } break; - case 268: /* name_in_namespace: "::" "name" */ + case 271: /* name_in_namespace: "::" "name" */ { *(yyvsp[0].s) = "::" + *(yyvsp[0].s); (yyval.s) = (yyvsp[0].s); } break; - case 269: /* expression_delete: "delete" expr */ + case 272: /* expression_delete: "delete" expr */ { (yyval.pExpression) = new ExprDelete(tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 270: /* expression_delete: "delete" "explicit" expr */ + case 273: /* expression_delete: "delete" "explicit" expr */ { auto delExpr = new ExprDelete(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[0].pExpression))); delExpr->native = true; @@ -7897,47 +7928,47 @@ YYLTYPE yylloc = yyloc_default; } break; - case 271: /* $@11: %empty */ + case 274: /* $@11: %empty */ { yyextra->das_arrow_depth ++; } break; - case 272: /* $@12: %empty */ + case 275: /* $@12: %empty */ { yyextra->das_arrow_depth --; } break; - case 273: /* new_type_declaration: '<' $@11 type_declaration '>' $@12 */ + case 276: /* new_type_declaration: '<' $@11 type_declaration '>' $@12 */ { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 274: /* new_type_declaration: structure_type_declaration */ + case 277: /* new_type_declaration: structure_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 275: /* expr_new: "new" new_type_declaration */ + case 278: /* expr_new: "new" new_type_declaration */ { (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-1])),TypeDeclPtr((yyvsp[0].pTypeDecl)),false); } break; - case 276: /* expr_new: "new" new_type_declaration '(' use_initializer ')' */ + case 279: /* expr_new: "new" new_type_declaration '(' use_initializer ')' */ { (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-4])),TypeDeclPtr((yyvsp[-3].pTypeDecl)),true); ((ExprNew *)(yyval.pExpression))->initializer = (yyvsp[-1].b); } break; - case 277: /* expr_new: "new" new_type_declaration '(' expr_list ')' */ + case 280: /* expr_new: "new" new_type_declaration '(' expr_list ')' */ { auto pNew = new ExprNew(tokAt(scanner,(yylsp[-4])),TypeDeclPtr((yyvsp[-3].pTypeDecl)),true); (yyval.pExpression) = parseFunctionArguments(pNew,(yyvsp[-1].pExpression)); } break; - case 278: /* expr_new: "new" new_type_declaration '(' make_struct_single ')' */ + case 281: /* expr_new: "new" new_type_declaration '(' make_struct_single ')' */ { ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-3].pTypeDecl); @@ -7947,7 +7978,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 279: /* expr_new: "new" new_type_declaration '(' "uninitialized" make_struct_single ')' */ + case 282: /* expr_new: "new" new_type_declaration '(' "uninitialized" make_struct_single ')' */ { ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-4].pTypeDecl); @@ -7957,33 +7988,33 @@ YYLTYPE yylloc = yyloc_default; } break; - case 280: /* expr_new: "new" make_decl */ + case 283: /* expr_new: "new" make_decl */ { (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 281: /* expression_break: "break" */ + case 284: /* expression_break: "break" */ { (yyval.pExpression) = new ExprBreak(tokAt(scanner,(yylsp[0]))); } break; - case 282: /* expression_continue: "continue" */ + case 285: /* expression_continue: "continue" */ { (yyval.pExpression) = new ExprContinue(tokAt(scanner,(yylsp[0]))); } break; - case 283: /* expression_return_no_pipe: "return" */ + case 286: /* expression_return_no_pipe: "return" */ { (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[0])),nullptr); } break; - case 284: /* expression_return_no_pipe: "return" expr_list */ + case 287: /* expression_return_no_pipe: "return" expr_list */ { (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),sequenceToTuple((yyvsp[0].pExpression))); } break; - case 285: /* expression_return_no_pipe: "return" "<-" expr_list */ + case 288: /* expression_return_no_pipe: "return" "<-" expr_list */ { auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),sequenceToTuple((yyvsp[0].pExpression))); pRet->moveSemantics = true; @@ -7991,19 +8022,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 286: /* expression_return: expression_return_no_pipe "end of expression" */ + case 289: /* expression_return: expression_return_no_pipe "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 287: /* expression_return: "return" expr_pipe */ + case 290: /* expression_return: "return" expr_pipe */ { (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 288: /* expression_return: "return" "<-" expr_pipe */ + case 291: /* expression_return: "return" "<-" expr_pipe */ { auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[0].pExpression))); pRet->moveSemantics = true; @@ -8011,13 +8042,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 289: /* expression_yield_no_pipe: "yield" expr */ + case 292: /* expression_yield_no_pipe: "yield" expr */ { (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 290: /* expression_yield_no_pipe: "yield" "<-" expr */ + case 293: /* expression_yield_no_pipe: "yield" "<-" expr */ { auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[0].pExpression))); pRet->moveSemantics = true; @@ -8025,19 +8056,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 291: /* expression_yield: expression_yield_no_pipe "end of expression" */ + case 294: /* expression_yield: expression_yield_no_pipe "end of expression" */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 292: /* expression_yield: "yield" expr_pipe */ + case 295: /* expression_yield: "yield" expr_pipe */ { (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 293: /* expression_yield: "yield" "<-" expr_pipe */ + case 296: /* expression_yield: "yield" "<-" expr_pipe */ { auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[0].pExpression))); pRet->moveSemantics = true; @@ -8045,41 +8076,41 @@ YYLTYPE yylloc = yyloc_default; } break; - case 294: /* expression_try_catch: "try" expression_block "recover" expression_block */ + case 297: /* expression_try_catch: "try" expression_block "recover" expression_block */ { (yyval.pExpression) = new ExprTryCatch(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 295: /* kwd_let_var_or_nothing: "let" */ + case 298: /* kwd_let_var_or_nothing: "let" */ { (yyval.b) = true; } break; - case 296: /* kwd_let_var_or_nothing: "var" */ + case 299: /* kwd_let_var_or_nothing: "var" */ { (yyval.b) = false; } break; - case 297: /* kwd_let_var_or_nothing: %empty */ + case 300: /* kwd_let_var_or_nothing: %empty */ { (yyval.b) = true; } break; - case 298: /* kwd_let: "let" */ + case 301: /* kwd_let: "let" */ { (yyval.b) = true; } break; - case 299: /* kwd_let: "var" */ + case 302: /* kwd_let: "var" */ { (yyval.b) = false; } break; - case 300: /* optional_in_scope: "inscope" */ + case 303: /* optional_in_scope: "inscope" */ { (yyval.b) = true; } break; - case 301: /* optional_in_scope: %empty */ + case 304: /* optional_in_scope: %empty */ { (yyval.b) = false; } break; - case 302: /* tuple_expansion: "name" */ + case 305: /* tuple_expansion: "name" */ { (yyval.pNameList) = new vector(); (yyval.pNameList)->push_back(*(yyvsp[0].s)); @@ -8087,7 +8118,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 303: /* tuple_expansion: tuple_expansion ',' "name" */ + case 306: /* tuple_expansion: tuple_expansion ',' "name" */ { (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); delete (yyvsp[0].s); @@ -8095,7 +8126,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 304: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 307: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-7].pNameList),tokAt(scanner,(yylsp[-7])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -8104,7 +8135,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 305: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 308: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -8113,7 +8144,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 306: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' optional_ref copy_or_move_or_clone expr "end of expression" */ + case 309: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-6])); @@ -8125,7 +8156,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 307: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' optional_ref copy_or_move_or_clone expr "end of expression" */ + case 310: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-5])); @@ -8137,41 +8168,41 @@ YYLTYPE yylloc = yyloc_default; } break; - case 308: /* expression_let: kwd_let optional_in_scope let_variable_declaration */ + case 311: /* expression_let: kwd_let optional_in_scope let_variable_declaration */ { (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; - case 309: /* expression_let: kwd_let optional_in_scope tuple_expansion_variable_declaration */ + case 312: /* expression_let: kwd_let optional_in_scope tuple_expansion_variable_declaration */ { (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; - case 310: /* $@13: %empty */ + case 313: /* $@13: %empty */ { yyextra->das_arrow_depth ++; } break; - case 311: /* $@14: %empty */ + case 314: /* $@14: %empty */ { yyextra->das_arrow_depth --; } break; - case 312: /* expr_cast: "cast" '<' $@13 type_declaration_no_options '>' $@14 expr */ + case 315: /* expr_cast: "cast" '<' $@13 type_declaration_no_options '>' $@14 expr */ { (yyval.pExpression) = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); } break; - case 313: /* $@15: %empty */ + case 316: /* $@15: %empty */ { yyextra->das_arrow_depth ++; } break; - case 314: /* $@16: %empty */ + case 317: /* $@16: %empty */ { yyextra->das_arrow_depth --; } break; - case 315: /* expr_cast: "upcast" '<' $@15 type_declaration_no_options '>' $@16 expr */ + case 318: /* expr_cast: "upcast" '<' $@15 type_declaration_no_options '>' $@16 expr */ { auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); pCast->upcast = true; @@ -8179,15 +8210,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 316: /* $@17: %empty */ + case 319: /* $@17: %empty */ { yyextra->das_arrow_depth ++; } break; - case 317: /* $@18: %empty */ + case 320: /* $@18: %empty */ { yyextra->das_arrow_depth --; } break; - case 318: /* expr_cast: "reinterpret" '<' $@17 type_declaration_no_options '>' $@18 expr */ + case 321: /* expr_cast: "reinterpret" '<' $@17 type_declaration_no_options '>' $@18 expr */ { auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[0].pExpression)),TypeDeclPtr((yyvsp[-3].pTypeDecl))); pCast->reinterpret = true; @@ -8195,21 +8226,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 319: /* $@19: %empty */ + case 322: /* $@19: %empty */ { yyextra->das_arrow_depth ++; } break; - case 320: /* $@20: %empty */ + case 323: /* $@20: %empty */ { yyextra->das_arrow_depth --; } break; - case 321: /* expr_type_decl: "type" '<' $@19 type_declaration '>' $@20 */ + case 324: /* expr_type_decl: "type" '<' $@19 type_declaration '>' $@20 */ { (yyval.pExpression) = new ExprTypeDecl(tokAt(scanner,(yylsp[-5])),TypeDeclPtr((yyvsp[-2].pTypeDecl))); } break; - case 322: /* expr_type_info: "typeinfo" '(' name_in_namespace expr ')' */ + case 325: /* expr_type_info: "typeinfo" '(' name_in_namespace expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -8222,7 +8253,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 323: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" '>' expr ')' */ + case 326: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" '>' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -8236,8 +8267,8 @@ YYLTYPE yylloc = yyloc_default; } break; - case 324: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" "end of expression" "name" '>' expr ')' */ - { + case 327: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" c_or_s "name" '>' expr ')' */ + { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-7].s),ptd->typeexpr,*(yyvsp[-5].s),*(yyvsp[-3].s)); @@ -8251,7 +8282,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 325: /* expr_type_info: "typeinfo" name_in_namespace '(' expr ')' */ + case 328: /* expr_type_info: "typeinfo" name_in_namespace '(' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -8264,7 +8295,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 326: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" '>' '(' expr ')' */ + case 329: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" '>' '(' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -8278,7 +8309,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 327: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" "end of expression" "name" '>' '(' expr ')' */ + case 330: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" "end of expression" "name" '>' '(' expr ')' */ { if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); @@ -8293,23 +8324,23 @@ YYLTYPE yylloc = yyloc_default; } break; - case 328: /* expr_list: expr */ + case 331: /* expr_list: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 329: /* expr_list: expr_list ',' expr */ + case 332: /* expr_list: expr_list ',' expr */ { (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 330: /* block_or_simple_block: expression_block */ + case 333: /* block_or_simple_block: expression_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 331: /* block_or_simple_block: "=>" expr */ + case 334: /* block_or_simple_block: "=>" expr */ { auto retE = make_smart(tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[0].pExpression))); auto blkE = new ExprBlock(); @@ -8319,7 +8350,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 332: /* block_or_simple_block: "=>" "<-" expr */ + case 335: /* block_or_simple_block: "=>" "<-" expr */ { auto retE = make_smart(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[0].pExpression))); retE->moveSemantics = true; @@ -8330,35 +8361,35 @@ YYLTYPE yylloc = yyloc_default; } break; - case 333: /* block_or_lambda: '$' */ + case 336: /* block_or_lambda: '$' */ { (yyval.i) = 0; /* block */ } break; - case 334: /* block_or_lambda: '@' */ + case 337: /* block_or_lambda: '@' */ { (yyval.i) = 1; /* lambda */ } break; - case 335: /* block_or_lambda: '@' '@' */ + case 338: /* block_or_lambda: '@' '@' */ { (yyval.i) = 2; /* local function */ } break; - case 336: /* capture_entry: '&' "name" */ + case 339: /* capture_entry: '&' "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_reference); delete (yyvsp[0].s); } break; - case 337: /* capture_entry: '=' "name" */ + case 340: /* capture_entry: '=' "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_copy); delete (yyvsp[0].s); } break; - case 338: /* capture_entry: "<-" "name" */ + case 341: /* capture_entry: "<-" "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_move); delete (yyvsp[0].s); } break; - case 339: /* capture_entry: ":=" "name" */ + case 342: /* capture_entry: ":=" "name" */ { (yyval.pCapt) = new CaptureEntry(*(yyvsp[0].s),CaptureMode::capture_by_clone); delete (yyvsp[0].s); } break; - case 340: /* capture_list: capture_entry */ + case 343: /* capture_list: capture_entry */ { (yyval.pCaptList) = new vector(); (yyval.pCaptList)->push_back(*(yyvsp[0].pCapt)); @@ -8366,7 +8397,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 341: /* capture_list: capture_list ',' capture_entry */ + case 344: /* capture_list: capture_list ',' capture_entry */ { (yyvsp[-2].pCaptList)->push_back(*(yyvsp[0].pCapt)); delete (yyvsp[0].pCapt); @@ -8374,15 +8405,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 342: /* optional_capture_list: %empty */ + case 345: /* optional_capture_list: %empty */ { (yyval.pCaptList) = nullptr; } break; - case 343: /* optional_capture_list: "[[" capture_list ']' ']' */ + case 346: /* optional_capture_list: "[[" capture_list ']' ']' */ { (yyval.pCaptList) = (yyvsp[-2].pCaptList); } break; - case 344: /* expr_block: expression_block */ + case 347: /* expr_block: expression_block */ { ExprBlock * closure = (ExprBlock *) (yyvsp[0].pExpression); (yyval.pExpression) = new ExprMakeBlock(tokAt(scanner,(yylsp[0])),ExpressionPtr((yyvsp[0].pExpression))); @@ -8390,217 +8421,217 @@ YYLTYPE yylloc = yyloc_default; } break; - case 345: /* expr_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ + case 348: /* expr_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ { (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4]))); } break; - case 346: /* expr_full_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ + case 349: /* expr_full_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ { (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4]))); } break; - case 347: /* $@21: %empty */ + case 350: /* $@21: %empty */ { yyextra->das_need_oxford_comma = false; } break; - case 348: /* expr_full_block_assumed_piped: block_or_lambda $@21 optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type expression_block */ + case 351: /* expr_full_block_assumed_piped: block_or_lambda $@21 optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type expression_block */ { (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-6].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4]))); } break; - case 349: /* expr_numeric_const: "integer constant" */ + case 352: /* expr_numeric_const: "integer constant" */ { (yyval.pExpression) = new ExprConstInt(tokAt(scanner,(yylsp[0])),(int32_t)(yyvsp[0].i)); } break; - case 350: /* expr_numeric_const: "unsigned integer constant" */ + case 353: /* expr_numeric_const: "unsigned integer constant" */ { (yyval.pExpression) = new ExprConstUInt(tokAt(scanner,(yylsp[0])),(uint32_t)(yyvsp[0].ui)); } break; - case 351: /* expr_numeric_const: "long integer constant" */ + case 354: /* expr_numeric_const: "long integer constant" */ { (yyval.pExpression) = new ExprConstInt64(tokAt(scanner,(yylsp[0])),(int64_t)(yyvsp[0].i64)); } break; - case 352: /* expr_numeric_const: "unsigned long integer constant" */ + case 355: /* expr_numeric_const: "unsigned long integer constant" */ { (yyval.pExpression) = new ExprConstUInt64(tokAt(scanner,(yylsp[0])),(uint64_t)(yyvsp[0].ui64)); } break; - case 353: /* expr_numeric_const: "unsigned int8 constant" */ + case 356: /* expr_numeric_const: "unsigned int8 constant" */ { (yyval.pExpression) = new ExprConstUInt8(tokAt(scanner,(yylsp[0])),(uint8_t)(yyvsp[0].ui)); } break; - case 354: /* expr_numeric_const: "floating point constant" */ + case 357: /* expr_numeric_const: "floating point constant" */ { (yyval.pExpression) = new ExprConstFloat(tokAt(scanner,(yylsp[0])),(float)(yyvsp[0].fd)); } break; - case 355: /* expr_numeric_const: "double constant" */ + case 358: /* expr_numeric_const: "double constant" */ { (yyval.pExpression) = new ExprConstDouble(tokAt(scanner,(yylsp[0])),(double)(yyvsp[0].d)); } break; - case 356: /* expr_assign: expr */ + case 359: /* expr_assign: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 357: /* expr_assign: expr '=' expr */ + case 360: /* expr_assign: expr '=' expr */ { (yyval.pExpression) = new ExprCopy(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 358: /* expr_assign: expr "<-" expr */ + case 361: /* expr_assign: expr "<-" expr */ { (yyval.pExpression) = new ExprMove(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 359: /* expr_assign: expr ":=" expr */ + case 362: /* expr_assign: expr ":=" expr */ { (yyval.pExpression) = new ExprClone(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 360: /* expr_assign: expr "&=" expr */ + case 363: /* expr_assign: expr "&=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 361: /* expr_assign: expr "|=" expr */ + case 364: /* expr_assign: expr "|=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"|=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 362: /* expr_assign: expr "^=" expr */ + case 365: /* expr_assign: expr "^=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 363: /* expr_assign: expr "&&=" expr */ + case 366: /* expr_assign: expr "&&=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 364: /* expr_assign: expr "||=" expr */ + case 367: /* expr_assign: expr "||=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"||=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 365: /* expr_assign: expr "^^=" expr */ + case 368: /* expr_assign: expr "^^=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 366: /* expr_assign: expr "+=" expr */ + case 369: /* expr_assign: expr "+=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"+=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 367: /* expr_assign: expr "-=" expr */ + case 370: /* expr_assign: expr "-=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"-=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 368: /* expr_assign: expr "*=" expr */ + case 371: /* expr_assign: expr "*=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"*=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 369: /* expr_assign: expr "/=" expr */ + case 372: /* expr_assign: expr "/=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"/=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 370: /* expr_assign: expr "%=" expr */ + case 373: /* expr_assign: expr "%=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"%=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 371: /* expr_assign: expr "<<=" expr */ + case 374: /* expr_assign: expr "<<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 372: /* expr_assign: expr ">>=" expr */ + case 375: /* expr_assign: expr ">>=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 373: /* expr_assign: expr "<<<=" expr */ + case 376: /* expr_assign: expr "<<<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 374: /* expr_assign: expr ">>>=" expr */ + case 377: /* expr_assign: expr ">>>=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 375: /* expr_assign_pipe_right: "@ <|" expr_block */ + case 378: /* expr_assign_pipe_right: "@ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 376: /* expr_assign_pipe_right: "@@ <|" expr_block */ + case 379: /* expr_assign_pipe_right: "@@ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 377: /* expr_assign_pipe_right: "$ <|" expr_block */ + case 380: /* expr_assign_pipe_right: "$ <|" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 378: /* expr_assign_pipe_right: expr_call_pipe */ + case 381: /* expr_assign_pipe_right: expr_call_pipe */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 379: /* expr_assign_pipe: expr '=' expr_assign_pipe_right */ + case 382: /* expr_assign_pipe: expr '=' expr_assign_pipe_right */ { (yyval.pExpression) = new ExprCopy(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 380: /* expr_assign_pipe: expr "<-" expr_assign_pipe_right */ + case 383: /* expr_assign_pipe: expr "<-" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprMove(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 381: /* expr_assign_pipe: expr "&=" expr_assign_pipe_right */ + case 384: /* expr_assign_pipe: expr "&=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 382: /* expr_assign_pipe: expr "|=" expr_assign_pipe_right */ + case 385: /* expr_assign_pipe: expr "|=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"|=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 383: /* expr_assign_pipe: expr "^=" expr_assign_pipe_right */ + case 386: /* expr_assign_pipe: expr "^=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 384: /* expr_assign_pipe: expr "&&=" expr_assign_pipe_right */ + case 387: /* expr_assign_pipe: expr "&&=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&&=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 385: /* expr_assign_pipe: expr "||=" expr_assign_pipe_right */ + case 388: /* expr_assign_pipe: expr "||=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"||=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 386: /* expr_assign_pipe: expr "^^=" expr_assign_pipe_right */ + case 389: /* expr_assign_pipe: expr "^^=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^^=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 387: /* expr_assign_pipe: expr "+=" expr_assign_pipe_right */ + case 390: /* expr_assign_pipe: expr "+=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"+=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 388: /* expr_assign_pipe: expr "-=" expr_assign_pipe_right */ + case 391: /* expr_assign_pipe: expr "-=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"-=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 389: /* expr_assign_pipe: expr "*=" expr_assign_pipe_right */ + case 392: /* expr_assign_pipe: expr "*=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"*=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 390: /* expr_assign_pipe: expr "/=" expr_assign_pipe_right */ + case 393: /* expr_assign_pipe: expr "/=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"/=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 391: /* expr_assign_pipe: expr "%=" expr_assign_pipe_right */ + case 394: /* expr_assign_pipe: expr "%=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"%=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 392: /* expr_assign_pipe: expr "<<=" expr_assign_pipe_right */ + case 395: /* expr_assign_pipe: expr "<<=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 393: /* expr_assign_pipe: expr ">>=" expr_assign_pipe_right */ + case 396: /* expr_assign_pipe: expr ">>=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 394: /* expr_assign_pipe: expr "<<<=" expr_assign_pipe_right */ + case 397: /* expr_assign_pipe: expr "<<<=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 395: /* expr_assign_pipe: expr ">>>=" expr_assign_pipe_right */ + case 398: /* expr_assign_pipe: expr ">>>=" expr_assign_pipe_right */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>>=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 396: /* expr_named_call: name_in_namespace '(' '[' make_struct_fields ']' ')' */ + case 399: /* expr_named_call: name_in_namespace '(' '[' make_struct_fields ']' ')' */ { auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); nc->arguments = *(yyvsp[-2].pMakeStruct); @@ -8610,7 +8641,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 397: /* expr_named_call: name_in_namespace '(' expr_list ',' '[' make_struct_fields ']' ')' */ + case 400: /* expr_named_call: name_in_namespace '(' expr_list ',' '[' make_struct_fields ']' ')' */ { auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-7])),*(yyvsp[-7].s)); nc->nonNamedArguments = sequenceToList((yyvsp[-5].pExpression)); @@ -8621,7 +8652,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 398: /* expr_method_call: expr "->" "name" '(' ')' */ + case 401: /* expr_method_call: expr "->" "name" '(' ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); delete (yyvsp[-2].s); @@ -8629,7 +8660,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 399: /* expr_method_call: expr "->" "name" '(' expr_list ')' */ + case 402: /* expr_method_call: expr "->" "name" '(' expr_list ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); auto callArgs = sequenceToList((yyvsp[-1].pExpression)); @@ -8639,35 +8670,35 @@ YYLTYPE yylloc = yyloc_default; } break; - case 400: /* func_addr_name: name_in_namespace */ + case 403: /* func_addr_name: name_in_namespace */ { (yyval.pExpression) = new ExprAddr(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 401: /* func_addr_name: "$i" '(' expr ')' */ + case 404: /* func_addr_name: "$i" '(' expr ')' */ { auto expr = new ExprAddr(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``ADDR``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression), expr, "i"); } break; - case 402: /* func_addr_expr: '@' '@' func_addr_name */ + case 405: /* func_addr_expr: '@' '@' func_addr_name */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 403: /* $@22: %empty */ + case 406: /* $@22: %empty */ { yyextra->das_arrow_depth ++; } break; - case 404: /* $@23: %empty */ + case 407: /* $@23: %empty */ { yyextra->das_arrow_depth --; } break; - case 405: /* func_addr_expr: '@' '@' '<' $@22 type_declaration_no_options '>' $@23 func_addr_name */ + case 408: /* func_addr_expr: '@' '@' '<' $@22 type_declaration_no_options '>' $@23 func_addr_name */ { auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value.get())); expr->funcType = TypeDeclPtr((yyvsp[-3].pTypeDecl)); @@ -8675,15 +8706,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 406: /* $@24: %empty */ + case 409: /* $@24: %empty */ { yyextra->das_arrow_depth ++; } break; - case 407: /* $@25: %empty */ + case 410: /* $@25: %empty */ { yyextra->das_arrow_depth --; } break; - case 408: /* func_addr_expr: '@' '@' '<' $@24 optional_function_argument_list optional_function_type '>' $@25 func_addr_name */ + case 411: /* func_addr_expr: '@' '@' '<' $@24 optional_function_argument_list optional_function_type '>' $@25 func_addr_name */ { auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value.get())); expr->funcType = make_smart(Type::tFunction); @@ -8696,21 +8727,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 409: /* expr_field: expr '.' "name" */ + case 412: /* expr_field: expr '.' "name" */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-2].pExpression)), *(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 410: /* expr_field: expr '.' '.' "name" */ + case 413: /* expr_field: expr '.' '.' "name" */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-3].pExpression)), *(yyvsp[0].s), true); delete (yyvsp[0].s); } break; - case 411: /* expr_field: expr '.' "name" '(' ')' */ + case 414: /* expr_field: expr '.' "name" '(' ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); delete (yyvsp[-2].s); @@ -8718,7 +8749,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 412: /* expr_field: expr '.' "name" '(' expr_list ')' */ + case 415: /* expr_field: expr '.' "name" '(' expr_list ')' */ { auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); auto callArgs = sequenceToList((yyvsp[-1].pExpression)); @@ -8728,29 +8759,42 @@ YYLTYPE yylloc = yyloc_default; } break; - case 413: /* $@26: %empty */ + case 416: /* $@26: %empty */ { yyextra->das_suppress_errors=true; } break; - case 414: /* $@27: %empty */ + case 417: /* $@27: %empty */ { yyextra->das_suppress_errors=false; } break; - case 415: /* expr_field: expr '.' $@26 error $@27 */ + case 418: /* expr_field: expr '.' $@26 error $@27 */ { (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-3])), ExpressionPtr((yyvsp[-4].pExpression)), ""); yyerrok; } break; - case 416: /* expr_call: name_in_namespace '(' ')' */ + case 419: /* expr_call: name_in_namespace '(' ')' */ { (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),*(yyvsp[-2].s)); delete (yyvsp[-2].s); } break; - case 417: /* expr_call: name_in_namespace '(' make_struct_single ')' */ + case 420: /* expr_call: name_in_namespace '(' "uninitialized" ')' */ + { + auto dd = new ExprMakeStruct(tokAt(scanner,(yylsp[-3]))); + dd->at = tokAt(scanner,(yylsp[-3])); + dd->makeType = new TypeDecl(Type::alias); + dd->makeType->alias = *(yyvsp[-3].s); + dd->useInitializer = false; + dd->alwaysUseInitializer = true; + delete (yyvsp[-3].s); + (yyval.pExpression) = dd; + } + break; + + case 421: /* expr_call: name_in_namespace '(' make_struct_single ')' */ { ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); @@ -8762,166 +8806,178 @@ YYLTYPE yylloc = yyloc_default; } break; - case 418: /* expr_call: name_in_namespace '(' expr_list ')' */ + case 422: /* expr_call: name_in_namespace '(' "uninitialized" make_struct_single ')' */ + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-4].s); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + delete (yyvsp[-4].s); + (yyval.pExpression) = (yyvsp[-1].pExpression); + } + break; + + case 423: /* expr_call: name_in_namespace '(' expr_list ')' */ { (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),*(yyvsp[-3].s)),(yyvsp[-1].pExpression)); delete (yyvsp[-3].s); } break; - case 419: /* expr_call: basic_type_declaration '(' ')' */ + case 424: /* expr_call: basic_type_declaration '(' ')' */ { (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-2].type))); } break; - case 420: /* expr_call: basic_type_declaration '(' expr_list ')' */ + case 425: /* expr_call: basic_type_declaration '(' expr_list ')' */ { (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-3].type))),(yyvsp[-1].pExpression)); } break; - case 421: /* expr: "null" */ + case 426: /* expr: "null" */ { (yyval.pExpression) = new ExprConstPtr(tokAt(scanner,(yylsp[0])),nullptr); } break; - case 422: /* expr: name_in_namespace */ + case 427: /* expr: name_in_namespace */ { (yyval.pExpression) = new ExprVar(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 423: /* expr: expr_numeric_const */ + case 428: /* expr: expr_numeric_const */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 424: /* expr: expr_reader */ + case 429: /* expr: expr_reader */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 425: /* expr: string_builder */ + case 430: /* expr: string_builder */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 426: /* expr: make_decl */ + case 431: /* expr: make_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 427: /* expr: "true" */ + case 432: /* expr: "true" */ { (yyval.pExpression) = new ExprConstBool(tokAt(scanner,(yylsp[0])),true); } break; - case 428: /* expr: "false" */ + case 433: /* expr: "false" */ { (yyval.pExpression) = new ExprConstBool(tokAt(scanner,(yylsp[0])),false); } break; - case 429: /* expr: expr_field */ + case 434: /* expr: expr_field */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 430: /* expr: expr_mtag */ + case 435: /* expr: expr_mtag */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 431: /* expr: '!' expr */ + case 436: /* expr: '!' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"!",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 432: /* expr: '~' expr */ + case 437: /* expr: '~' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"~",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 433: /* expr: '+' expr */ + case 438: /* expr: '+' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"+",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 434: /* expr: '-' expr */ + case 439: /* expr: '-' expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"-",ExpressionPtr((yyvsp[0].pExpression))); } break; - case 435: /* expr: expr "<<" expr */ + case 440: /* expr: expr "<<" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 436: /* expr: expr ">>" expr */ + case 441: /* expr: expr ">>" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 437: /* expr: expr "<<<" expr */ + case 442: /* expr: expr "<<<" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<<<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 438: /* expr: expr ">>>" expr */ + case 443: /* expr: expr ">>>" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">>>", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 439: /* expr: expr '+' expr */ + case 444: /* expr: expr '+' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"+", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 440: /* expr: expr '-' expr */ + case 445: /* expr: expr '-' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"-", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 441: /* expr: expr '*' expr */ + case 446: /* expr: expr '*' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"*", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 442: /* expr: expr '/' expr */ + case 447: /* expr: expr '/' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"/", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 443: /* expr: expr '%' expr */ + case 448: /* expr: expr '%' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"%", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 444: /* expr: expr '<' expr */ + case 449: /* expr: expr '<' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 445: /* expr: expr '>' expr */ + case 450: /* expr: expr '>' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 446: /* expr: expr "==" expr */ + case 451: /* expr: expr "==" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"==", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 447: /* expr: expr "!=" expr */ + case 452: /* expr: expr "!=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"!=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 448: /* expr: expr "<=" expr */ + case 453: /* expr: expr "<=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"<=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 449: /* expr: expr ">=" expr */ + case 454: /* expr: expr ">=" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),">=", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 450: /* expr: expr '&' expr */ + case 455: /* expr: expr '&' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 451: /* expr: expr '|' expr */ + case 456: /* expr: expr '|' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"|", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 452: /* expr: expr '^' expr */ + case 457: /* expr: expr '^' expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 453: /* expr: expr "&&" expr */ + case 458: /* expr: expr "&&" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"&&", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 454: /* expr: expr "||" expr */ + case 459: /* expr: expr "||" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"||", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 455: /* expr: expr "^^" expr */ + case 460: /* expr: expr "^^" expr */ { (yyval.pExpression) = new ExprOp2(tokAt(scanner,(yylsp[-1])),"^^", ExpressionPtr((yyvsp[-2].pExpression)), ExpressionPtr((yyvsp[0].pExpression))); } break; - case 456: /* expr: expr ".." expr */ + case 461: /* expr: expr ".." expr */ { auto itv = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-1])),"interval"); itv->arguments.push_back(ExpressionPtr((yyvsp[-2].pExpression))); @@ -8930,23 +8986,23 @@ YYLTYPE yylloc = yyloc_default; } break; - case 457: /* expr: "++" expr */ + case 462: /* expr: "++" expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"++", ExpressionPtr((yyvsp[0].pExpression))); } break; - case 458: /* expr: "--" expr */ + case 463: /* expr: "--" expr */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[-1])),"--", ExpressionPtr((yyvsp[0].pExpression))); } break; - case 459: /* expr: expr "++" */ + case 464: /* expr: expr "++" */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[0])),"+++", ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 460: /* expr: expr "--" */ + case 465: /* expr: expr "--" */ { (yyval.pExpression) = new ExprOp1(tokAt(scanner,(yylsp[0])),"---", ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 461: /* expr: '(' expr_list optional_comma ')' */ + case 466: /* expr: '(' expr_list optional_comma ')' */ { if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); @@ -8962,87 +9018,87 @@ YYLTYPE yylloc = yyloc_default; } break; - case 462: /* expr: expr '[' expr ']' */ + case 467: /* expr: expr '[' expr ']' */ { (yyval.pExpression) = new ExprAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-3].pExpression)), ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 463: /* expr: expr '.' '[' expr ']' */ + case 468: /* expr: expr '.' '[' expr ']' */ { (yyval.pExpression) = new ExprAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-4].pExpression)), ExpressionPtr((yyvsp[-1].pExpression)), true); } break; - case 464: /* expr: expr "?[" expr ']' */ + case 469: /* expr: expr "?[" expr ']' */ { (yyval.pExpression) = new ExprSafeAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-3].pExpression)), ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 465: /* expr: expr '.' "?[" expr ']' */ + case 470: /* expr: expr '.' "?[" expr ']' */ { (yyval.pExpression) = new ExprSafeAt(tokAt(scanner,(yylsp[-2])), ExpressionPtr((yyvsp[-4].pExpression)), ExpressionPtr((yyvsp[-1].pExpression)), true); } break; - case 466: /* expr: expr "?." "name" */ + case 471: /* expr: expr "?." "name" */ { (yyval.pExpression) = new ExprSafeField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-2].pExpression)), *(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 467: /* expr: expr '.' "?." "name" */ + case 472: /* expr: expr '.' "?." "name" */ { (yyval.pExpression) = new ExprSafeField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), ExpressionPtr((yyvsp[-3].pExpression)), *(yyvsp[0].s), true); delete (yyvsp[0].s); } break; - case 468: /* expr: func_addr_expr */ + case 473: /* expr: func_addr_expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 469: /* expr: expr_call */ + case 474: /* expr: expr_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 470: /* expr: '*' expr */ + case 475: /* expr: '*' expr */ { (yyval.pExpression) = new ExprPtr2Ref(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 471: /* expr: "deref" '(' expr ')' */ + case 476: /* expr: "deref" '(' expr ')' */ { (yyval.pExpression) = new ExprPtr2Ref(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 472: /* expr: "addr" '(' expr ')' */ + case 477: /* expr: "addr" '(' expr ')' */ { (yyval.pExpression) = new ExprRef2Ptr(tokAt(scanner,(yylsp[-3])),ExpressionPtr((yyvsp[-1].pExpression))); } break; - case 473: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' ')' */ + case 478: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' ')' */ { (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-4].pTypeDecl),(yyvsp[-2].pCaptList),nullptr,tokAt(scanner,(yylsp[-6]))); } break; - case 474: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' expr ')' */ + case 479: /* expr: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' expr ')' */ { (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-5].pTypeDecl),(yyvsp[-3].pCaptList),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-7]))); } break; - case 475: /* expr: expr "??" expr */ + case 480: /* expr: expr "??" expr */ { (yyval.pExpression) = new ExprNullCoalescing(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 476: /* expr: expr '?' expr ':' expr */ + case 481: /* expr: expr '?' expr ':' expr */ { (yyval.pExpression) = new ExprOp3(tokAt(scanner,(yylsp[-3])),"?",ExpressionPtr((yyvsp[-4].pExpression)),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 477: /* $@28: %empty */ + case 482: /* $@28: %empty */ { yyextra->das_arrow_depth ++; } break; - case 478: /* $@29: %empty */ + case 483: /* $@29: %empty */ { yyextra->das_arrow_depth --; } break; - case 479: /* expr: expr "is" "type" '<' $@28 type_declaration_no_options '>' $@29 */ + case 484: /* expr: expr "is" "type" '<' $@28 type_declaration_no_options '>' $@29 */ { (yyval.pExpression) = new ExprIs(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-7].pExpression)),TypeDeclPtr((yyvsp[-2].pTypeDecl))); } break; - case 480: /* expr: expr "is" basic_type_declaration */ + case 485: /* expr: expr "is" basic_type_declaration */ { auto vdecl = new TypeDecl((yyvsp[0].type)); vdecl->at = tokAt(scanner,(yylsp[0])); @@ -9050,29 +9106,29 @@ YYLTYPE yylloc = yyloc_default; } break; - case 481: /* expr: expr "is" "name" */ + case 486: /* expr: expr "is" "name" */ { (yyval.pExpression) = new ExprIsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 482: /* expr: expr "as" "name" */ + case 487: /* expr: expr "as" "name" */ { (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 483: /* $@30: %empty */ + case 488: /* $@30: %empty */ { yyextra->das_arrow_depth ++; } break; - case 484: /* $@31: %empty */ + case 489: /* $@31: %empty */ { yyextra->das_arrow_depth --; } break; - case 485: /* expr: expr "as" "type" '<' $@30 type_declaration '>' $@31 */ + case 490: /* expr: expr "as" "type" '<' $@30 type_declaration '>' $@31 */ { auto vname = (yyvsp[-2].pTypeDecl)->describe(); (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-7].pExpression)),vname); @@ -9080,28 +9136,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 486: /* expr: expr "as" basic_type_declaration */ + case 491: /* expr: expr "as" basic_type_declaration */ { (yyval.pExpression) = new ExprAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-2].pExpression)),das_to_string((yyvsp[0].type))); } break; - case 487: /* expr: expr '?' "as" "name" */ + case 492: /* expr: expr '?' "as" "name" */ { (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-3].pExpression)),*(yyvsp[0].s)); delete (yyvsp[0].s); } break; - case 488: /* $@32: %empty */ + case 493: /* $@32: %empty */ { yyextra->das_arrow_depth ++; } break; - case 489: /* $@33: %empty */ + case 494: /* $@33: %empty */ { yyextra->das_arrow_depth --; } break; - case 490: /* expr: expr '?' "as" "type" '<' $@32 type_declaration '>' $@33 */ + case 495: /* expr: expr '?' "as" "type" '<' $@32 type_declaration '>' $@33 */ { auto vname = (yyvsp[-2].pTypeDecl)->describe(); (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-6])),ExpressionPtr((yyvsp[-8].pExpression)),vname); @@ -9109,60 +9165,60 @@ YYLTYPE yylloc = yyloc_default; } break; - case 491: /* expr: expr '?' "as" basic_type_declaration */ + case 496: /* expr: expr '?' "as" basic_type_declaration */ { (yyval.pExpression) = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-3].pExpression)),das_to_string((yyvsp[0].type))); } break; - case 492: /* expr: expr_type_info */ + case 497: /* expr: expr_type_info */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 493: /* expr: expr_type_decl */ + case 498: /* expr: expr_type_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 494: /* expr: expr_cast */ + case 499: /* expr: expr_cast */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 495: /* expr: expr_new */ + case 500: /* expr: expr_new */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 496: /* expr: expr_method_call */ + case 501: /* expr: expr_method_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 497: /* expr: expr_named_call */ + case 502: /* expr: expr_named_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 498: /* expr: expr_full_block */ + case 503: /* expr: expr_full_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 499: /* expr: expr "<|" expr */ + case 504: /* expr: expr "<|" expr */ { (yyval.pExpression) = ast_lpipe(scanner,(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-1]))); } break; - case 500: /* expr: expr "|>" expr */ + case 505: /* expr: expr "|>" expr */ { (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-1]))); } break; - case 501: /* expr: expr "|>" basic_type_declaration */ + case 506: /* expr: expr "|>" basic_type_declaration */ { auto fncall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[0].type))); (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),fncall,tokAt(scanner,(yylsp[-1]))); } break; - case 502: /* expr: name_in_namespace "name" */ + case 507: /* expr: name_in_namespace "name" */ { (yyval.pExpression) = ast_NameName(scanner,(yyvsp[-1].s),(yyvsp[0].s),tokAt(scanner,(yylsp[-1])),tokAt(scanner,(yylsp[0]))); } break; - case 503: /* expr: "unsafe" '(' expr ')' */ + case 508: /* expr: "unsafe" '(' expr ')' */ { (yyvsp[-1].pExpression)->alwaysSafe = true; (yyvsp[-1].pExpression)->userSaidItsSafe = true; @@ -9170,157 +9226,157 @@ YYLTYPE yylloc = yyloc_default; } break; - case 504: /* expr: expression_keyword */ + case 509: /* expr: expression_keyword */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 505: /* expr_mtag: "$$" '(' expr ')' */ + case 510: /* expr_mtag: "$$" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"e"); } break; - case 506: /* expr_mtag: "$i" '(' expr ')' */ + case 511: /* expr_mtag: "$i" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"i"); } break; - case 507: /* expr_mtag: "$v" '(' expr ')' */ + case 512: /* expr_mtag: "$v" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"v"); } break; - case 508: /* expr_mtag: "$b" '(' expr ')' */ + case 513: /* expr_mtag: "$b" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"b"); } break; - case 509: /* expr_mtag: "$a" '(' expr ')' */ + case 514: /* expr_mtag: "$a" '(' expr ')' */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),"a"); } break; - case 510: /* expr_mtag: "..." */ + case 515: /* expr_mtag: "..." */ { (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[0])),nullptr,"..."); } break; - case 511: /* expr_mtag: "$c" '(' expr ')' '(' ')' */ + case 516: /* expr_mtag: "$c" '(' expr ')' '(' ')' */ { auto ccall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-5])),(yyvsp[-3].pExpression),ccall,"c"); } break; - case 512: /* expr_mtag: "$c" '(' expr ')' '(' expr_list ')' */ + case 517: /* expr_mtag: "$c" '(' expr ')' '(' expr_list ')' */ { auto ccall = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"),(yyvsp[-1].pExpression)); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-6])),(yyvsp[-4].pExpression),ccall,"c"); } break; - case 513: /* expr_mtag: expr '.' "$f" '(' expr ')' */ + case 518: /* expr_mtag: expr '.' "$f" '(' expr ')' */ { auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-5].pExpression)), "``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 514: /* expr_mtag: expr "?." "$f" '(' expr ')' */ + case 519: /* expr_mtag: expr "?." "$f" '(' expr ')' */ { auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-5].pExpression)), "``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 515: /* expr_mtag: expr '.' '.' "$f" '(' expr ')' */ + case 520: /* expr_mtag: expr '.' '.' "$f" '(' expr ')' */ { auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-6].pExpression)), "``MACRO``TAG``FIELD``", true); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 516: /* expr_mtag: expr '.' "?." "$f" '(' expr ')' */ + case 521: /* expr_mtag: expr '.' "?." "$f" '(' expr ')' */ { auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), ExpressionPtr((yyvsp[-6].pExpression)), "``MACRO``TAG``FIELD``", true); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 517: /* expr_mtag: expr "as" "$f" '(' expr ')' */ + case 522: /* expr_mtag: expr "as" "$f" '(' expr ')' */ { auto cfield = new ExprAsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-5].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 518: /* expr_mtag: expr '?' "as" "$f" '(' expr ')' */ + case 523: /* expr_mtag: expr '?' "as" "$f" '(' expr ')' */ { auto cfield = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-6].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 519: /* expr_mtag: expr "is" "$f" '(' expr ')' */ + case 524: /* expr_mtag: expr "is" "$f" '(' expr ')' */ { auto cfield = new ExprIsVariant(tokAt(scanner,(yylsp[-4])),ExpressionPtr((yyvsp[-5].pExpression)),"``MACRO``TAG``FIELD``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; - case 520: /* expr_mtag: '@' '@' "$c" '(' expr ')' */ + case 525: /* expr_mtag: '@' '@' "$c" '(' expr ')' */ { auto ccall = new ExprAddr(tokAt(scanner,(yylsp[-4])),"``MACRO``TAG``ADDR``"); (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-3])),(yyvsp[-1].pExpression),ccall,"c"); } break; - case 521: /* optional_field_annotation: %empty */ + case 526: /* optional_field_annotation: %empty */ { (yyval.aaList) = nullptr; } break; - case 522: /* optional_field_annotation: "[[" annotation_argument_list ']' ']' */ + case 527: /* optional_field_annotation: "[[" annotation_argument_list ']' ']' */ { (yyval.aaList) = (yyvsp[-2].aaList); /*this one is gone when BRABRA is disabled*/ } break; - case 523: /* optional_field_annotation: metadata_argument_list */ + case 528: /* optional_field_annotation: metadata_argument_list */ { (yyval.aaList) = (yyvsp[0].aaList); } break; - case 524: /* optional_override: %empty */ + case 529: /* optional_override: %empty */ { (yyval.i) = OVERRIDE_NONE; } break; - case 525: /* optional_override: "override" */ + case 530: /* optional_override: "override" */ { (yyval.i) = OVERRIDE_OVERRIDE; } break; - case 526: /* optional_override: "sealed" */ + case 531: /* optional_override: "sealed" */ { (yyval.i) = OVERRIDE_SEALED; } break; - case 527: /* optional_constant: %empty */ + case 532: /* optional_constant: %empty */ { (yyval.b) = false; } break; - case 528: /* optional_constant: "const" */ + case 533: /* optional_constant: "const" */ { (yyval.b) = true; } break; - case 529: /* optional_public_or_private_member_variable: %empty */ + case 534: /* optional_public_or_private_member_variable: %empty */ { (yyval.b) = false; } break; - case 530: /* optional_public_or_private_member_variable: "public" */ + case 535: /* optional_public_or_private_member_variable: "public" */ { (yyval.b) = false; } break; - case 531: /* optional_public_or_private_member_variable: "private" */ + case 536: /* optional_public_or_private_member_variable: "private" */ { (yyval.b) = true; } break; - case 532: /* optional_static_member_variable: %empty */ + case 537: /* optional_static_member_variable: %empty */ { (yyval.b) = false; } break; - case 533: /* optional_static_member_variable: "static" */ + case 538: /* optional_static_member_variable: "static" */ { (yyval.b) = true; } break; - case 534: /* structure_variable_declaration: optional_field_annotation optional_static_member_variable optional_override optional_public_or_private_member_variable variable_declaration */ + case 539: /* structure_variable_declaration: optional_field_annotation optional_static_member_variable optional_override optional_public_or_private_member_variable variable_declaration */ { (yyvsp[0].pVarDecl)->override = (yyvsp[-2].i) == OVERRIDE_OVERRIDE; (yyvsp[0].pVarDecl)->sealed = (yyvsp[-2].i) == OVERRIDE_SEALED; @@ -9331,13 +9387,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 535: /* struct_variable_declaration_list: %empty */ + case 540: /* struct_variable_declaration_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 536: /* $@34: %empty */ + case 541: /* $@34: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9346,7 +9402,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 537: /* struct_variable_declaration_list: struct_variable_declaration_list $@34 structure_variable_declaration "end of expression" */ + case 542: /* struct_variable_declaration_list: struct_variable_declaration_list $@34 structure_variable_declaration "end of expression" */ { (yyval.pVarDeclList) = (yyvsp[-3].pVarDeclList); if ( (yyvsp[-1].pVarDecl) ) (yyvsp[-3].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); @@ -9362,7 +9418,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 538: /* $@35: %empty */ + case 543: /* $@35: %empty */ { yyextra->das_force_oxford_comma=true; if ( !yyextra->g_CommentReaders.empty() ) { @@ -9372,7 +9428,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 539: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable "abstract" optional_constant $@35 function_declaration_header "end of expression" */ + case 544: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable "abstract" optional_constant $@35 function_declaration_header "end of expression" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -9382,7 +9438,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 540: /* $@36: %empty */ + case 545: /* $@36: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9391,7 +9447,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 541: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable optional_static_member_variable optional_override optional_constant $@36 function_declaration_header expression_block */ + case 546: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable optional_static_member_variable optional_override optional_constant $@36 function_declaration_header expression_block */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9401,7 +9457,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 542: /* struct_variable_declaration_list: struct_variable_declaration_list '[' annotation_list ']' "end of expression" */ + case 547: /* struct_variable_declaration_list: struct_variable_declaration_list '[' annotation_list ']' "end of expression" */ { das_yyerror(scanner,"structure field or class method annotation expected to remain on the same line with the field or the class", tokAt(scanner,(yylsp[-2])), CompilationError::syntax_error); @@ -9410,7 +9466,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 543: /* function_argument_declaration: optional_field_annotation kwd_let_var_or_nothing variable_declaration */ + case 548: /* function_argument_declaration: optional_field_annotation kwd_let_var_or_nothing variable_declaration */ { (yyval.pVarDecl) = (yyvsp[0].pVarDecl); if ( (yyvsp[-1].b) ) { @@ -9422,7 +9478,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 544: /* function_argument_declaration: "$a" '(' expr ')' */ + case 549: /* function_argument_declaration: "$a" '(' expr ')' */ { auto na = new vector(); na->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1]))}); @@ -9432,21 +9488,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 545: /* function_argument_list: function_argument_declaration */ + case 550: /* function_argument_list: function_argument_declaration */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 546: /* function_argument_list: function_argument_list "end of expression" function_argument_declaration */ + case 551: /* function_argument_list: function_argument_list "end of expression" function_argument_declaration */ { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 547: /* tuple_type: type_declaration */ + case 552: /* tuple_type: type_declaration */ { (yyval.pVarDecl) = new VariableDeclaration(nullptr,(yyvsp[0].pTypeDecl),nullptr); } break; - case 548: /* tuple_type: "name" ':' type_declaration */ + case 553: /* tuple_type: "name" ':' type_declaration */ { auto na = new vector(); na->push_back(VariableNameAndPosition{*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2]))}); @@ -9455,28 +9511,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 549: /* tuple_type_list: tuple_type */ + case 554: /* tuple_type_list: tuple_type */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 550: /* tuple_type_list: tuple_type_list "end of expression" tuple_type */ - { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } + case 555: /* tuple_type_list: tuple_type_list c_or_s tuple_type */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 551: /* tuple_alias_type_list: %empty */ + case 556: /* tuple_alias_type_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 552: /* tuple_alias_type_list: tuple_alias_type_list "end of expression" */ - { + case 557: /* tuple_alias_type_list: tuple_alias_type_list c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 553: /* tuple_alias_type_list: tuple_alias_type_list tuple_type "end of expression" */ - { + case 558: /* tuple_alias_type_list: tuple_alias_type_list tuple_type c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); /* if ( !yyextra->g_CommentReaders.empty() ) { @@ -9491,7 +9547,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 554: /* variant_type: "name" ':' type_declaration */ + case 559: /* variant_type: "name" ':' type_declaration */ { auto na = new vector(); na->push_back(VariableNameAndPosition{*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2]))}); @@ -9500,28 +9556,28 @@ YYLTYPE yylloc = yyloc_default; } break; - case 555: /* variant_type_list: variant_type */ + case 560: /* variant_type_list: variant_type */ { (yyval.pVarDeclList) = new vector(); (yyval.pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 556: /* variant_type_list: variant_type_list "end of expression" variant_type */ - { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } + case 561: /* variant_type_list: variant_type_list c_or_s variant_type */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[0].pVarDecl)); } break; - case 557: /* variant_alias_type_list: %empty */ + case 562: /* variant_alias_type_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 558: /* variant_alias_type_list: variant_alias_type_list "end of expression" */ - { + case 563: /* variant_alias_type_list: variant_alias_type_list c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 559: /* variant_alias_type_list: variant_alias_type_list variant_type "end of expression" */ - { + case 564: /* variant_alias_type_list: variant_alias_type_list variant_type c_or_s */ + { (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); if ( !yyextra->g_CommentReaders.empty() ) { auto tokName = tokAt(scanner,(yylsp[-1])); @@ -9534,15 +9590,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 560: /* copy_or_move: '=' */ + case 565: /* copy_or_move: '=' */ { (yyval.b) = false; } break; - case 561: /* copy_or_move: "<-" */ + case 566: /* copy_or_move: "<-" */ { (yyval.b) = true; } break; - case 562: /* variable_declaration: variable_name_with_pos_list */ + case 567: /* variable_declaration: variable_name_with_pos_list */ { auto autoT = new TypeDecl(Type::autoinfer); autoT->at = tokAt(scanner,(yylsp[0])); @@ -9551,7 +9607,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 563: /* variable_declaration: variable_name_with_pos_list '&' */ + case 568: /* variable_declaration: variable_name_with_pos_list '&' */ { auto autoT = new TypeDecl(Type::autoinfer); autoT->at = tokAt(scanner,(yylsp[-1])); @@ -9560,20 +9616,20 @@ YYLTYPE yylloc = yyloc_default; } break; - case 564: /* variable_declaration: variable_name_with_pos_list ':' type_declaration */ + case 569: /* variable_declaration: variable_name_with_pos_list ':' type_declaration */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),(yyvsp[0].pTypeDecl),nullptr); } break; - case 565: /* variable_declaration: variable_name_with_pos_list ':' type_declaration copy_or_move expr */ + case 570: /* variable_declaration: variable_name_with_pos_list ':' type_declaration copy_or_move expr */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); } break; - case 566: /* variable_declaration: variable_name_with_pos_list copy_or_move expr */ + case 571: /* variable_declaration: variable_name_with_pos_list copy_or_move expr */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-2])); @@ -9582,7 +9638,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 567: /* variable_declaration: variable_name_with_pos_list copy_or_move expr_pipe */ + case 572: /* variable_declaration: variable_name_with_pos_list copy_or_move expr_pipe */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-2])); @@ -9591,27 +9647,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 568: /* copy_or_move_or_clone: '=' */ + case 573: /* copy_or_move_or_clone: '=' */ { (yyval.i) = CorM_COPY; } break; - case 569: /* copy_or_move_or_clone: "<-" */ + case 574: /* copy_or_move_or_clone: "<-" */ { (yyval.i) = CorM_MOVE; } break; - case 570: /* copy_or_move_or_clone: ":=" */ + case 575: /* copy_or_move_or_clone: ":=" */ { (yyval.i) = CorM_CLONE; } break; - case 571: /* optional_ref: %empty */ + case 576: /* optional_ref: %empty */ { (yyval.b) = false; } break; - case 572: /* optional_ref: '&' */ + case 577: /* optional_ref: '&' */ { (yyval.b) = true; } break; - case 573: /* let_variable_name_with_pos_list: "name" */ + case 578: /* let_variable_name_with_pos_list: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -9621,7 +9677,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 574: /* let_variable_name_with_pos_list: "$i" '(' expr ')' */ + case 579: /* let_variable_name_with_pos_list: "$i" '(' expr ')' */ { auto pSL = new vector(); pSL->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),ExpressionPtr((yyvsp[-1].pExpression))}); @@ -9629,7 +9685,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 575: /* let_variable_name_with_pos_list: "name" "aka" "name" */ + case 580: /* let_variable_name_with_pos_list: "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -9641,7 +9697,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 576: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" */ + case 581: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition{*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0]))}); @@ -9650,7 +9706,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 577: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" "aka" "name" */ + case 582: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -9661,13 +9717,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 578: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ + case 583: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),(yyvsp[-1].pTypeDecl),nullptr); } break; - case 579: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ + case 584: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr "end of expression" */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameWithPosList),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; @@ -9675,7 +9731,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 580: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr_pipe */ + case 585: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr_pipe */ { (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; @@ -9683,7 +9739,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 581: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ + case 586: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr "end of expression" */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-4])); @@ -9694,7 +9750,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 582: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr_pipe */ + case 587: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr_pipe */ { auto typeDecl = new TypeDecl(Type::autoinfer); typeDecl->at = tokAt(scanner,(yylsp[-3])); @@ -9705,13 +9761,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 583: /* global_variable_declaration_list: %empty */ + case 588: /* global_variable_declaration_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 584: /* $@37: %empty */ + case 589: /* $@37: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9720,7 +9776,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 585: /* global_variable_declaration_list: global_variable_declaration_list $@37 optional_field_annotation let_variable_declaration */ + case 590: /* global_variable_declaration_list: global_variable_declaration_list $@37 optional_field_annotation let_variable_declaration */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9735,33 +9791,33 @@ YYLTYPE yylloc = yyloc_default; } break; - case 586: /* optional_shared: %empty */ + case 591: /* optional_shared: %empty */ { (yyval.b) = false; } break; - case 587: /* optional_shared: "shared" */ + case 592: /* optional_shared: "shared" */ { (yyval.b) = true; } break; - case 588: /* optional_public_or_private_variable: %empty */ + case 593: /* optional_public_or_private_variable: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 589: /* optional_public_or_private_variable: "private" */ + case 594: /* optional_public_or_private_variable: "private" */ { (yyval.b) = false; } break; - case 590: /* optional_public_or_private_variable: "public" */ + case 595: /* optional_public_or_private_variable: "public" */ { (yyval.b) = true; } break; - case 591: /* global_let: kwd_let optional_shared optional_public_or_private_variable "begin of code block" global_variable_declaration_list "end of code block" */ + case 596: /* global_let: kwd_let optional_shared optional_public_or_private_variable "begin of code block" global_variable_declaration_list "end of code block" */ { ast_globalLetList(scanner,(yyvsp[-5].b),(yyvsp[-4].b),(yyvsp[-3].b),(yyvsp[-1].pVarDeclList)); } break; - case 592: /* $@38: %empty */ + case 597: /* $@38: %empty */ { yyextra->das_force_oxford_comma=true; if ( !yyextra->g_CommentReaders.empty() ) { @@ -9771,7 +9827,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 593: /* global_let: kwd_let optional_shared optional_public_or_private_variable $@38 optional_field_annotation let_variable_declaration */ + case 598: /* global_let: kwd_let optional_shared optional_public_or_private_variable $@38 optional_field_annotation let_variable_declaration */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9784,19 +9840,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 594: /* enum_list: %empty */ + case 599: /* enum_list: %empty */ { (yyval.pEnum) = new Enumeration(); } break; - case 595: /* enum_list: enum_list "end of expression" */ + case 600: /* enum_list: enum_list "end of expression" */ { (yyval.pEnum) = (yyvsp[-1].pEnum); } break; - case 596: /* enum_list: enum_list "name" "end of expression" */ + case 601: /* enum_list: enum_list "name" "end of expression" */ { das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); if ( !(yyvsp[-2].pEnum)->add(*(yyvsp[-1].s),nullptr,tokAt(scanner,(yylsp[-1]))) ) { @@ -9814,7 +9870,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 597: /* enum_list: enum_list "name" '=' expr "end of expression" */ + case 602: /* enum_list: enum_list "name" '=' expr "end of expression" */ { das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); if ( !(yyvsp[-4].pEnum)->add(*(yyvsp[-3].s),ExpressionPtr((yyvsp[-1].pExpression)),tokAt(scanner,(yylsp[-3]))) ) { @@ -9832,19 +9888,19 @@ YYLTYPE yylloc = yyloc_default; } break; - case 598: /* optional_public_or_private_alias: %empty */ + case 603: /* optional_public_or_private_alias: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 599: /* optional_public_or_private_alias: "private" */ + case 604: /* optional_public_or_private_alias: "private" */ { (yyval.b) = false; } break; - case 600: /* optional_public_or_private_alias: "public" */ + case 605: /* optional_public_or_private_alias: "public" */ { (yyval.b) = true; } break; - case 601: /* $@39: %empty */ + case 606: /* $@39: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[0])); @@ -9853,7 +9909,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 602: /* single_alias: optional_public_or_private_alias "name" $@39 '=' type_declaration */ + case 607: /* single_alias: optional_public_or_private_alias "name" $@39 '=' type_declaration */ { das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); (yyvsp[0].pTypeDecl)->isPrivateAlias = !(yyvsp[-4].b); @@ -9874,23 +9930,23 @@ YYLTYPE yylloc = yyloc_default; } break; - case 606: /* $@40: %empty */ + case 611: /* $@40: %empty */ { yyextra->das_force_oxford_comma=true;} break; - case 608: /* optional_public_or_private_enum: %empty */ + case 613: /* optional_public_or_private_enum: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 609: /* optional_public_or_private_enum: "private" */ + case 614: /* optional_public_or_private_enum: "private" */ { (yyval.b) = false; } break; - case 610: /* optional_public_or_private_enum: "public" */ + case 615: /* optional_public_or_private_enum: "public" */ { (yyval.b) = true; } break; - case 611: /* enum_name: "name" */ + case 616: /* enum_name: "name" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[0])); @@ -9900,7 +9956,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 612: /* $@41: %empty */ + case 617: /* $@41: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -9909,7 +9965,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 613: /* $@42: %empty */ + case 618: /* $@42: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9918,7 +9974,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 614: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name "begin of code block" $@41 enum_list $@42 "end of code block" */ + case 619: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name "begin of code block" $@41 enum_list $@42 "end of code block" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[-2])); @@ -9928,7 +9984,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 615: /* $@43: %empty */ + case 620: /* $@43: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-3])); @@ -9937,7 +9993,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 616: /* $@44: %empty */ + case 621: /* $@44: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[0])); @@ -9946,7 +10002,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 617: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name ':' enum_basic_type_declaration "begin of code block" $@43 enum_list $@44 "end of code block" */ + case 622: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name ':' enum_basic_type_declaration "begin of code block" $@43 enum_list $@44 "end of code block" */ { if ( !yyextra->g_CommentReaders.empty() ) { auto pubename = tokAt(scanner,(yylsp[-2])); @@ -9956,61 +10012,61 @@ YYLTYPE yylloc = yyloc_default; } break; - case 618: /* optional_structure_parent: %empty */ + case 623: /* optional_structure_parent: %empty */ { (yyval.s) = nullptr; } break; - case 619: /* optional_structure_parent: ':' name_in_namespace */ + case 624: /* optional_structure_parent: ':' name_in_namespace */ { (yyval.s) = (yyvsp[0].s); } break; - case 620: /* optional_sealed: %empty */ + case 625: /* optional_sealed: %empty */ { (yyval.b) = false; } break; - case 621: /* optional_sealed: "sealed" */ + case 626: /* optional_sealed: "sealed" */ { (yyval.b) = true; } break; - case 622: /* structure_name: optional_sealed "name" optional_structure_parent */ + case 627: /* structure_name: optional_sealed "name" optional_structure_parent */ { (yyval.pStructure) = ast_structureName(scanner,(yyvsp[-2].b),(yyvsp[-1].s),tokAt(scanner,(yylsp[-1])),(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); } break; - case 623: /* class_or_struct: "class" */ + case 628: /* class_or_struct: "class" */ { (yyval.b) = true; } break; - case 624: /* class_or_struct: "struct" */ + case 629: /* class_or_struct: "struct" */ { (yyval.b) = false; } break; - case 625: /* optional_public_or_private_structure: %empty */ + case 630: /* optional_public_or_private_structure: %empty */ { (yyval.b) = yyextra->g_Program->thisModule->isPublic; } break; - case 626: /* optional_public_or_private_structure: "private" */ + case 631: /* optional_public_or_private_structure: "private" */ { (yyval.b) = false; } break; - case 627: /* optional_public_or_private_structure: "public" */ + case 632: /* optional_public_or_private_structure: "public" */ { (yyval.b) = true; } break; - case 628: /* optional_struct_variable_declaration_list: %empty */ + case 633: /* optional_struct_variable_declaration_list: %empty */ { (yyval.pVarDeclList) = new vector(); } break; - case 629: /* optional_struct_variable_declaration_list: "begin of code block" struct_variable_declaration_list "end of code block" */ + case 634: /* optional_struct_variable_declaration_list: "begin of code block" struct_variable_declaration_list "end of code block" */ { (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; - case 630: /* $@45: %empty */ + case 635: /* $@45: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto tak = tokAt(scanner,(yylsp[-1])); @@ -10019,11 +10075,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 631: /* $@46: %empty */ + case 636: /* $@46: %empty */ { if ( (yyvsp[0].pStructure) ) { (yyvsp[0].pStructure)->isClass = (yyvsp[-3].b); (yyvsp[0].pStructure)->privateStructure = !(yyvsp[-2].b); } } break; - case 632: /* structure_declaration: optional_annotation_list class_or_struct optional_public_or_private_structure $@45 structure_name $@46 optional_struct_variable_declaration_list */ + case 637: /* structure_declaration: optional_annotation_list class_or_struct optional_public_or_private_structure $@45 structure_name $@46 optional_struct_variable_declaration_list */ { if ( (yyvsp[-2].pStructure) ) { ast_structureDeclaration ( scanner, (yyvsp[-6].faList), tokAt(scanner,(yylsp[-5])), (yyvsp[-2].pStructure), tokAt(scanner,(yylsp[-2])), (yyvsp[0].pVarDeclList) ); @@ -10037,7 +10093,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 633: /* variable_name_with_pos_list: "name" */ + case 638: /* variable_name_with_pos_list: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -10047,7 +10103,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 634: /* variable_name_with_pos_list: "$i" '(' expr ')' */ + case 639: /* variable_name_with_pos_list: "$i" '(' expr ')' */ { auto pSL = new vector(); pSL->push_back(VariableNameAndPosition{"``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression)}); @@ -10055,7 +10111,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 635: /* variable_name_with_pos_list: "name" "aka" "name" */ + case 640: /* variable_name_with_pos_list: "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -10067,7 +10123,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 636: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" */ + case 641: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition{*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0]))}); @@ -10076,7 +10132,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 637: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" "aka" "name" */ + case 642: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" "aka" "name" */ { das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); @@ -10087,147 +10143,147 @@ YYLTYPE yylloc = yyloc_default; } break; - case 638: /* basic_type_declaration: "bool" */ + case 643: /* basic_type_declaration: "bool" */ { (yyval.type) = Type::tBool; } break; - case 639: /* basic_type_declaration: "string" */ + case 644: /* basic_type_declaration: "string" */ { (yyval.type) = Type::tString; } break; - case 640: /* basic_type_declaration: "int" */ + case 645: /* basic_type_declaration: "int" */ { (yyval.type) = Type::tInt; } break; - case 641: /* basic_type_declaration: "int8" */ + case 646: /* basic_type_declaration: "int8" */ { (yyval.type) = Type::tInt8; } break; - case 642: /* basic_type_declaration: "int16" */ + case 647: /* basic_type_declaration: "int16" */ { (yyval.type) = Type::tInt16; } break; - case 643: /* basic_type_declaration: "int64" */ + case 648: /* basic_type_declaration: "int64" */ { (yyval.type) = Type::tInt64; } break; - case 644: /* basic_type_declaration: "int2" */ + case 649: /* basic_type_declaration: "int2" */ { (yyval.type) = Type::tInt2; } break; - case 645: /* basic_type_declaration: "int3" */ + case 650: /* basic_type_declaration: "int3" */ { (yyval.type) = Type::tInt3; } break; - case 646: /* basic_type_declaration: "int4" */ + case 651: /* basic_type_declaration: "int4" */ { (yyval.type) = Type::tInt4; } break; - case 647: /* basic_type_declaration: "uint" */ + case 652: /* basic_type_declaration: "uint" */ { (yyval.type) = Type::tUInt; } break; - case 648: /* basic_type_declaration: "uint8" */ + case 653: /* basic_type_declaration: "uint8" */ { (yyval.type) = Type::tUInt8; } break; - case 649: /* basic_type_declaration: "uint16" */ + case 654: /* basic_type_declaration: "uint16" */ { (yyval.type) = Type::tUInt16; } break; - case 650: /* basic_type_declaration: "uint64" */ + case 655: /* basic_type_declaration: "uint64" */ { (yyval.type) = Type::tUInt64; } break; - case 651: /* basic_type_declaration: "uint2" */ + case 656: /* basic_type_declaration: "uint2" */ { (yyval.type) = Type::tUInt2; } break; - case 652: /* basic_type_declaration: "uint3" */ + case 657: /* basic_type_declaration: "uint3" */ { (yyval.type) = Type::tUInt3; } break; - case 653: /* basic_type_declaration: "uint4" */ + case 658: /* basic_type_declaration: "uint4" */ { (yyval.type) = Type::tUInt4; } break; - case 654: /* basic_type_declaration: "float" */ + case 659: /* basic_type_declaration: "float" */ { (yyval.type) = Type::tFloat; } break; - case 655: /* basic_type_declaration: "float2" */ + case 660: /* basic_type_declaration: "float2" */ { (yyval.type) = Type::tFloat2; } break; - case 656: /* basic_type_declaration: "float3" */ + case 661: /* basic_type_declaration: "float3" */ { (yyval.type) = Type::tFloat3; } break; - case 657: /* basic_type_declaration: "float4" */ + case 662: /* basic_type_declaration: "float4" */ { (yyval.type) = Type::tFloat4; } break; - case 658: /* basic_type_declaration: "void" */ + case 663: /* basic_type_declaration: "void" */ { (yyval.type) = Type::tVoid; } break; - case 659: /* basic_type_declaration: "range" */ + case 664: /* basic_type_declaration: "range" */ { (yyval.type) = Type::tRange; } break; - case 660: /* basic_type_declaration: "urange" */ + case 665: /* basic_type_declaration: "urange" */ { (yyval.type) = Type::tURange; } break; - case 661: /* basic_type_declaration: "range64" */ + case 666: /* basic_type_declaration: "range64" */ { (yyval.type) = Type::tRange64; } break; - case 662: /* basic_type_declaration: "urange64" */ + case 667: /* basic_type_declaration: "urange64" */ { (yyval.type) = Type::tURange64; } break; - case 663: /* basic_type_declaration: "double" */ + case 668: /* basic_type_declaration: "double" */ { (yyval.type) = Type::tDouble; } break; - case 664: /* basic_type_declaration: "bitfield" */ + case 669: /* basic_type_declaration: "bitfield" */ { (yyval.type) = Type::tBitfield; } break; - case 665: /* enum_basic_type_declaration: "int" */ + case 670: /* enum_basic_type_declaration: "int" */ { (yyval.type) = Type::tInt; } break; - case 666: /* enum_basic_type_declaration: "int8" */ + case 671: /* enum_basic_type_declaration: "int8" */ { (yyval.type) = Type::tInt8; } break; - case 667: /* enum_basic_type_declaration: "int16" */ + case 672: /* enum_basic_type_declaration: "int16" */ { (yyval.type) = Type::tInt16; } break; - case 668: /* enum_basic_type_declaration: "uint" */ + case 673: /* enum_basic_type_declaration: "uint" */ { (yyval.type) = Type::tUInt; } break; - case 669: /* enum_basic_type_declaration: "uint8" */ + case 674: /* enum_basic_type_declaration: "uint8" */ { (yyval.type) = Type::tUInt8; } break; - case 670: /* enum_basic_type_declaration: "uint16" */ + case 675: /* enum_basic_type_declaration: "uint16" */ { (yyval.type) = Type::tUInt16; } break; - case 671: /* enum_basic_type_declaration: "int64" */ + case 676: /* enum_basic_type_declaration: "int64" */ { (yyval.type) = Type::tInt64; } break; - case 672: /* enum_basic_type_declaration: "uint64" */ + case 677: /* enum_basic_type_declaration: "uint64" */ { (yyval.type) = Type::tUInt64; } break; - case 673: /* structure_type_declaration: name_in_namespace */ + case 678: /* structure_type_declaration: name_in_namespace */ { (yyval.pTypeDecl) = yyextra->g_Program->makeTypeDeclaration(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); if ( !(yyval.pTypeDecl) ) { @@ -10238,14 +10294,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 674: /* auto_type_declaration: "auto" */ + case 679: /* auto_type_declaration: "auto" */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 675: /* auto_type_declaration: "auto" '(' "name" ')' */ + case 680: /* auto_type_declaration: "auto" '(' "name" ')' */ { das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); @@ -10255,7 +10311,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 676: /* auto_type_declaration: "$t" '(' expr ')' */ + case 681: /* auto_type_declaration: "$t" '(' expr ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::alias); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); @@ -10267,7 +10323,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 677: /* bitfield_bits: "name" */ + case 682: /* bitfield_bits: "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); auto pSL = new vector(); @@ -10277,7 +10333,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 678: /* bitfield_bits: bitfield_bits "end of expression" "name" */ + case 683: /* bitfield_bits: bitfield_bits "end of expression" "name" */ { das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); @@ -10286,7 +10342,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 679: /* bitfield_alias_bits: %empty */ + case 684: /* bitfield_alias_bits: %empty */ { auto pSL = new vector(); (yyval.pNameList) = pSL; @@ -10294,13 +10350,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 680: /* bitfield_alias_bits: bitfield_alias_bits "end of expression" */ + case 685: /* bitfield_alias_bits: bitfield_alias_bits "end of expression" */ { (yyval.pNameList) = (yyvsp[-1].pNameList); } break; - case 681: /* bitfield_alias_bits: bitfield_alias_bits "name" "end of expression" */ + case 686: /* bitfield_alias_bits: bitfield_alias_bits "name" "end of expression" */ { das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); (yyvsp[-2].pNameList)->push_back(*(yyvsp[-1].s)); @@ -10313,15 +10369,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 682: /* $@47: %empty */ + case 687: /* $@47: %empty */ { yyextra->das_arrow_depth ++; } break; - case 683: /* $@48: %empty */ + case 688: /* $@48: %empty */ { yyextra->das_arrow_depth --; } break; - case 684: /* bitfield_type_declaration: "bitfield" '<' $@47 bitfield_bits '>' $@48 */ + case 689: /* bitfield_type_declaration: "bitfield" '<' $@47 bitfield_bits '>' $@48 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBitfield); (yyval.pTypeDecl)->argNames = *(yyvsp[-2].pNameList); @@ -10334,51 +10390,51 @@ YYLTYPE yylloc = yyloc_default; } break; - case 685: /* table_type_pair: type_declaration */ + case 692: /* table_type_pair: type_declaration */ { (yyval.aTypePair).firstType = (yyvsp[0].pTypeDecl); (yyval.aTypePair).secondType = new TypeDecl(Type::tVoid); } break; - case 686: /* table_type_pair: type_declaration "end of expression" type_declaration */ - { + case 693: /* table_type_pair: type_declaration c_or_s type_declaration */ + { (yyval.aTypePair).firstType = (yyvsp[-2].pTypeDecl); (yyval.aTypePair).secondType = (yyvsp[0].pTypeDecl); } break; - case 687: /* dim_list: '[' expr ']' */ + case 694: /* dim_list: '[' expr ']' */ { (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; - case 688: /* dim_list: dim_list '[' expr ']' */ + case 695: /* dim_list: dim_list '[' expr ']' */ { (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; - case 689: /* type_declaration_no_options: basic_type_declaration */ + case 696: /* type_declaration_no_options: basic_type_declaration */ { (yyval.pTypeDecl) = new TypeDecl((yyvsp[0].type)); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 690: /* type_declaration_no_options: auto_type_declaration */ + case 697: /* type_declaration_no_options: auto_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 691: /* type_declaration_no_options: bitfield_type_declaration */ + case 698: /* type_declaration_no_options: bitfield_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 692: /* type_declaration_no_options: structure_type_declaration */ + case 699: /* type_declaration_no_options: structure_type_declaration */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 693: /* type_declaration_no_options: type_declaration_no_options dim_list */ + case 700: /* type_declaration_no_options: type_declaration_no_options dim_list */ { if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeDecl ) { das_yyerror(scanner,"type declaration can`t be used as array base type",tokAt(scanner,(yylsp[-1])), @@ -10396,7 +10452,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 694: /* type_declaration_no_options: type_declaration_no_options '[' ']' */ + case 701: /* type_declaration_no_options: type_declaration_no_options '[' ']' */ { (yyvsp[-2].pTypeDecl)->dim.push_back(TypeDecl::dimAuto); (yyvsp[-2].pTypeDecl)->dimExpr.push_back(nullptr); @@ -10405,22 +10461,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 695: /* $@49: %empty */ + case 702: /* $@49: %empty */ { yyextra->das_arrow_depth ++; } break; - case 696: /* $@50: %empty */ + case 703: /* $@50: %empty */ { yyextra->das_arrow_depth --; } break; - case 697: /* type_declaration_no_options: "type" '<' $@49 type_declaration '>' $@50 */ + case 704: /* type_declaration_no_options: "type" '<' $@49 type_declaration '>' $@50 */ { (yyvsp[-2].pTypeDecl)->autoToAlias = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 698: /* type_declaration_no_options: "typedecl" '(' expr ')' */ + case 705: /* type_declaration_no_options: "typedecl" '(' expr ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeDecl); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[-1])); @@ -10428,7 +10484,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 699: /* type_declaration_no_options: '$' name_in_namespace '(' optional_expr_list ')' */ + case 706: /* type_declaration_no_options: '$' name_in_namespace '(' optional_expr_list ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]), (yylsp[-1])); @@ -10438,11 +10494,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 700: /* $@51: %empty */ + case 707: /* $@51: %empty */ { yyextra->das_arrow_depth ++; } break; - case 701: /* type_declaration_no_options: '$' name_in_namespace '<' $@51 type_declaration_no_options_list '>' '(' optional_expr_list ')' */ + case 708: /* type_declaration_no_options: '$' name_in_namespace '<' $@51 type_declaration_no_options_list '>' '(' optional_expr_list ')' */ { (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])); @@ -10452,21 +10508,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 702: /* type_declaration_no_options: type_declaration_no_options '-' '[' ']' */ + case 709: /* type_declaration_no_options: type_declaration_no_options '-' '[' ']' */ { (yyvsp[-3].pTypeDecl)->removeDim = true; (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); } break; - case 703: /* type_declaration_no_options: type_declaration_no_options "explicit" */ + case 710: /* type_declaration_no_options: type_declaration_no_options "explicit" */ { (yyvsp[-1].pTypeDecl)->isExplicit = true; (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); } break; - case 704: /* type_declaration_no_options: type_declaration_no_options "const" */ + case 711: /* type_declaration_no_options: type_declaration_no_options "const" */ { (yyvsp[-1].pTypeDecl)->constant = true; (yyvsp[-1].pTypeDecl)->removeConstant = false; @@ -10474,7 +10530,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 705: /* type_declaration_no_options: type_declaration_no_options '-' "const" */ + case 712: /* type_declaration_no_options: type_declaration_no_options '-' "const" */ { (yyvsp[-2].pTypeDecl)->constant = false; (yyvsp[-2].pTypeDecl)->removeConstant = true; @@ -10482,7 +10538,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 706: /* type_declaration_no_options: type_declaration_no_options '&' */ + case 713: /* type_declaration_no_options: type_declaration_no_options '&' */ { (yyvsp[-1].pTypeDecl)->ref = true; (yyvsp[-1].pTypeDecl)->removeRef = false; @@ -10490,7 +10546,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 707: /* type_declaration_no_options: type_declaration_no_options '-' '&' */ + case 714: /* type_declaration_no_options: type_declaration_no_options '-' '&' */ { (yyvsp[-2].pTypeDecl)->ref = false; (yyvsp[-2].pTypeDecl)->removeRef = true; @@ -10498,21 +10554,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 708: /* type_declaration_no_options: type_declaration_no_options '#' */ + case 715: /* type_declaration_no_options: type_declaration_no_options '#' */ { (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); (yyval.pTypeDecl)->temporary = true; } break; - case 709: /* type_declaration_no_options: type_declaration_no_options "implicit" */ + case 716: /* type_declaration_no_options: type_declaration_no_options "implicit" */ { (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); (yyval.pTypeDecl)->implicit = true; } break; - case 710: /* type_declaration_no_options: type_declaration_no_options '-' '#' */ + case 717: /* type_declaration_no_options: type_declaration_no_options '-' '#' */ { (yyvsp[-2].pTypeDecl)->temporary = false; (yyvsp[-2].pTypeDecl)->removeTemporary = true; @@ -10520,21 +10576,21 @@ YYLTYPE yylloc = yyloc_default; } break; - case 711: /* type_declaration_no_options: type_declaration_no_options "==" "const" */ + case 718: /* type_declaration_no_options: type_declaration_no_options "==" "const" */ { (yyvsp[-2].pTypeDecl)->explicitConst = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 712: /* type_declaration_no_options: type_declaration_no_options "==" '&' */ + case 719: /* type_declaration_no_options: type_declaration_no_options "==" '&' */ { (yyvsp[-2].pTypeDecl)->explicitRef = true; (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; - case 713: /* type_declaration_no_options: type_declaration_no_options '?' */ + case 720: /* type_declaration_no_options: type_declaration_no_options '?' */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); @@ -10542,15 +10598,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 714: /* $@52: %empty */ + case 721: /* $@52: %empty */ { yyextra->das_arrow_depth ++; } break; - case 715: /* $@53: %empty */ + case 722: /* $@53: %empty */ { yyextra->das_arrow_depth --; } break; - case 716: /* type_declaration_no_options: "smart_ptr" '<' $@52 type_declaration '>' $@53 */ + case 723: /* type_declaration_no_options: "smart_ptr" '<' $@52 type_declaration '>' $@53 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10559,7 +10615,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 717: /* type_declaration_no_options: type_declaration_no_options "??" */ + case 724: /* type_declaration_no_options: type_declaration_no_options "??" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); @@ -10569,15 +10625,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 718: /* $@54: %empty */ + case 725: /* $@54: %empty */ { yyextra->das_arrow_depth ++; } break; - case 719: /* $@55: %empty */ + case 726: /* $@55: %empty */ { yyextra->das_arrow_depth --; } break; - case 720: /* type_declaration_no_options: "array" '<' $@54 type_declaration '>' $@55 */ + case 727: /* type_declaration_no_options: "array" '<' $@54 type_declaration '>' $@55 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tArray); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10585,15 +10641,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 721: /* $@56: %empty */ + case 728: /* $@56: %empty */ { yyextra->das_arrow_depth ++; } break; - case 722: /* $@57: %empty */ + case 729: /* $@57: %empty */ { yyextra->das_arrow_depth --; } break; - case 723: /* type_declaration_no_options: "table" '<' $@56 table_type_pair '>' $@57 */ + case 730: /* type_declaration_no_options: "table" '<' $@56 table_type_pair '>' $@57 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tTable); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10602,15 +10658,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 724: /* $@58: %empty */ + case 731: /* $@58: %empty */ { yyextra->das_arrow_depth ++; } break; - case 725: /* $@59: %empty */ + case 732: /* $@59: %empty */ { yyextra->das_arrow_depth --; } break; - case 726: /* type_declaration_no_options: "iterator" '<' $@58 type_declaration '>' $@59 */ + case 733: /* type_declaration_no_options: "iterator" '<' $@58 type_declaration '>' $@59 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tIterator); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10618,22 +10674,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 727: /* type_declaration_no_options: "block" */ + case 734: /* type_declaration_no_options: "block" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 728: /* $@60: %empty */ + case 735: /* $@60: %empty */ { yyextra->das_arrow_depth ++; } break; - case 729: /* $@61: %empty */ + case 736: /* $@61: %empty */ { yyextra->das_arrow_depth --; } break; - case 730: /* type_declaration_no_options: "block" '<' $@60 type_declaration '>' $@61 */ + case 737: /* type_declaration_no_options: "block" '<' $@60 type_declaration '>' $@61 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10641,15 +10697,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 731: /* $@62: %empty */ + case 738: /* $@62: %empty */ { yyextra->das_arrow_depth ++; } break; - case 732: /* $@63: %empty */ + case 739: /* $@63: %empty */ { yyextra->das_arrow_depth --; } break; - case 733: /* type_declaration_no_options: "block" '<' $@62 optional_function_argument_list optional_function_type '>' $@63 */ + case 740: /* type_declaration_no_options: "block" '<' $@62 optional_function_argument_list optional_function_type '>' $@63 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -10661,22 +10717,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 734: /* type_declaration_no_options: "function" */ + case 741: /* type_declaration_no_options: "function" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 735: /* $@64: %empty */ + case 742: /* $@64: %empty */ { yyextra->das_arrow_depth ++; } break; - case 736: /* $@65: %empty */ + case 743: /* $@65: %empty */ { yyextra->das_arrow_depth --; } break; - case 737: /* type_declaration_no_options: "function" '<' $@64 type_declaration '>' $@65 */ + case 744: /* type_declaration_no_options: "function" '<' $@64 type_declaration '>' $@65 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10684,15 +10740,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 738: /* $@66: %empty */ + case 745: /* $@66: %empty */ { yyextra->das_arrow_depth ++; } break; - case 739: /* $@67: %empty */ + case 746: /* $@67: %empty */ { yyextra->das_arrow_depth --; } break; - case 740: /* type_declaration_no_options: "function" '<' $@66 optional_function_argument_list optional_function_type '>' $@67 */ + case 747: /* type_declaration_no_options: "function" '<' $@66 optional_function_argument_list optional_function_type '>' $@67 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -10704,22 +10760,22 @@ YYLTYPE yylloc = yyloc_default; } break; - case 741: /* type_declaration_no_options: "lambda" */ + case 748: /* type_declaration_no_options: "lambda" */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; - case 742: /* $@68: %empty */ + case 749: /* $@68: %empty */ { yyextra->das_arrow_depth ++; } break; - case 743: /* $@69: %empty */ + case 750: /* $@69: %empty */ { yyextra->das_arrow_depth --; } break; - case 744: /* type_declaration_no_options: "lambda" '<' $@68 type_declaration '>' $@69 */ + case 751: /* type_declaration_no_options: "lambda" '<' $@68 type_declaration '>' $@69 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10727,15 +10783,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 745: /* $@70: %empty */ + case 752: /* $@70: %empty */ { yyextra->das_arrow_depth ++; } break; - case 746: /* $@71: %empty */ + case 753: /* $@71: %empty */ { yyextra->das_arrow_depth --; } break; - case 747: /* type_declaration_no_options: "lambda" '<' $@70 optional_function_argument_list optional_function_type '>' $@71 */ + case 754: /* type_declaration_no_options: "lambda" '<' $@70 optional_function_argument_list optional_function_type '>' $@71 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); @@ -10747,15 +10803,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 748: /* $@72: %empty */ + case 755: /* $@72: %empty */ { yyextra->das_arrow_depth ++; } break; - case 749: /* $@73: %empty */ + case 756: /* $@73: %empty */ { yyextra->das_arrow_depth --; } break; - case 750: /* type_declaration_no_options: "tuple" '<' $@72 tuple_type_list '>' $@73 */ + case 757: /* type_declaration_no_options: "tuple" '<' $@72 tuple_type_list '>' $@73 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tTuple); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10764,15 +10820,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 751: /* $@74: %empty */ + case 758: /* $@74: %empty */ { yyextra->das_arrow_depth ++; } break; - case 752: /* $@75: %empty */ + case 759: /* $@75: %empty */ { yyextra->das_arrow_depth --; } break; - case 753: /* type_declaration_no_options: "variant" '<' $@74 variant_type_list '>' $@75 */ + case 760: /* type_declaration_no_options: "variant" '<' $@74 variant_type_list '>' $@75 */ { (yyval.pTypeDecl) = new TypeDecl(Type::tVariant); (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); @@ -10781,13 +10837,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 754: /* type_declaration: type_declaration_no_options */ + case 761: /* type_declaration: type_declaration_no_options */ { (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; - case 755: /* type_declaration: type_declaration '|' type_declaration_no_options */ + case 762: /* type_declaration: type_declaration '|' type_declaration_no_options */ { if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); @@ -10801,7 +10857,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 756: /* type_declaration: type_declaration '|' '#' */ + case 763: /* type_declaration: type_declaration '|' '#' */ { if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); @@ -10817,11 +10873,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 757: /* $@76: %empty */ + case 764: /* $@76: %empty */ { yyextra->das_need_oxford_comma=false; } break; - case 758: /* $@77: %empty */ + case 765: /* $@77: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -10830,7 +10886,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 759: /* $@78: %empty */ + case 766: /* $@78: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -10839,7 +10895,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 760: /* $@79: %empty */ + case 767: /* $@79: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-4])); @@ -10848,7 +10904,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 761: /* tuple_alias_declaration: "tuple" optional_public_or_private_alias $@76 "name" $@77 "begin of code block" $@78 tuple_alias_type_list $@79 "end of code block" */ + case 768: /* tuple_alias_declaration: "tuple" optional_public_or_private_alias $@76 "name" $@77 "begin of code block" $@78 tuple_alias_type_list $@79 "end of code block" */ { auto vtype = make_smart(Type::tTuple); vtype->alias = *(yyvsp[-6].s); @@ -10868,11 +10924,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 762: /* $@80: %empty */ + case 769: /* $@80: %empty */ { yyextra->das_need_oxford_comma=false; } break; - case 763: /* $@81: %empty */ + case 770: /* $@81: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -10881,7 +10937,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 764: /* $@82: %empty */ + case 771: /* $@82: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -10891,7 +10947,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 765: /* $@83: %empty */ + case 772: /* $@83: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-4])); @@ -10900,7 +10956,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 766: /* variant_alias_declaration: "variant" optional_public_or_private_alias $@80 "name" $@81 "begin of code block" $@82 variant_alias_type_list $@83 "end of code block" */ + case 773: /* variant_alias_declaration: "variant" optional_public_or_private_alias $@80 "name" $@81 "begin of code block" $@82 variant_alias_type_list $@83 "end of code block" */ { auto vtype = make_smart(Type::tVariant); vtype->alias = *(yyvsp[-6].s); @@ -10920,11 +10976,11 @@ YYLTYPE yylloc = yyloc_default; } break; - case 767: /* $@84: %empty */ + case 774: /* $@84: %empty */ { yyextra->das_need_oxford_comma=false; } break; - case 768: /* $@85: %empty */ + case 775: /* $@85: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[0])); @@ -10933,7 +10989,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 769: /* $@86: %empty */ + case 776: /* $@86: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-2])); @@ -10942,7 +10998,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 770: /* $@87: %empty */ + case 777: /* $@87: %empty */ { if ( !yyextra->g_CommentReaders.empty() ) { auto atvname = tokAt(scanner,(yylsp[-4])); @@ -10951,7 +11007,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 771: /* bitfield_alias_declaration: "bitfield" optional_public_or_private_alias $@84 "name" $@85 "begin of code block" $@86 bitfield_alias_bits $@87 "end of code block" */ + case 778: /* bitfield_alias_declaration: "bitfield" optional_public_or_private_alias $@84 "name" $@85 "begin of code block" $@86 bitfield_alias_bits $@87 "end of code block" */ { auto btype = make_smart(Type::tBitfield); btype->alias = *(yyvsp[-6].s); @@ -10975,27 +11031,27 @@ YYLTYPE yylloc = yyloc_default; } break; - case 772: /* make_decl: make_struct_decl */ + case 779: /* make_decl: make_struct_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 773: /* make_decl: make_dim_decl */ + case 780: /* make_decl: make_dim_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 774: /* make_decl: make_table_decl */ + case 781: /* make_decl: make_table_decl */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 775: /* make_decl: array_comprehension */ + case 782: /* make_decl: array_comprehension */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 776: /* make_decl: make_tuple_call */ + case 783: /* make_decl: make_tuple_call */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 777: /* make_struct_fields: "name" copy_or_move expr */ + case 784: /* make_struct_fields: "name" copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); delete (yyvsp[-2].s); @@ -11005,7 +11061,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 778: /* make_struct_fields: "name" ":=" expr */ + case 785: /* make_struct_fields: "name" ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),false,true); delete (yyvsp[-2].s); @@ -11015,7 +11071,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 779: /* make_struct_fields: make_struct_fields ',' "name" copy_or_move expr */ + case 786: /* make_struct_fields: make_struct_fields ',' "name" copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); delete (yyvsp[-2].s); @@ -11024,7 +11080,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 780: /* make_struct_fields: make_struct_fields ',' "name" ":=" expr */ + case 787: /* make_struct_fields: make_struct_fields ',' "name" ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s),ExpressionPtr((yyvsp[0].pExpression)),false,true); delete (yyvsp[-2].s); @@ -11033,7 +11089,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 781: /* make_struct_fields: "$f" '(' expr ')' copy_or_move expr */ + case 788: /* make_struct_fields: "$f" '(' expr ')' copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -11043,7 +11099,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 782: /* make_struct_fields: "$f" '(' expr ')' ":=" expr */ + case 789: /* make_struct_fields: "$f" '(' expr ')' ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),false,true); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -11053,7 +11109,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 783: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' copy_or_move expr */ + case 790: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' copy_or_move expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),(yyvsp[-1].b),false); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -11062,7 +11118,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 784: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' ":=" expr */ + case 791: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr ')' ":=" expr */ { auto mfd = make_smart(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``FIELD``",ExpressionPtr((yyvsp[0].pExpression)),false,true); mfd->tag = ExpressionPtr((yyvsp[-3].pExpression)); @@ -11071,13 +11127,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 785: /* make_variant_dim: make_struct_fields */ + case 792: /* make_variant_dim: make_struct_fields */ { (yyval.pExpression) = ast_makeStructToMakeVariant((yyvsp[0].pMakeStruct), tokAt(scanner,(yylsp[0]))); } break; - case 786: /* make_struct_single: make_struct_fields */ + case 793: /* make_struct_single: make_struct_fields */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); @@ -11085,7 +11141,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 787: /* make_struct_dim: make_struct_fields */ + case 794: /* make_struct_dim: make_struct_fields */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); @@ -11093,14 +11149,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 788: /* make_struct_dim: make_struct_dim "end of expression" make_struct_fields */ + case 795: /* make_struct_dim: make_struct_dim "end of expression" make_struct_fields */ { ((ExprMakeStruct *) (yyvsp[-2].pExpression))->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); (yyval.pExpression) = (yyvsp[-2].pExpression); } break; - case 789: /* make_struct_dim_list: '(' make_struct_fields ')' */ + case 796: /* make_struct_dim_list: '(' make_struct_fields ')' */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); @@ -11108,14 +11164,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 790: /* make_struct_dim_list: make_struct_dim_list ',' '(' make_struct_fields ')' */ + case 797: /* make_struct_dim_list: make_struct_dim_list ',' '(' make_struct_fields ')' */ { ((ExprMakeStruct *) (yyvsp[-4].pExpression))->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); (yyval.pExpression) = (yyvsp[-4].pExpression); } break; - case 791: /* make_struct_dim_decl: make_struct_fields */ + case 798: /* make_struct_dim_decl: make_struct_fields */ { auto msd = new ExprMakeStruct(); msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); @@ -11123,29 +11179,37 @@ YYLTYPE yylloc = yyloc_default; } break; - case 792: /* make_struct_dim_decl: make_struct_dim_list optional_comma */ + case 799: /* make_struct_dim_decl: make_struct_dim_list optional_comma */ { (yyval.pExpression) = (yyvsp[-1].pExpression); } break; - case 793: /* optional_block: %empty */ + case 800: /* optional_make_struct_dim_decl: make_struct_dim_decl */ + { (yyval.pExpression) = (yyvsp[0].pExpression); } + break; + + case 801: /* optional_make_struct_dim_decl: %empty */ + { (yyval.pExpression) = new ExprMakeStruct(); } + break; + + case 802: /* optional_block: %empty */ { (yyval.pExpression) = nullptr; } break; - case 794: /* optional_block: "where" expr_block */ + case 803: /* optional_block: "where" expr_block */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 807: /* use_initializer: %empty */ + case 816: /* use_initializer: %empty */ { (yyval.b) = true; } break; - case 808: /* use_initializer: "uninitialized" */ + case 817: /* use_initializer: "uninitialized" */ { (yyval.b) = false; } break; - case 809: /* make_struct_decl: "[[" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ + case 818: /* make_struct_decl: "[[" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ { ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = TypeDeclPtr((yyvsp[-3].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); @@ -11154,7 +11218,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 810: /* make_struct_decl: "[[" type_declaration_no_options optional_block optional_trailing_delim_sqr_sqr */ + case 819: /* make_struct_decl: "[[" type_declaration_no_options optional_block optional_trailing_delim_sqr_sqr */ { auto msd = new ExprMakeStruct(); msd->makeType = TypeDeclPtr((yyvsp[-2].pTypeDecl)); @@ -11164,7 +11228,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 811: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' optional_block optional_trailing_delim_sqr_sqr */ + case 820: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' optional_block optional_trailing_delim_sqr_sqr */ { auto msd = new ExprMakeStruct(); msd->makeType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); @@ -11175,7 +11239,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 812: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ + case 821: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ { ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; @@ -11185,7 +11249,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 813: /* make_struct_decl: "[{" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_cur_sqr */ + case 822: /* make_struct_decl: "[{" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_cur_sqr */ { ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = TypeDeclPtr((yyvsp[-3].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); @@ -11196,7 +11260,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 814: /* make_struct_decl: "[{" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_cur_sqr */ + case 823: /* make_struct_decl: "[{" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_cur_sqr */ { ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; @@ -11208,16 +11272,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 815: /* $@88: %empty */ + case 824: /* $@88: %empty */ { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } break; - case 816: /* $@89: %empty */ + case 825: /* $@89: %empty */ { yyextra->das_arrow_depth --; } break; - case 817: /* make_struct_decl: "struct" '<' $@88 type_declaration_no_options '>' $@89 '(' use_initializer make_struct_dim_decl ')' */ - { + case 826: /* make_struct_decl: "struct" '<' $@88 type_declaration_no_options '>' $@89 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -11227,16 +11291,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 818: /* $@90: %empty */ + case 827: /* $@90: %empty */ { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } break; - case 819: /* $@91: %empty */ + case 828: /* $@91: %empty */ { yyextra->das_arrow_depth --; } break; - case 820: /* make_struct_decl: "class" '<' $@90 type_declaration_no_options '>' $@91 '(' use_initializer make_struct_dim_decl ')' */ - { + case 829: /* make_struct_decl: "class" '<' $@90 type_declaration_no_options '>' $@91 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -11245,15 +11309,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 821: /* $@92: %empty */ + case 830: /* $@92: %empty */ { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } break; - case 822: /* $@93: %empty */ + case 831: /* $@93: %empty */ { yyextra->das_arrow_depth --; } break; - case 823: /* make_struct_decl: "variant" '<' $@92 type_declaration_no_options '>' $@93 '(' make_variant_dim ')' */ + case 832: /* make_struct_decl: "variant" '<' $@92 type_declaration_no_options '>' $@93 '(' make_variant_dim ')' */ { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-8])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); @@ -11263,15 +11327,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 824: /* $@94: %empty */ + case 833: /* $@94: %empty */ { yyextra->das_arrow_depth ++; } break; - case 825: /* $@95: %empty */ + case 834: /* $@95: %empty */ { yyextra->das_arrow_depth --; } break; - case 826: /* make_struct_decl: "default" '<' $@94 type_declaration_no_options '>' $@95 use_initializer */ + case 835: /* make_struct_decl: "default" '<' $@94 type_declaration_no_options '>' $@95 use_initializer */ { auto msd = new ExprMakeStruct(); msd->at = tokAt(scanner,(yylsp[-6])); @@ -11282,13 +11346,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 827: /* make_tuple: expr */ + case 836: /* make_tuple: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 828: /* make_tuple: expr "=>" expr */ + case 837: /* make_tuple: expr "=>" expr */ { ExprMakeTuple * mt = new ExprMakeTuple(tokAt(scanner,(yylsp[-1]))); mt->values.push_back(ExpressionPtr((yyvsp[-2].pExpression))); @@ -11297,7 +11361,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 829: /* make_tuple: make_tuple ',' expr */ + case 838: /* make_tuple: make_tuple ',' expr */ { ExprMakeTuple * mt; if ( (yyvsp[-2].pExpression)->rtti_isMakeTuple() ) { @@ -11311,7 +11375,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 830: /* make_map_tuple: expr "=>" expr */ + case 839: /* make_map_tuple: expr "=>" expr */ { ExprMakeTuple * mt = new ExprMakeTuple(tokAt(scanner,(yylsp[-1]))); mt->values.push_back(ExpressionPtr((yyvsp[-2].pExpression))); @@ -11320,13 +11384,13 @@ YYLTYPE yylloc = yyloc_default; } break; - case 831: /* make_map_tuple: expr */ + case 840: /* make_map_tuple: expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 832: /* make_tuple_call: "tuple" '(' expr_list optional_comma ')' */ + case 841: /* make_tuple_call: "tuple" '(' expr_list optional_comma ')' */ { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-4]))); mkt->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11335,16 +11399,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 833: /* $@96: %empty */ + case 842: /* $@96: %empty */ { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } break; - case 834: /* $@97: %empty */ + case 843: /* $@97: %empty */ { yyextra->das_arrow_depth --; } break; - case 835: /* make_tuple_call: "tuple" '<' $@96 type_declaration_no_options '>' $@97 '(' use_initializer make_struct_dim_decl ')' */ - { + case 844: /* make_tuple_call: "tuple" '<' $@96 type_declaration_no_options '>' $@97 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -11353,7 +11417,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 836: /* make_dim: make_tuple */ + case 845: /* make_dim: make_tuple */ { auto mka = new ExprMakeArray(); mka->values.push_back(ExpressionPtr((yyvsp[0].pExpression))); @@ -11361,14 +11425,14 @@ YYLTYPE yylloc = yyloc_default; } break; - case 837: /* make_dim: make_dim "end of expression" make_tuple */ + case 846: /* make_dim: make_dim "end of expression" make_tuple */ { ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back(ExpressionPtr((yyvsp[0].pExpression))); (yyval.pExpression) = (yyvsp[-2].pExpression); } break; - case 838: /* make_dim_decl: '[' expr_list optional_comma ']' */ + case 847: /* make_dim_decl: '[' expr_list optional_comma ']' */ { auto mka = make_smart(tokAt(scanner,(yylsp[-3]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11379,7 +11443,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 839: /* make_dim_decl: "[[" type_declaration_no_options make_dim optional_trailing_semicolon_sqr_sqr */ + case 848: /* make_dim_decl: "[[" type_declaration_no_options make_dim optional_trailing_semicolon_sqr_sqr */ { ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-2].pTypeDecl)); (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); @@ -11387,7 +11451,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 840: /* make_dim_decl: "[{" type_declaration_no_options make_dim optional_trailing_semicolon_cur_sqr */ + case 849: /* make_dim_decl: "[{" type_declaration_no_options make_dim optional_trailing_semicolon_cur_sqr */ { ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-2].pTypeDecl)); (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); @@ -11397,16 +11461,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 841: /* $@98: %empty */ + case 850: /* $@98: %empty */ { yyextra->das_arrow_depth ++; } break; - case 842: /* $@99: %empty */ + case 851: /* $@99: %empty */ { yyextra->das_arrow_depth --; } break; - case 843: /* make_dim_decl: "array" "struct" '<' $@98 type_declaration_no_options '>' $@99 '(' use_initializer make_struct_dim_decl ')' */ - { + case 852: /* make_dim_decl: "array" "struct" '<' $@98 type_declaration_no_options '>' $@99 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -11418,16 +11482,16 @@ YYLTYPE yylloc = yyloc_default; } break; - case 844: /* $@100: %empty */ + case 853: /* $@100: %empty */ { yyextra->das_arrow_depth ++; } break; - case 845: /* $@101: %empty */ + case 854: /* $@101: %empty */ { yyextra->das_arrow_depth --; } break; - case 846: /* make_dim_decl: "array" "tuple" '<' $@100 type_declaration_no_options '>' $@101 '(' use_initializer make_struct_dim_decl ')' */ - { + case 855: /* make_dim_decl: "array" "tuple" '<' $@100 type_declaration_no_options '>' $@101 '(' use_initializer optional_make_struct_dim_decl ')' */ + { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); @@ -11439,15 +11503,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 847: /* $@102: %empty */ + case 856: /* $@102: %empty */ { yyextra->das_arrow_depth ++; } break; - case 848: /* $@103: %empty */ + case 857: /* $@103: %empty */ { yyextra->das_arrow_depth --; } break; - case 849: /* make_dim_decl: "array" "variant" '<' $@102 type_declaration_no_options '>' $@103 '(' make_variant_dim ')' */ + case 858: /* make_dim_decl: "array" "variant" '<' $@102 type_declaration_no_options '>' $@103 '(' make_variant_dim ')' */ { (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); @@ -11460,7 +11524,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 850: /* make_dim_decl: "array" '(' expr_list optional_comma ')' */ + case 859: /* make_dim_decl: "array" '(' expr_list optional_comma ')' */ { auto mka = make_smart(tokAt(scanner,(yylsp[-4]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11471,26 +11535,37 @@ YYLTYPE yylloc = yyloc_default; } break; - case 851: /* $@104: %empty */ + case 860: /* $@104: %empty */ { yyextra->das_arrow_depth ++; } break; - case 852: /* $@105: %empty */ + case 861: /* $@105: %empty */ { yyextra->das_arrow_depth --; } break; - case 853: /* make_dim_decl: "array" '<' $@104 type_declaration_no_options '>' $@105 '(' expr_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-9]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_array_move"); - tam->arguments.push_back(mka); - (yyval.pExpression) = tam; + case 862: /* make_dim_decl: "array" '<' $@104 type_declaration_no_options '>' $@105 '(' optional_expr_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_array_move"); + tam->arguments.push_back(mka); + (yyval.pExpression) = tam; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = make_smart(Type::tArray); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); + msd->at = tokAt(scanner,(yylsp[-5])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 854: /* make_dim_decl: "fixed_array" '(' expr_list optional_comma ')' */ + case 863: /* make_dim_decl: "fixed_array" '(' expr_list optional_comma ')' */ { auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11500,15 +11575,15 @@ YYLTYPE yylloc = yyloc_default; } break; - case 855: /* $@106: %empty */ + case 864: /* $@106: %empty */ { yyextra->das_arrow_depth ++; } break; - case 856: /* $@107: %empty */ + case 865: /* $@107: %empty */ { yyextra->das_arrow_depth --; } break; - case 857: /* make_dim_decl: "fixed_array" '<' $@106 type_declaration_no_options '>' $@107 '(' expr_list optional_comma ')' */ + case 866: /* make_dim_decl: "fixed_array" '<' $@106 type_declaration_no_options '>' $@107 '(' expr_list optional_comma ')' */ { auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-9]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11518,7 +11593,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 858: /* make_table: make_map_tuple */ + case 867: /* make_table: make_map_tuple */ { auto mka = new ExprMakeArray(); mka->values.push_back(ExpressionPtr((yyvsp[0].pExpression))); @@ -11526,26 +11601,26 @@ YYLTYPE yylloc = yyloc_default; } break; - case 859: /* make_table: make_table "end of expression" make_map_tuple */ + case 868: /* make_table: make_table "end of expression" make_map_tuple */ { ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back(ExpressionPtr((yyvsp[0].pExpression))); (yyval.pExpression) = (yyvsp[-2].pExpression); } break; - case 860: /* expr_map_tuple_list: make_map_tuple */ + case 869: /* expr_map_tuple_list: make_map_tuple */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 861: /* expr_map_tuple_list: expr_map_tuple_list ',' make_map_tuple */ + case 870: /* expr_map_tuple_list: expr_map_tuple_list ',' make_map_tuple */ { (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),ExpressionPtr((yyvsp[-2].pExpression)),ExpressionPtr((yyvsp[0].pExpression))); } break; - case 862: /* make_table_decl: "begin of code block" expr_map_tuple_list optional_comma "end of code block" */ + case 871: /* make_table_decl: "begin of code block" expr_map_tuple_list optional_comma "end of code block" */ { auto mka = make_smart(tokAt(scanner,(yylsp[-3]))); mka->values = sequenceToList((yyvsp[-2].pExpression)); @@ -11556,7 +11631,7 @@ YYLTYPE yylloc = yyloc_default; } break; - case 863: /* make_table_decl: "{{" make_table optional_trailing_semicolon_cur_cur */ + case 872: /* make_table_decl: "{{" make_table optional_trailing_semicolon_cur_cur */ { auto mkt = make_smart(Type::autoinfer); mkt->dim.push_back(TypeDecl::dimAuto); @@ -11568,88 +11643,112 @@ YYLTYPE yylloc = yyloc_default; } break; - case 864: /* make_table_decl: "table" '(' expr_map_tuple_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-4]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); + case 873: /* make_table_decl: "table" '(' optional_expr_map_tuple_list ')' */ + { + auto mka = make_smart(tokAt(scanner,(yylsp[-3]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); mka->makeType = make_smart(Type::autoinfer); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-4])),"to_table_move"); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),"to_table_move"); ttm->arguments.push_back(mka); (yyval.pExpression) = ttm; } break; - case 865: /* make_table_decl: "table" '<' type_declaration_no_options '>' '(' expr_map_tuple_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-7]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = TypeDeclPtr((yyvsp[-5].pTypeDecl)); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-7])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; + case 874: /* make_table_decl: "table" '<' type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-6]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + msd->makeType->secondType = make_smart(Type::tVoid); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 866: /* make_table_decl: "table" '<' type_declaration_no_options "end of expression" type_declaration_no_options '>' '(' expr_map_tuple_list optional_comma ')' */ - { - auto mka = make_smart(tokAt(scanner,(yylsp[-9]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = make_smart(Type::tTuple); - mka->makeType->argTypes.push_back((yyvsp[-7].pTypeDecl)); - mka->makeType->argTypes.push_back((yyvsp[-5].pTypeDecl)); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; + case 875: /* make_table_decl: "table" '<' type_declaration_no_options c_or_s type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = make_smart(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = make_smart(Type::tTuple); + mka->makeType->argTypes.push_back((yyvsp[-6].pTypeDecl)); + mka->makeType->argTypes.push_back((yyvsp[-4].pTypeDecl)); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr((yyvsp[-6].pTypeDecl)); + msd->makeType->secondType = TypeDeclPtr((yyvsp[-4].pTypeDecl)); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; - case 867: /* array_comprehension_where: %empty */ + case 876: /* array_comprehension_where: %empty */ { (yyval.pExpression) = nullptr; } break; - case 868: /* array_comprehension_where: "end of expression" "where" expr */ + case 877: /* array_comprehension_where: "end of expression" "where" expr */ { (yyval.pExpression) = (yyvsp[0].pExpression); } break; - case 869: /* optional_comma: %empty */ + case 878: /* optional_comma: %empty */ { (yyval.b) = false; } break; - case 870: /* optional_comma: ',' */ + case 879: /* optional_comma: ',' */ { (yyval.b) = true; } break; - case 871: /* array_comprehension: '[' "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ + case 880: /* array_comprehension: '[' "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); } break; - case 872: /* array_comprehension: '[' "iterator" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ + case 881: /* array_comprehension: '[' "iterator" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); } break; - case 873: /* array_comprehension: "[[" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' ']' */ + case 882: /* array_comprehension: "[[" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where ']' ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,false); } break; - case 874: /* array_comprehension: "[{" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where "end of code block" ']' */ + case 883: /* array_comprehension: "[{" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr array_comprehension_where "end of code block" ']' */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),false,false); } break; - case 875: /* array_comprehension: "begin of code block" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" */ + case 884: /* array_comprehension: "begin of code block" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); } break; - case 876: /* array_comprehension: "{{" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" "end of code block" */ + case 885: /* array_comprehension: "{{" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where "end of code block" "end of code block" */ { (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,true); } diff --git a/prog/1stPartyLibs/daScript/src/parser/ds_parser.ypp b/prog/1stPartyLibs/daScript/src/parser/ds_parser.ypp index fa0d1196f..8c6e98f17 100644 --- a/prog/1stPartyLibs/daScript/src/parser/ds_parser.ypp +++ b/prog/1stPartyLibs/daScript/src/parser/ds_parser.ypp @@ -429,6 +429,7 @@ %type expr_list %type optional_expr_list %type optional_expr_list_in_braces +%type optional_expr_map_tuple_list %type expr_map_tuple_list %type expression_label %type expression_goto @@ -474,6 +475,7 @@ %type make_struct_dim %type make_struct_dim_list %type make_struct_dim_decl +%type optional_make_struct_dim_decl %type make_variant_dim %type make_struct_single %type make_tuple @@ -948,6 +950,9 @@ metadata_argument_list | metadata_argument_list[argL] '@' annotation_argument[arg] { $$ = ast_annotationArgumentListEntry(scanner,$argL,$arg); } + | metadata_argument_list[argL] ';' { + $$ = $argL; + } ; annotation_declaration_name @@ -1305,12 +1310,17 @@ expr_keyword optional_expr_list : { $$ = nullptr; } - | expr_list[arguments] { $$ = $arguments; } + | expr_list[arguments] optional_comma { $$ = $arguments; } ; optional_expr_list_in_braces : { $$ = nullptr; } - | '(' optional_expr_list[arguments] ')' { $$ = $arguments; } + | '(' optional_expr_list[arguments] optional_comma ')' { $$ = $arguments; } + ; + +optional_expr_map_tuple_list + : { $$ = nullptr; } + | expr_map_tuple_list[arguments] optional_comma { $$ = $arguments; } ; type_declaration_no_options_list @@ -1318,7 +1328,7 @@ type_declaration_no_options_list $$ = new vector(); $$->push_back(new ExprTypeDecl(tokAt(scanner,@decl),$decl)); } - | type_declaration_no_options_list[declL] ';' type_declaration[decl] { + | type_declaration_no_options_list[declL] c_or_s type_declaration[decl] { $$ = $declL; $$->push_back(new ExprTypeDecl(tokAt(scanner,@decl),$decl)); } @@ -1637,7 +1647,7 @@ expr_type_info delete $trait; delete $subtrait; } - | DAS_TYPEINFO[loc] '(' name_in_namespace[trait] '<' NAME[subtrait] ';' NAME[extratrait] '>' expr[subexpr] ')' { + | DAS_TYPEINFO[loc] '(' name_in_namespace[trait] '<' NAME[subtrait] c_or_s NAME[extratrait] '>' expr[subexpr] ')' { if ( $subexpr->rtti_isTypeDecl() ) { auto ptd = (ExprTypeDecl *)$subexpr; $$ = new ExprTypeInfo(tokAt(scanner,@loc),*$trait,ptd->typeexpr,*$subtrait,*$extratrait); @@ -1931,6 +1941,16 @@ expr_call $$ = yyextra->g_Program->makeCall(tokAt(scanner,@name),tokAt(scanner,@atend),*$name); delete $name; } + | name_in_namespace[name] '(' DAS_UNINITIALIZED ')' { + auto dd = new ExprMakeStruct(tokAt(scanner,@name)); + dd->at = tokAt(scanner,@name); + dd->makeType = new TypeDecl(Type::alias); + dd->makeType->alias = *$name; + dd->useInitializer = false; + dd->alwaysUseInitializer = true; + delete $name; + $$ = dd; + } | name_in_namespace[name] '(' make_struct_single[dd] ')' { ((ExprMakeStruct *)$dd)->at = tokAt(scanner,@name); ((ExprMakeStruct *)$dd)->makeType = new TypeDecl(Type::alias); @@ -1940,6 +1960,15 @@ expr_call delete $name; $$ = $dd; } + | name_in_namespace[name] '(' DAS_UNINITIALIZED make_struct_single[dd] ')' { + ((ExprMakeStruct *)$dd)->at = tokAt(scanner,@name); + ((ExprMakeStruct *)$dd)->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)$dd)->makeType->alias = *$name; + ((ExprMakeStruct *)$dd)->useInitializer = false; + ((ExprMakeStruct *)$dd)->alwaysUseInitializer = true; + delete $name; + $$ = $dd; + } | name_in_namespace[name] '(' expr_list[arguments] ')'[atend] { $$ = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,@name),tokAt(scanner,@atend),*$name),$arguments); delete $name; @@ -2274,17 +2303,17 @@ tuple_type tuple_type_list : tuple_type[decl] { $$ = new vector(); $$->push_back($decl); } - | tuple_type_list[list] ';' tuple_type[decl] { $$ = $list; $list->push_back($decl); } + | tuple_type_list[list] c_or_s tuple_type[decl] { $$ = $list; $list->push_back($decl); } ; tuple_alias_type_list : { $$ = new vector(); } - | tuple_alias_type_list[list] ';' { + | tuple_alias_type_list[list] c_or_s { $$ = $list; } - | tuple_alias_type_list[list] tuple_type[decl] ';' { + | tuple_alias_type_list[list] tuple_type[decl] c_or_s { $$ = $list; $list->push_back($decl); /* if ( !yyextra->g_CommentReaders.empty() ) { @@ -2310,17 +2339,17 @@ variant_type variant_type_list : variant_type[decl] { $$ = new vector(); $$->push_back($decl); } - | variant_type_list[list] ';' variant_type[decl] { $$ = $list; $list->push_back($decl); } + | variant_type_list[list] c_or_s variant_type[decl] { $$ = $list; $list->push_back($decl); } ; variant_alias_type_list : { $$ = new vector(); } - | variant_alias_type_list[list] ';' { + | variant_alias_type_list[list] c_or_s { $$ = $list; } - | variant_alias_type_list[list] variant_type[decl] ';' { + | variant_alias_type_list[list] variant_type[decl] c_or_s { $$ = $list; $list->push_back($decl); if ( !yyextra->g_CommentReaders.empty() ) { auto tokName = tokAt(scanner,@decl); @@ -2863,12 +2892,17 @@ bitfield_type_declaration } ; +c_or_s + : ',' + | ';' + ; + table_type_pair : type_declaration[keyTypeDecl] { $$.firstType = $keyTypeDecl; $$.secondType = new TypeDecl(Type::tVoid); } - | type_declaration[keyTypeDecl] ';' type_declaration[valueTypeDecl] { + | type_declaration[keyTypeDecl] c_or_s type_declaration[valueTypeDecl] { $$.firstType = $keyTypeDecl; $$.secondType = $valueTypeDecl; } @@ -3338,6 +3372,11 @@ make_struct_dim_decl } ; +optional_make_struct_dim_decl + : make_struct_dim_decl[msd] { $$ = $msd; } + | { $$ = new ExprMakeStruct(); } + ; + optional_block : { $$ = nullptr; } | DAS_WHERE expr_block[blk] { $$ = $blk; } @@ -3422,7 +3461,7 @@ make_struct_decl tam->arguments.push_back(ExpressionPtr($msd)); $$ = tam; } - | DAS_STRUCT [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_STRUCT [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3430,7 +3469,7 @@ make_struct_decl ((ExprMakeStruct *)$msd)->alwaysUseInitializer = true; $$ = $msd; } - | DAS_CLASS [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '('use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_CLASS [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '('use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3496,7 +3535,7 @@ make_tuple_call mkt->makeType = make_smart(Type::autoinfer); $$ = mkt; } - | DAS_TTUPLE [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_TTUPLE [loc] '<' { yyextra->das_force_oxford_comma=true; yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3538,7 +3577,7 @@ make_dim_decl tam->arguments.push_back(ExpressionPtr($mka)); $$ = tam; } - | DAS_ARRAY [loc] DAS_STRUCT '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_ARRAY [loc] DAS_STRUCT '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3548,7 +3587,7 @@ make_dim_decl tam->arguments.push_back($msd); $$ = tam; } - | DAS_ARRAY [loc] DAS_TTUPLE '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] make_struct_dim_decl[msd] ')' { + | DAS_ARRAY [loc] DAS_TTUPLE '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' use_initializer[init] optional_make_struct_dim_decl[msd] ')' { $msd->at = tokAt(scanner,@loc); ((ExprMakeStruct *)$msd)->makeType = TypeDeclPtr($mkt); ((ExprMakeStruct *)$msd)->useInitializer = $init; @@ -3576,13 +3615,24 @@ make_dim_decl tam->arguments.push_back(mka); $$ = tam; } - | DAS_ARRAY[loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' expr_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = TypeDeclPtr($mkt); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_array_move"); - tam->arguments.push_back(mka); - $$ = tam; + | DAS_ARRAY[loc] '<' { yyextra->das_arrow_depth ++; } type_declaration_no_options[mkt] '>' { yyextra->das_arrow_depth --; } '(' optional_expr_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = TypeDeclPtr($mkt); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_array_move"); + tam->arguments.push_back(mka); + $$ = tam; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tArray); + msd->makeType->firstType = TypeDeclPtr($mkt); + msd->at = tokAt(scanner,@mkt); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } } | DAS_FIXED_ARRAY[loc] '(' expr_list[arguments] optional_comma ')' { auto mka = new ExprMakeArray(tokAt(scanner,@loc)); @@ -3639,7 +3689,7 @@ make_table_decl ttm->arguments.push_back(ExpressionPtr($mka)); $$ = ttm; } - | DAS_TABLE[loc] '(' expr_map_tuple_list[arguments] optional_comma ')' { + | DAS_TABLE[loc] '(' optional_expr_map_tuple_list[arguments] ')' { auto mka = make_smart(tokAt(scanner,@loc)); mka->values = sequenceToList($arguments); mka->makeType = make_smart(Type::autoinfer); @@ -3647,23 +3697,47 @@ make_table_decl ttm->arguments.push_back(mka); $$ = ttm; } - | DAS_TABLE[loc] '<' type_declaration_no_options[decl] '>' '(' expr_map_tuple_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = TypeDeclPtr($decl); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); - ttm->arguments.push_back(mka); - $$ = ttm; - } - | DAS_TABLE[loc] '<' type_declaration_no_options[decl] ';' type_declaration_no_options[to_decl] '>' '(' expr_map_tuple_list[arguments] optional_comma ')' { - auto mka = make_smart(tokAt(scanner,@loc)); - mka->values = sequenceToList($arguments); - mka->makeType = make_smart(Type::tTuple); - mka->makeType->argTypes.push_back($decl); - mka->makeType->argTypes.push_back($to_decl); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); - ttm->arguments.push_back(mka); - $$ = ttm; + | DAS_TABLE[loc] '<' type_declaration_no_options[decl] '>' '(' optional_expr_map_tuple_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = TypeDeclPtr($decl); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); + ttm->arguments.push_back(mka); + $$ = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr($decl); + msd->makeType->secondType = make_smart(Type::tVoid); + msd->at = tokAt(scanner,@loc); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } + } + | DAS_TABLE[loc] '<' type_declaration_no_options[decl] c_or_s type_declaration_no_options[to_decl] '>' '(' optional_expr_map_tuple_list[arguments] ')' { + if ( $arguments ) { + auto mka = make_smart(tokAt(scanner,@loc)); + mka->values = sequenceToList($arguments); + mka->makeType = make_smart(Type::tTuple); + mka->makeType->argTypes.push_back($decl); + mka->makeType->argTypes.push_back($to_decl); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,@loc),"to_table_move"); + ttm->arguments.push_back(mka); + $$ = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,@loc); + msd->makeType = make_smart(Type::tTable); + msd->makeType->firstType = TypeDeclPtr($decl); + msd->makeType->secondType = TypeDeclPtr($to_decl); + msd->at = tokAt(scanner,@loc); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + $$ = msd; + } } ; diff --git a/prog/1stPartyLibs/daScript/src/parser/parser_impl.cpp b/prog/1stPartyLibs/daScript/src/parser/parser_impl.cpp index ab5690467..2d6c89a2c 100644 --- a/prog/1stPartyLibs/daScript/src/parser/parser_impl.cpp +++ b/prog/1stPartyLibs/daScript/src/parser/parser_impl.cpp @@ -340,6 +340,7 @@ namespace das { ffd.privateField = pDecl->isPrivate; ffd.sealed = pDecl->sealed; ffd.implemented = true; + ffd.classMethod = pDecl->isClassMethod; } } } else { @@ -358,6 +359,7 @@ namespace das { oldFd->privateField = pDecl->isPrivate; oldFd->sealed = pDecl->sealed; oldFd->implemented = true; + oldFd->classMethod = pDecl->isClassMethod; } else { das_yyerror(scanner,"structure field is already declared "+name_at.name +", use override to replace initial value instead",name_at.at, @@ -583,6 +585,7 @@ namespace das { nullptr ); decl->isPrivate = isPrivate; + decl->isClassMethod = true; list->push_back(decl); } func->delRef(); @@ -666,6 +669,7 @@ namespace das { decl->override = ovr == OVERRIDE_OVERRIDE; decl->sealed = ovr == OVERRIDE_SEALED; decl->isPrivate = isPrivate; + decl->isClassMethod = true; list->push_back(decl); modifyToClassMember(func, yyextra->g_thisStructure, false, cnst); } diff --git a/prog/1stPartyLibs/daScript/src/parser/parser_impl.h b/prog/1stPartyLibs/daScript/src/parser/parser_impl.h index a3b04eb06..c9c2d4c19 100644 --- a/prog/1stPartyLibs/daScript/src/parser/parser_impl.h +++ b/prog/1stPartyLibs/daScript/src/parser/parser_impl.h @@ -53,6 +53,7 @@ namespace das { bool isPrivate = false; bool isStatic = false; bool isTupleExpansion = false; + bool isClassMethod = false; AnnotationArgumentList *annotation = nullptr; }; diff --git a/prog/1stPartyLibs/matching/types.h b/prog/1stPartyLibs/matching/types.h index 478efa43d..aa1b02cdf 100644 --- a/prog/1stPartyLibs/matching/types.h +++ b/prog/1stPartyLibs/matching/types.h @@ -10,7 +10,6 @@ namespace matching typedef uint64_t SessionId; typedef uint16_t MemberId; typedef uint32_t SquadId; - typedef uint64_t GroupId; typedef int32_t RequestId; @@ -19,5 +18,4 @@ namespace matching const MemberId INVALID_MEMBER_ID = MemberId(-1); const UserId INVALID_USER_ID = UserId(-1); const SquadId INVALID_SQUAD_ID = 0; - const GroupId INVALID_GROUP_ID = 0; } diff --git a/prog/3rdPartyLibs/ImGuiColorTextEdit/TextEditor.cpp b/prog/3rdPartyLibs/ImGuiColorTextEdit/TextEditor.cpp index 0cfc22289..558a0cc9c 100644 --- a/prog/3rdPartyLibs/ImGuiColorTextEdit/TextEditor.cpp +++ b/prog/3rdPartyLibs/ImGuiColorTextEdit/TextEditor.cpp @@ -339,12 +339,16 @@ void TextEditor::Redo(bool group) if (!CanRedo()) return; - mUndoBuffer[mUndoIndex++].Redo(this); + int redoLen = 1; if (group) { - while (CanRedo() && mUndoBuffer[mUndoIndex].isSimilarTo(mUndoBuffer[mUndoIndex + 1])) - mUndoBuffer[mUndoIndex++].Redo(this); + for (; mUndoIndex + redoLen < (int)mUndoBuffer.size(); redoLen++) + if (!mUndoBuffer[mUndoIndex].isSimilarTo(mUndoBuffer[mUndoIndex + redoLen])) + break; } + + while (redoLen--) + mUndoBuffer[mUndoIndex++].Redo(this); } void TextEditor::SetText(const eastl::string& aText) diff --git a/prog/3rdPartyLibs/SnapdragonSuperResolution/SnapdragonSuperResolution.h b/prog/3rdPartyLibs/SnapdragonSuperResolution/SnapdragonSuperResolution.h index acf9df55f..6797c9aed 100644 --- a/prog/3rdPartyLibs/SnapdragonSuperResolution/SnapdragonSuperResolution.h +++ b/prog/3rdPartyLibs/SnapdragonSuperResolution/SnapdragonSuperResolution.h @@ -27,6 +27,7 @@ class SnapdragonSuperResolution : public PostFxRenderer viewport[2] = 0.f; viewport[3] = 0.f; snapdragon_super_resolution_inputVarId = get_shader_variable_id("snapdragon_super_resolution_input"); + snapdragon_super_resolution_input_samplerstateVarId = get_shader_variable_id("snapdragon_super_resolution_input_samplerstate"); snapdragon_super_resolution_ViewportInfoVarId = get_shader_variable_id("snapdragon_super_resolution_ViewportInfo"); } @@ -46,6 +47,7 @@ class SnapdragonSuperResolution : public PostFxRenderer d3d::set_render_target(output, 0); ShaderGlobal::set_texture(snapdragon_super_resolution_inputVarId, input); + ShaderGlobal::set_sampler(snapdragon_super_resolution_input_samplerstateVarId, d3d::request_sampler({})); ShaderGlobal::set_color4(snapdragon_super_resolution_ViewportInfoVarId, viewportData); PostFxRenderer::render(); } @@ -55,6 +57,7 @@ class SnapdragonSuperResolution : public PostFxRenderer Color4 viewportData = Color4(viewport); d3d::set_render_target(); ShaderGlobal::set_texture(snapdragon_super_resolution_inputVarId, input.getId()); + ShaderGlobal::set_sampler(snapdragon_super_resolution_input_samplerstateVarId, d3d::request_sampler({})); ShaderGlobal::set_color4(snapdragon_super_resolution_ViewportInfoVarId, viewportData); PostFxRenderer::render(); } @@ -62,4 +65,5 @@ class SnapdragonSuperResolution : public PostFxRenderer private: float viewport[4]; int snapdragon_super_resolution_inputVarId, snapdragon_super_resolution_ViewportInfoVarId; + int snapdragon_super_resolution_input_samplerstateVarId; }; diff --git a/prog/_jBuild/android/clang-link.jam b/prog/_jBuild/android/clang-link.jam index 6e21bf99f..38ac5275a 100644 --- a/prog/_jBuild/android/clang-link.jam +++ b/prog/_jBuild/android/clang-link.jam @@ -433,6 +433,15 @@ rule ProcessLinkTarget } } + if $(AndroidMakeAssetIndexMasks) { + local index_file = $(stage_dir)/assets/_asset_index.blk ; + postlink += + del $(index_file) " + " call $(PYTHON_EXE) $(jbuild_dir)/make_assets_index.py --dir $(stage_dir)/assets --masks $(AndroidMakeAssetIndexMasks) --output $(index_file)" + " + ; + } + local final_output_name = $(Target:D=:S=) ; if $(AndroidOutputSuffix) { final_output_name = $(final_output_name)-$(AndroidOutputSuffix) ; diff --git a/prog/_jBuild/android/make_assets_index.py b/prog/_jBuild/android/make_assets_index.py new file mode 100644 index 000000000..9cfc1cf75 --- /dev/null +++ b/prog/_jBuild/android/make_assets_index.py @@ -0,0 +1,40 @@ +import os +import argparse +import fnmatch + +parser = argparse.ArgumentParser() +parser.add_argument('--dir', required=True) +parser.add_argument('--output') +parser.add_argument('--masks', required=True, nargs='+', default=[]) + +args = parser.parse_args() + + +def get_files(folder_path, masks): + result = [] + + folder_path = os.path.normpath(folder_path) + for root, dirs, files in os.walk(folder_path): + for file in files: + fullpath = os.path.normpath(os.path.join(root, file)) + relpath = os.path.relpath(fullpath, folder_path).replace('\\', '/') + + for mask in masks: + if fnmatch.fnmatch(relpath, mask): + result.append(relpath) + break + + return result + + +print(f'Make assets index: {args.masks} -> {args.output}') + +indexBlk = '' +for f in get_files(args.dir, args.masks): + indexBlk += f'\nasset:t="{f}"' + +if args.output: + with open(args.output, 'w') as f: + f.write(indexBlk) +else: + print(indexBlk) \ No newline at end of file diff --git a/prog/_jBuild/jBuild.jam b/prog/_jBuild/jBuild.jam index efe2de3d5..79af261bb 100644 --- a/prog/_jBuild/jBuild.jam +++ b/prog/_jBuild/jBuild.jam @@ -898,12 +898,24 @@ rule ExecuteJam execute_jam $(src) ; } +rule IncludePch source : target +{ + on $(source) if %DISABLE_PCH% in $(opt) { return no ; } + if $($(target)__PrecompiledInclude) { Includes $(source) : $($(target)__PrecompiledInclude) ; } + return yes ; +} +rule StripUnusedPch use_pch : target : opt +{ + if $(use_pch) != no { return $(opt) ; } + return [ StripStrings $(opt) : /Yu$($(target)__PrecompiledName).h /Fp$($(target)__PrecompiledFile) %DISABLE_PCH% ] ; +} + # rule how to compile C++ target # params: ( target_pathname : sources : target ) rule CompileCPP { Depends $(1) : $(2) ; - if $($(3)__PrecompiledInclude) { Includes $(2) : $($(3)__PrecompiledInclude) ; } + local use_pch = [ IncludePch $(2) : $(3) ] ; MakeDirectory $(1) : $(1:D) ; if $(GLOBAL_CacheDryRun) { CheckHeadersDry $(1) : $(2) : $($(3)__CPP_OPT) ; @@ -912,7 +924,7 @@ rule CompileCPP } LOCATE on $(2) = $(Root) ; - cpp_opt on $(1) = $($(3)__CPP_OPT) $(opt) ; + cpp_opt on $(1) = [ StripUnusedPch $(use_pch) : $(3) : $($(3)__CPP_OPT) $(opt) ] ; pre_opt on $(1) = $(pre_opt) $($(3)__PRE_OPT) ; outfile on $(1) = [ MakePathAbsolute $(JAM_CWD) : $(1) ] ; @@ -926,7 +938,7 @@ rule CompileCPP rule CompileC { Depends $(1) : $(2) ; - if $($(3)__PrecompiledInclude) { Includes $(2) : $($(3)__PrecompiledInclude) ; } + local use_pch = [ IncludePch $(2) : $(3) ] ; MakeDirectory $(1) : $(1:D) ; if $(GLOBAL_CacheDryRun) { CheckHeadersDry $(1) : $(2) : $($(3)__C_OPT) ; @@ -935,7 +947,7 @@ rule CompileC } LOCATE on $(2) = $(Root) ; - c_opt on $(1) = $($(3)__C_OPT) $(opt) ; + c_opt on $(1) = [ StripUnusedPch $(use_pch) : $(3) : $($(3)__C_OPT) $(opt) ] ; pre_opt on $(1) = $(pre_opt) $($(3)__PRE_OPT) ; outfile on $(1) = [ MakePathAbsolute $(JAM_CWD) : $(1) ] ; @@ -949,7 +961,7 @@ rule CompileC rule CompileObjC { Depends $(1) : $(2) ; - if $($(3)__PrecompiledInclude) { Includes $(2) : $($(3)__PrecompiledInclude) ; } + local use_pch = [ IncludePch $(2) : $(3) ] ; MakeDirectory $(1) : $(1:D) ; if $(GLOBAL_CacheDryRun) { CheckHeadersDry $(1) : $(2) : $($(3)__C_OPT) ; @@ -958,28 +970,28 @@ rule CompileObjC } LOCATE on $(2) = $(Root) ; - c_opt on $(1) = $($(3)__C_OPT) $(opt) ; + c_opt on $(1) = [ StripUnusedPch $(use_pch) : $(3) : $($(3)__C_OPT) $(opt) ] ; pre_opt on $(1) = $($(3)__PRE_OPT) ; if $(GLOBAL_CacheDryRun) { return ; } compile_obj_c $(1) : $(2) ; } -# rule how to compile ObjC target +# rule how to compile ObjC++ target # params: ( target_pathname : sources : target ) rule CompileObjCPP { Depends $(1) : $(2) ; - if $($(3)__PrecompiledInclude) { Includes $(2) : $($(3)__PrecompiledInclude) ; } + local use_pch = [ IncludePch $(2) : $(3) ] ; MakeDirectory $(1) : $(1:D) ; if $(GLOBAL_CacheDryRun) { - CheckHeadersDry $(1) : $(2) : $($(3)__C_OPT) ; + CheckHeadersDry $(1) : $(2) : $($(3)__CPP_OPT) ; } else { CheckHeaders $(<) : $(<:S=.d) ; } LOCATE on $(2) = $(Root) ; - c_opt on $(1) = $($(3)__C_OPT) $(opt) ; + c_opt on $(1) = [ StripUnusedPch $(use_pch) : $(3) : $($(3)__CPP_OPT) $(opt) ] ; pre_opt on $(1) = $($(3)__PRE_OPT) ; if $(GLOBAL_CacheDryRun) { return ; } @@ -1059,7 +1071,7 @@ rule CompileRC local defm = [ MATCH ^[\-\/]D(.*) : $(t) ] ; if $(defm) && ! -D$(defm) in $(rc_opt) { rc_opt += -D$(defm) ; } } - rc_opt on $(1) = $(rc_opt) ; + rc_opt on $(1) = $(rc_opt) $(opt) ; LOCATE on $(2) = $(Root) ; if $(GLOBAL_CacheDryRun) { return ; } @@ -1170,7 +1182,7 @@ rule CompileJamVarCpp Depends $(1) : $(dest_cpp) ; CheckHeaders $(1) : $(1:S=.d) ; LOCATE on $(dest_cpp) = . ; - cpp_opt on $(1) = $($(3)__CPP_OPT) ; + cpp_opt on $(1) = $($(3)__CPP_OPT) $(opt) ; pre_opt on $(1) = $($(3)__PRE_OPT) ; compile_cpp $(1) : $(dest_cpp) ; } @@ -1272,7 +1284,7 @@ rule AotCompileBatchedGeneratedDAS exec_scripted_command $(dest_cpp) ; Depends $(dest_obj) : $(dest_cpp) $(batch_list) ; - if $($(2)__PrecompiledInclude) { Includes $(dest_cpp) : $($(2)__PrecompiledInclude) ; } + local use_pch = [ IncludePch $(dest_cpp) : $(2) ] ; MakeDirectory $(dest_obj) : $(dest_obj:D) ; if $(GLOBAL_CacheDryRun) { CheckHeadersDry $(dest_obj) : $(dest_cpp) : $($(2)__CPP_OPT) ; @@ -1280,7 +1292,7 @@ rule AotCompileBatchedGeneratedDAS CheckHeaders $(dest_obj) : $(dest_cpp:S=.d) ; } - cpp_opt on $(dest_obj) = $($(2)__CPP_OPT) $(DAS_AOT_CPP_OPT) ; + cpp_opt on $(dest_obj) = [ StripUnusedPch $(use_pch) : $(2) : $($(2)__CPP_OPT) ] $(DAS_AOT_CPP_OPT) ; pre_opt on $(dest_obj) = $($(2)__PRE_OPT) $(DAS_AOT_CPP_PRE_OPT) ; compile_cpp $(dest_obj) : $(dest_cpp) ; @@ -1767,6 +1779,7 @@ rule MarkSourcesChanged # sources : tmp_dir : recompile_list_varname : suffixes for src in $(1) { if ! $(src:S) in $(4) { continue ; } local obj_path = $(2)/$(src:S=$(_OBJ_SUFFIX)) ; + if $(src:S) = .rc { obj_path = $(obj_path:S=.res$(_OBJ_SUFFIX)) ; } ALWAYS $(obj_path) ; if ! $(src) in $($(3)) { $(3) += $(src) ; } } @@ -1942,14 +1955,14 @@ rule ProcessTargetDigest # target : das_src if $(digest_gopt) != $(new_gopt) { DebugDigestDiff GlobalCPPopt : $(digest_gopt) : $(new_gopt) : $(digest) ; recompile_reasons += GlobalCPPopt ; - MarkSourcesChanged $(new_src) : $(tmp_dir) : recompile_list : .cpp .cxx .cc .mm .c .m .jamvar ; + MarkSourcesChanged $(new_src) : $(tmp_dir) : recompile_list : .cpp .cxx .cc .mm .c .m .jamvar .rc ; MarkSourcesChanged $(2) : . : recompile_list : .cpp ; } if $(digest_optCpp) != $(new_optCpp) || $(digest_CPP) != $(new_CPP) { DebugDigestDiff CPPopt : $(digest_optCpp) : $(new_optCpp) : $(digest) ; DebugDigestDiff CPP : $(digest_CPP) : $(new_CPP) : $(digest) ; recompile_reasons += CPPopt ; - MarkSourcesChanged $(new_src) : $(tmp_dir) : recompile_list : .cpp .cxx .cc .mm .jamvar ; + MarkSourcesChanged $(new_src) : $(tmp_dir) : recompile_list : .cpp .cxx .cc .mm .jamvar .rc ; MarkSourcesChanged $(2) : . : recompile_list : .cpp ; } if $(digest_optC) != $(new_optC) || $(digest_C) != $(new_C) { @@ -1970,6 +1983,7 @@ rule ProcessTargetDigest # target : das_src if $(l) in $(digest_lopt) { continue ; } local src_name = [ MATCH ([^?]+)?.+ : $(l) ] ; local obj_path = $(tmp_dir)/$(src_name:S=$(_OBJ_SUFFIX)) ; + if $(src_name:S) = .rc { obj_path = $(obj_path:S=.res$(_OBJ_SUFFIX)) ; } ALWAYS $(obj_path) ; if ! $(src_name) in $(recompile_list) { recompile_list += $(src_name) ; } } @@ -1981,6 +1995,7 @@ rule ProcessTargetDigest # target : das_src continue ; } local obj_path = $(tmp_dir)/$(src_name:S=$(_OBJ_SUFFIX)) ; + if $(src_name:S) = .rc { obj_path = $(obj_path:S=.res$(_OBJ_SUFFIX)) ; } ALWAYS $(obj_path) ; if ! $(src_name) in $(recompile_list) { recompile_list += $(src_name) ; } } @@ -2099,7 +2114,9 @@ for t_lev in 0 1 2 3 4 5 6 7 8 { local pch = [ CreatePCH $(obj_path) : $(location)/$(src) : $(target) ] ; objs += $($(target)__PrecompiledName:S=$(_OBJ_SUFFIX)) ; $(target)__CPP_OPT += /Yu$($(target)__PrecompiledName).h /Fp$(pch) ; + $(target)__C_OPT += /Yu$($(target)__PrecompiledName).h /Fp$(pch) ; $(target)__PrecompiledInclude = $(location)/$($(target)__PrecompiledName).h ; + $(target)__PrecompiledFile = $(pch) ; LOCATE on $($(target)__PrecompiledInclude) = $(Root) ; } diff --git a/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl b/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl index 33393df94..c39b1e435 100644 --- a/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl +++ b/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl @@ -971,15 +971,17 @@ return calc_debug_color(delta_xy, 0.1, 0.2, 0.3); } -#if !MODFX_SHADER_ATEST && !defined(_HARDWARE_METAL) - [earlydepthstencil] +#if !MODFX_SHADER_ATEST && !_HARDWARE_METALIOS + #define USE_EARLY_DEPTH_STENCIL [earlydepthstencil] +#else + #define USE_EARLY_DEPTH_STENCIL #endif #if MODFX_SHADER_VOLFOG_INJECTION - void dafx_bboard_ps(VsOutput input HW_USE_SCREEN_POS) + USE_EARLY_DEPTH_STENCIL void dafx_bboard_ps(VsOutput input HW_USE_SCREEN_POS) #elif MODFX_SHADER_FOM - FOM_DATA dafx_bboard_ps( VsOutput input HW_USE_SCREEN_POS) + USE_EARLY_DEPTH_STENCIL FOM_DATA dafx_bboard_ps( VsOutput input HW_USE_SCREEN_POS) #elif MODFX_WBOIT_ENABLED - WBOIT_RET dafx_bboard_ps( VsOutput input HW_USE_SCREEN_POS) WBOIT_TAR + USE_EARLY_DEPTH_STENCIL WBOIT_RET dafx_bboard_ps( VsOutput input HW_USE_SCREEN_POS) WBOIT_TAR #else struct PsOutput { @@ -997,7 +999,7 @@ #endif return output; } - PsOutput dafx_bboard_ps(VsOutput input HW_USE_SCREEN_POS) + USE_EARLY_DEPTH_STENCIL PsOutput dafx_bboard_ps(VsOutput input HW_USE_SCREEN_POS) #endif { diff --git a/prog/commonFx/commonFxGame/modfx/modfx_velocity.hlsli b/prog/commonFx/commonFxGame/modfx/modfx_velocity.hlsli index a637694ad..fbcf03ce4 100644 --- a/prog/commonFx/commonFxGame/modfx/modfx_velocity.hlsli +++ b/prog/commonFx/commonFxGame/modfx/modfx_velocity.hlsli @@ -30,14 +30,14 @@ bool modfx_scene_collision_sample( float3 wpos, GlobalData_cref gdata, uint flag if (!(flags & MODFX_COLLIDE_WITH_DEPTH)) return false; - float4 spos = mul( float4( wpos, 1 ), gdata.globtm ); + float4 spos = mul( float4( wpos, 1 ), gdata.globtm_prev ); spos.xyz /= spos.w; o_stc = float2( spos.xy * float2( 0.5, -0.5 ) + float2( 0.5, 0.5 ) ); if ( o_stc.x < 0 || o_stc.y < 0 || o_stc.x >= 1.f || o_stc.y >= 1 ) return false; - o_tci = o_stc.xy * gdata.depth_size.xy; + o_tci = o_stc.xy * gdata.depth_size_for_collision.xy; o_proj_depth = dafx_linearize_z( spos.z, gdata ); o_scene_depth = dafx_sample_linear_depth( o_tci, gdata ); @@ -153,12 +153,12 @@ bool modfx_collide_with_scene_depth( float3 wpos, GlobalData_cref gdata, if (!modfx_collide_with_scene(COLLIDE_TYPE_SCENE_DEPTH, wpos, gdata, MODFX_COLLIDE_WITH_DEPTH, scene_depth, proj_depth, stc, tci, vel, cr, dt, invert_normal, tex_size)) return false; - uint2 tci_n0 = uint2( min(tci.x + 1, gdata.depth_size.x), tci.y ); - uint2 tci_n1 = uint2( tci.x, min(tci.y + 1, gdata.depth_size.y) ); + uint2 tci_n0 = uint2( min(tci.x + 1, gdata.depth_size_for_collision.x), tci.y ); + uint2 tci_n1 = uint2( tci.x, min(tci.y + 1, gdata.depth_size_for_collision.y) ); float3 w0 = gdata.world_view_pos + lerp_view_vec( stc ) * scene_depth; - float3 w1 = gdata.world_view_pos + lerp_view_vec( stc + float2( gdata.depth_size_rcp.x, 0 ) ) * dafx_sample_linear_depth( tci_n0, gdata ); - float3 w2 = gdata.world_view_pos + lerp_view_vec( stc + float2( 0, gdata.depth_size_rcp.y ) ) * dafx_sample_linear_depth( tci_n1, gdata ); + float3 w1 = gdata.world_view_pos + lerp_view_vec( stc + float2( gdata.depth_size_rcp_for_collision.x, 0 ) ) * dafx_sample_linear_depth( tci_n0, gdata ); + float3 w2 = gdata.world_view_pos + lerp_view_vec( stc + float2( 0, gdata.depth_size_rcp_for_collision.y ) ) * dafx_sample_linear_depth( tci_n1, gdata ); o_scene_normal = normalize( cross( w1 - w0, w2 - w0 ) ); if ( invert_normal ) // behind the wall diff --git a/prog/commonFx/commonFxGame/modfx_bboard_render.dshl b/prog/commonFx/commonFxGame/modfx_bboard_render.dshl index a7eae25f8..000a95adb 100644 --- a/prog/commonFx/commonFxGame/modfx_bboard_render.dshl +++ b/prog/commonFx/commonFxGame/modfx_bboard_render.dshl @@ -40,7 +40,7 @@ float haze_scene_depth_tex_lod; define_macro_if_not_defined DAFX_USE_CLOUD_SHADOWS() endmacro -shader dafx_modfx_bboard_render, dafx_modfx_ribbon_render, dafx_modfx_ribbon_render_side_only, dafx_modfx_bboard_render_atest, dafx_modfx_bboard_distortion, dafx_modfx_ribbon_distortion, dafx_modfx_ribbon_distortion_side_only, dafx_modfx_bboard_thermals, dafx_modfx_bboard_render_fom, dafx_modfx_bboard_rain, dafx_modfx_bboard_rain_distortion, dafx_modfx_volshape_render, dafx_modfx_volshape_thermal, dafx_modfx_volshape_depth, dafx_modfx_volshape_wboit_render, dafx_modfx_bboard_volfog_injection +shader dafx_modfx_bboard_render, dafx_modfx_ribbon_render, dafx_modfx_ribbon_render_side_only, dafx_modfx_bboard_render_atest, dafx_modfx_bboard_distortion, dafx_modfx_ribbon_distortion, dafx_modfx_ribbon_distortion_side_only, dafx_modfx_bboard_thermals, dafx_modfx_bboard_render_fom, dafx_modfx_bboard_rain, dafx_modfx_bboard_rain_distortion, dafx_modfx_volshape_render, dafx_modfx_volshape_thermal, dafx_modfx_volshape_wboit_render, dafx_modfx_bboard_volfog_injection { ENABLE_ASSERT(ps) if (fx_apply_volfog_per_pixel == yes && !(shader == dafx_modfx_bboard_distortion || shader == dafx_modfx_ribbon_distortion || shader == dafx_modfx_ribbon_distortion_side_only || shader == dafx_modfx_bboard_rain_distortion || shader == dafx_modfx_bboard_render_fom)) @@ -163,17 +163,6 @@ shader dafx_modfx_bboard_render, dafx_modfx_ribbon_render, dafx_modfx_ribbon_ren ##endif } } - else if ( shader == dafx_modfx_volshape_depth ) - { - z_write = true; - no_ablend; - - hlsl - { - #define MODFX_SHADER_VOLSHAPE_DEPTH 1 - #undef MODFX_USE_DEPTH_MASK - } - } else if ( shader == dafx_modfx_volshape_wboit_render ) { z_write = false; diff --git a/prog/daNetGame-das-aot/jamfile b/prog/daNetGame-das-aot/jamfile index 1282d7ea9..366b56096 100644 --- a/prog/daNetGame-das-aot/jamfile +++ b/prog/daNetGame-das-aot/jamfile @@ -23,7 +23,7 @@ if $(Platform)-$(PlatformArch) = windows-x86_64 { if $(Platform)-$(PlatformArch) = linux-x86_64 { # same build cfg as linux dedicated (to be able share build output) SSEVersion = 4 ; MArch ?= haswell ; # MOVBE,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,POPCNT,CX16,SAHF,FXSR,AVX,XSAVE,PCLMUL,FSGSBASE,RDRND,F16C,AVX2,BMI,BMI2,LZCNT,FMA,MOVBE,HLE - if ! -march=$(MArch) in $(GlobalCPPopt) { GlobalCPPopt += -march=$(MArch) ; } + if $(MArch) != -default- && ! -march=$(MArch) in $(GlobalCPPopt) { GlobalCPPopt += -march=$(MArch) ; } } include $(Root)/prog/_jBuild/defaults.jam ; diff --git a/prog/daNetGame-das-aot/stub.cpp b/prog/daNetGame-das-aot/stub.cpp index b9cd4ab2f..04f58ec63 100644 --- a/prog/daNetGame-das-aot/stub.cpp +++ b/prog/daNetGame-das-aot/stub.cpp @@ -656,6 +656,8 @@ void AnimcharBaseComponent::calcAnimWtm(bool) { G_ASSERT(0); } bool AnimcharBaseComponent::initAttachmentTmAndNodeWtm(int, mat44f &) const { G_ASSERT_RETURN(false, false); } const mat44f *AnimcharBaseComponent::getSlotNodeWtm(int) const { G_ASSERT_RETURN(false, nullptr); } const mat44f *AnimcharBaseComponent::getAttachmentTm(int) const { G_ASSERT_RETURN(false, nullptr); } +int AnimcharBaseComponent::getAttachmentSlotsCount() const { G_ASSERT_RETURN(false, 0); } +int AnimcharBaseComponent::getAttachmentSlotId(const int) const { G_ASSERT_RETURN(false, 0); } void AnimcharBaseComponent::resetFastPhysWtmOfs(const vec3f wofs) { G_ASSERT(0); } void AnimcharBaseComponent::setFastPhysSystemGravityDirection(const Point3 &) { G_ASSERT(0); } void AnimcharBaseComponent::updateFastPhys(const float dt) { G_ASSERT(0); } @@ -687,6 +689,7 @@ void AnimCommonStateHolder::setParamFlags(int, int, int) { G_ASSERT(0); } float AnimCommonStateHolder::getParamEffTimeScale(int) const { G_ASSERT_RETURN(false, 0.f); } int AnimCommonStateHolder::getTimeScaleParamId(int) const { G_ASSERT_RETURN(false, 0); } void AnimCommonStateHolder::setTimeScaleParamId(int, int) { G_ASSERT(0); } +void AnimCommonStateHolder::advance(float) { G_ASSERT(0); } void AnimCommonStateHolder::term() { G_ASSERT(0); } void AnimBlender::buildNodeList() { G_ASSERT(0); } @@ -698,6 +701,7 @@ namespace AnimCharV20 { int getSlotId(const char *) { G_ASSERT_RETURN(false, 0); } int addSlotId(const char *) { G_ASSERT_RETURN(false, 0); } +const char *getSlotName(const int) { G_ASSERT_RETURN(false, nullptr); } } // namespace AnimCharV20 bool check_action_precondition(ecs::EntityId, int) { G_ASSERT_RETURN(false, false); } diff --git a/prog/daNetGame/dasModules/matchingTypes.cpp b/prog/daNetGame/dasModules/matchingTypes.cpp index d0fc8ab79..6c6067de3 100644 --- a/prog/daNetGame/dasModules/matchingTypes.cpp +++ b/prog/daNetGame/dasModules/matchingTypes.cpp @@ -17,7 +17,6 @@ class MatchingModule final : public das::Module das::addConstant(*this, "INVALID_MEMBER_ID", matching::INVALID_MEMBER_ID); das::addConstant(*this, "INVALID_USER_ID", matching::INVALID_USER_ID); das::addConstant(*this, "INVALID_SQUAD_ID", matching::INVALID_SQUAD_ID); - das::addConstant(*this, "INVALID_GROUP_ID", matching::INVALID_GROUP_ID); verifyAotReady(); } das::ModuleAotType aotRequire(das::TextWriter &tw) const override diff --git a/prog/daNetGame/game/bindApp.cpp b/prog/daNetGame/game/bindApp.cpp index 42bc29208..cab5fc779 100644 --- a/prog/daNetGame/game/bindApp.cpp +++ b/prog/daNetGame/game/bindApp.cpp @@ -93,6 +93,7 @@ static SQInteger switch_scene_sq(HSQUIRRELVM vm) if (errorMessage != nullptr) return sq_throwerror(vm, errorMessage); } + debug("SQ switch_scene(%s)", sceneName); sceneload::switch_scene(sceneName, eastl::move(imports), eastl::move(ugmCtx)); return 0; } @@ -101,6 +102,7 @@ static SQInteger switch_scene_and_update_sq(HSQUIRRELVM vm) { const SQChar *sceneName = nullptr; G_VERIFY(SQ_SUCCEEDED(sq_getstring(vm, 2, &sceneName))); + debug("SQ switch_scene_and_update(%s)", sceneName); sceneload::switch_scene_and_update(sceneName); return 0; } @@ -218,6 +220,7 @@ SQ_DEF_AUTO_BINDING_MODULE_EX(bind_app, "app", sq::VM_ALL) }) .Func("replay_get_play_file", []() { return app_profile::get().replay.playFile.c_str(); }) .Func("exit_game", script_exit_game) + .Func("is_app_terminated", dng_is_app_terminated) .Func("is_user_game_mod", sceneload::is_user_game_mod) .SquirrelFunc("get_circuit_conf", get_circuit_conf, 1) .SetValue("circuit_name", circuit::get_name().data()) diff --git a/prog/daNetGame/game/gameLauncherES.cpp.inl b/prog/daNetGame/game/gameLauncherES.cpp.inl index e5b50d77d..b2559aa42 100644 --- a/prog/daNetGame/game/gameLauncherES.cpp.inl +++ b/prog/daNetGame/game/gameLauncherES.cpp.inl @@ -56,6 +56,7 @@ const char *fill_ugm_context_from_table(const Sqrat::Table ¶ms, sceneload::U static SQRESULT launch_session(HSQUIRRELVM vm) { + debug("launch_session()"); Sqrat::Var params_var(vm, 2); const Sqrat::Table ¶ms = params_var.value; diff --git a/prog/daNetGame/game/playerES.cpp.inl b/prog/daNetGame/game/playerES.cpp.inl index a2b93a1aa..47f8463ad 100644 --- a/prog/daNetGame/game/playerES.cpp.inl +++ b/prog/daNetGame/game/playerES.cpp.inl @@ -147,7 +147,7 @@ Player *find_player_that_possess(ecs::EntityId eid) Player *find_player_by_userid(matching::UserId uid) { Player *result = nullptr; - players_search_ecs_query([&](Player &player, uint64_t userid) { + players_search_ecs_query([&](game::Player &player, uint64_t userid) { if (userid == uid) { result = &player; @@ -161,7 +161,7 @@ Player *find_player_by_userid(matching::UserId uid) Player *find_player_by_platform_uid(const eastl::string &platform_uid) { Player *result = nullptr; - players_search_by_platfrom_ecs_query([&](Player &player, const eastl::string &platformUid) { + players_search_by_platfrom_ecs_query([&](game::Player &player, const eastl::string &platformUid) { if (!result && platformUid == platform_uid) { result = &player; diff --git a/prog/daNetGame/jamfile b/prog/daNetGame/jamfile index 8012f8061..3492e5f5f 100644 --- a/prog/daNetGame/jamfile +++ b/prog/daNetGame/jamfile @@ -187,6 +187,7 @@ if $(Platform) in windows && $(HaveRenderer) = yes && $(ExportOptimus) = yes { if $(HaveRenderer) = yes && ( $(Platform)-$(PlatformArch) = windows-x86_64 || $(Platform) in linux scarlett ) { BVHSupport = yes ; BVHRi = yes ; + BVHCables = yes ; BVHRandomGrass = no ; BVHGpuObjects = no ; BVHDynRend = no ; @@ -341,6 +342,7 @@ UseProgLibs = gameLibs/bvh gameLibs/render/rtsm gameLibs/render/rtr + gameLibs/render/rtao gameLibs/render/objectMotionBlur ; diff --git a/prog/daNetGame/main/app.cpp b/prog/daNetGame/main/app.cpp index 169ed235d..a1d3a3f30 100644 --- a/prog/daNetGame/main/app.cpp +++ b/prog/daNetGame/main/app.cpp @@ -426,18 +426,19 @@ void load_res_package(const char *folder, bool optional) } } -static void init_job_manager() +void init_loading_job_manager() { - G_ASSERT(loading_job_mgr_id < 0); - int stackSize = (128 + 64) << 10; + G_ASSERT(loading_job_mgr_id < 0 || loading_job_mgr_id == cpujobs::COREID_IMMEDIATE); #if (_TARGET_C1 || _TARGET_PC_LINUX) && DAGOR_DBGLEVEL > 0 - stackSize = 512 << 10; // debug mode has huge stack heaps + constexpr int stackSize = 512 << 10; // debug mode has huge stack heaps +#else + constexpr int stackSize = (128 + 64) << 10; #endif - loading_job_mgr_id = cpujobs::create_virtual_job_manager(stackSize, WORKER_THREADS_AFFINITY_MASK, "LoadingJobMgr"); - if (loading_job_mgr_id < 0) + if (DAGOR_UNLIKELY(loading_job_mgr_id < 0)) DAG_FATAL("Can't start LoadingJobMgr"); register_job_manager_requiring_shaders_bindump(loading_job_mgr_id); + ecs::set_common_loading_job_mgr(loading_job_mgr_id); } void set_timespeed(float ts) { game_scene::timeSpeed = ts; } @@ -522,10 +523,19 @@ static void init_main_thread() } +static bool app_is_post_shutdown_state = false; +bool dng_is_app_terminated() { return app_is_post_shutdown_state; } + void app_close() { + app_is_post_shutdown_state = true; // should be called before quirrel VMs termination sqeventbus::send_event("app.shutdown"); + // since both overlay_ui and user_ui use sqeventbus::ProcessingMode::MANUAL_PUMP we need to push event + if (auto *vm = overlay_ui::get_vm()) + sqeventbus::process_events(vm); + if (auto *vm = user_ui::get_vm()) + sqeventbus::process_events(vm); da_profiler::sync_stop_sampling(); memoryreport::stop_report(); @@ -574,8 +584,11 @@ void app_close() dagor_select_game_scene(NULL); unmount_all_vroms(); unregister_all_virtual_vrom(); - cpujobs::destroy_virtual_job_manager(loading_job_mgr_id, true); - ecs::set_common_loading_job_mgr(-1); + if (ecs::get_common_loading_job_mgr() != cpujobs::COREID_IMMEDIATE) + { + cpujobs::destroy_virtual_job_manager(loading_job_mgr_id, true); + ecs::set_common_loading_job_mgr(-1); + } dacoll::term_collision_world(); threadpool::shutdown(); propsreg::clear_registry(); @@ -737,8 +750,8 @@ void app_start() #endif init_da_editor4(); - init_job_manager(); - ecs::set_common_loading_job_mgr(loading_job_mgr_id); + if (!dedicated::is_dedicated()) + init_loading_job_manager(); game::g_timers_mgr.demandInit(); if (dedicated::is_dedicated()) diff --git a/prog/daNetGame/main/gameLoad.cpp b/prog/daNetGame/main/gameLoad.cpp index e6d777be9..c8fbf4017 100644 --- a/prog/daNetGame/main/gameLoad.cpp +++ b/prog/daNetGame/main/gameLoad.cpp @@ -643,8 +643,8 @@ static void load_scene(const char *name, const eastl::vector &imp if (!game::get_local_player()) // initial load g_entity_mgr->broadcastEventImmediate( EventOnClientConnected(net::INVALID_CONNECTION_ID, net::get_user_id(), net::get_user_name(), - /*group_id*/ net::get_user_id(), /*orig_group_id*/ net::get_user_id(), /*flags*/ 0, /*pltf_uid*/ "", - get_platform_string_id(), TEAM_UNASSIGNED, app_profile::get().appId)); + /*group_id*/ net::get_user_id(), /*flags*/ 0, /*pltf_uid*/ "", get_platform_string_id(), TEAM_UNASSIGNED, + app_profile::get().appId)); else // restart g_entity_mgr->broadcastEventImmediate(ServerCreatePlayersEntities{}); } @@ -786,6 +786,7 @@ static void load_scene_impl(const eastl::string_view &scene_name, const UserGameModeContext &mods_ctx) { TIME_PROFILE(load_scene_impl) + debug("load_scene_impl"); #if _TARGET_ANDROID || _TARGET_IOS crashlytics::AppState appState("load_scene_impl"); #endif @@ -1200,6 +1201,7 @@ struct SwitchSceneAndUpdateDelayedAction final : SwitchSceneDelayedAction void switch_scene(eastl::string_view scene, eastl::vector &&import_scenes, UserGameModeContext &&ugm_ctx) { + debug("switch_scene(%s)", scene); auto act = new SwitchSceneDelayedAction{}; act->scene = scene; act->importScenes = eastl::move(import_scenes); @@ -1209,6 +1211,7 @@ void switch_scene(eastl::string_view scene, eastl::vector &&impor void switch_scene_and_update(eastl::string_view scene) { + debug("switch_scene_and_update(%s)", scene); auto act = new SwitchSceneAndUpdateDelayedAction{}; act->scene = scene; add_delayed_action(act); diff --git a/prog/daNetGame/main/levelES.cpp.inl b/prog/daNetGame/main/levelES.cpp.inl index 1b0973043..7dfa049e7 100644 --- a/prog/daNetGame/main/levelES.cpp.inl +++ b/prog/daNetGame/main/levelES.cpp.inl @@ -217,7 +217,7 @@ public: using BaseStreamingSceneHolder::mainBindump; ecs::EntityId eid; - bool waterHeightmapLoaded; + bool waterHeightmapLoaded = false; eastl::unique_ptr rivers; eastl::unique_ptr lmeshMgr; Tab splines; @@ -724,10 +724,6 @@ private: if (IRenderWorld *wr = get_world_renderer()) wr->beforeLoadLevel(*levelBlk, eid); - add_load_level_action(this, levelBlk->getStr(LEVEL_BIN_NAME, "undefined")); - - if (!sceneload::is_load_in_progress()) - stop_animated_splash_screen_in_thread(); } }; @@ -971,6 +967,13 @@ struct LocationHolder G_ASSERT_RETURN(*blkPath, ); unload(); level.reset(new StrmSceneHolder(blkPath, wdt, eid)); + if (level_status != LEVEL_EMPTY) + { + add_load_level_action(level.get(), level->levelBlk->getStr(LEVEL_BIN_NAME, "undefined")); + + if (!sceneload::is_load_in_progress()) + stop_animated_splash_screen_in_thread(); + } } ~LocationHolder() diff --git a/prog/daNetGame/main/main.cpp b/prog/daNetGame/main/main.cpp index a42c99d62..3836cb380 100644 --- a/prog/daNetGame/main/main.cpp +++ b/prog/daNetGame/main/main.cpp @@ -100,6 +100,7 @@ #if _TARGET_C1 | _TARGET_C2 #elif _TARGET_GDK +#include #include "platform/xbox/xboxServices.h" #elif _TARGET_C3 @@ -205,7 +206,11 @@ static void init_early() // called from within main(), but before log system ini static String get_log_dir() { String dir(framemem_ptr()); +#if _TARGET_PC_WIN && _TARGET_GDK + dir.printf(0, "%s/.logs~%s", xbox::get_pls_path(), get_game_name()); +#else dir.printf(0, ".logs~%s", get_game_name()); +#endif return dir; } @@ -1023,7 +1028,7 @@ int DagorWinMain(int nCmdShow, bool /*debugmode*/) #endif - if (!(app_profile::get().disableRemoteNetServices || app_profile::get().devMode) || dedicated::is_dedicated()) + if (!(app_profile::get().disableRemoteNetServices || app_profile::get().devMode)) circuit::init(); if (!circuit::get_name().empty()) diff --git a/prog/daNetGame/main/main.h b/prog/daNetGame/main/main.h index f0fd95b35..211910ff0 100644 --- a/prog/daNetGame/main/main.h +++ b/prog/daNetGame/main/main.h @@ -2,6 +2,8 @@ #pragma once void exit_game(const char *reason_static_str); // pointer should be statically allocated string (not null) +bool dng_is_app_terminated(); //< returns true after entering post-shutdown handler + void set_window_title(const char *net_role); extern const char *default_game_name; inline const char *get_game_name() { return default_game_name; } diff --git a/prog/daNetGame/main/watchdogES.cpp.inl b/prog/daNetGame/main/watchdogES.cpp.inl index 8ad1bdcf4..515e34991 100644 --- a/prog/daNetGame/main/watchdogES.cpp.inl +++ b/prog/daNetGame/main/watchdogES.cpp.inl @@ -20,10 +20,10 @@ namespace watchdog { -#if EA_ASAN_ENABLED || defined(__SANITIZE_ADDRESS__) -static constexpr uint32_t THRESHOLDS_MULTIPLIER = 3; +#if EA_ASAN_ENABLED || defined(__SANITIZE_ADDRESS__) // Note: octet per mode +static constexpr uint32_t THRESHOLDS_MULTIPLIERS = 0x030305; #else -static constexpr uint32_t THRESHOLDS_MULTIPLIER = 1; +static constexpr uint32_t THRESHOLDS_MULTIPLIERS = 0x010101; #endif #if (DAGOR_DBGLEVEL > 0 || _TARGET_PC) && !DAGOR_THREAD_SANITIZER @@ -47,7 +47,7 @@ struct Mode static Mode modes[WatchdogMode::COUNT]; -static const char *mode_names[] = {"loading", "game_session", "menu"}; +static const char *mode_names[] = {"loading", "game_session", "lobby"}; static WatchdogMode current_mode = WatchdogMode::COUNT; @@ -68,6 +68,18 @@ static void initialize_watchdog(int sleep, int trigger, int callstacks, bool fat } } +template +static inline WatchdogMode do_change_mode(WatchdogMode mode, F cb) +{ + G_ASSERT_RETURN(mode < WatchdogMode::COUNT, current_mode); + const Mode &newMode = modes[mode]; + const char *curModeName = (current_mode != WatchdogMode::COUNT) ? mode_names[current_mode] : "none"; + const char *newModeName = mode_names[mode]; + debug("Watchdog: change mode <%s> -> <%s> { trigger: %u, callstacks: %u, sleep: %u }", curModeName, newModeName, newMode.trigger, + newMode.callstacks, newMode.sleep); + cb(newMode); + return current_mode = mode; +} static void enable_from_config(const DataBlock *blk) { @@ -93,30 +105,24 @@ static void enable_from_config(const DataBlock *blk) curMode.callstacks = (dice < chance) ? curMode.callstacks : gCallstacksThreshold; curMode.sleep = (dice < chance) ? curMode.sleep : gSleepTime; - curMode.trigger *= THRESHOLDS_MULTIPLIER; - curMode.callstacks *= THRESHOLDS_MULTIPLIER; + int mult = (THRESHOLDS_MULTIPLIERS >> (i * CHAR_BIT)) & UCHAR_MAX; + curMode.trigger *= mult; + curMode.callstacks *= mult; + curMode.sleep *= mult; } - gTriggerThreshold *= THRESHOLDS_MULTIPLIER; - gCallstacksThreshold *= THRESHOLDS_MULTIPLIER; - - initialize_watchdog(gSleepTime, gTriggerThreshold, gCallstacksThreshold, fatalOnTimeout); + do_change_mode(WatchdogMode::LOADING, + [=](const Mode &newMode) { initialize_watchdog(newMode.sleep, newMode.trigger, newMode.callstacks, fatalOnTimeout); }); } WatchdogMode change_mode(WatchdogMode mode) { - G_ASSERT_RETURN(mode < WatchdogMode::COUNT, current_mode); - Mode &newMode = modes[mode]; - const char *curModeName = (current_mode != WatchdogMode::COUNT) ? mode_names[current_mode] : "none"; - const char *newModeName = mode_names[mode]; - debug("Watchdog: change mode <%s> -> <%s> { trigger: %u, callstacks: %u, sleep: %u }", curModeName, newModeName, newMode.trigger, - newMode.callstacks, newMode.sleep); - watchdog_set_option(WATCHDOG_OPTION_TRIG_THRESHOLD, newMode.trigger); - watchdog_set_option(WATCHDOG_OPTION_CALLSTACKS_THRESHOLD, newMode.callstacks); - watchdog_set_option(WATCHDOG_OPTION_SLEEP, newMode.sleep); - eastl::swap(mode, current_mode); - return mode; + return do_change_mode(mode, [](const Mode &newMode) { + watchdog_set_option(WATCHDOG_OPTION_TRIG_THRESHOLD, newMode.trigger); + watchdog_set_option(WATCHDOG_OPTION_CALLSTACKS_THRESHOLD, newMode.callstacks); + watchdog_set_option(WATCHDOG_OPTION_SLEEP, newMode.sleep); + }); } @@ -151,13 +157,13 @@ void shutdown() static inline void watchdog_es(const ecs::UpdateStageInfoAct &act) { - static watchdog::WatchdogMode watchdog_mode = watchdog::COUNT; + static watchdog::WatchdogMode watchdog_mode = watchdog::LOADING; static float watchdog_end_load_time = 0.f; if (sceneload::is_load_in_progress()) watchdog_end_load_time = act.curTime + 5.f; // if we are loading - const watchdog::WatchdogMode mode = - act.curTime < watchdog_end_load_time ? watchdog::LOADING : watchdog::LOBBY /*<<< This is most probably wrong*/; + // Note: can we reliably detect LOBBY(menu) state here? + const watchdog::WatchdogMode mode = act.curTime < watchdog_end_load_time ? watchdog::LOADING : watchdog::GAME_SESSION; if (DAGOR_UNLIKELY(watchdog_mode != mode)) change_mode(watchdog_mode = mode); } diff --git a/prog/daNetGame/net/dedicated.h b/prog/daNetGame/net/dedicated.h index a8057832d..dab71a9e1 100644 --- a/prog/daNetGame/net/dedicated.h +++ b/prog/daNetGame/net/dedicated.h @@ -30,7 +30,7 @@ net::msg_handler_t get_sync_vroms_done_msg_handler(); String setup_log(); bool init_statsd(const char *circuit_name); // return false if stubbed void statsd_report_ctrl_ploss(ControlsPlossCalc &ploss_calc, uint16_t &last_reported_ctrl_seq, uint16_t new_ctrl_seq); -net::INetDriver *create_net_driver(); +net::INetDriver *create_listen_net_driver(); uint16_t get_binded_port(); const char *get_host_url(eastl::string &hurl, int &it); net::INetworkObserver *create_server_net_observer(void *buf, size_t bufsz); diff --git a/prog/daNetGame/net/dedicated/maindedES.cpp.gen.es.cpp b/prog/daNetGame/net/dedicated/maindedES.cpp.gen.es.cpp index 900926e26..c0f5c9a80 100644 --- a/prog/daNetGame/net/dedicated/maindedES.cpp.gen.es.cpp +++ b/prog/daNetGame/net/dedicated/maindedES.cpp.gen.es.cpp @@ -2,19 +2,19 @@ ECS_DEF_PULL_VAR(mainded); //built with ECS codegen version 1.0 #include -//static constexpr ecs::ComponentDesc dedicated_init_on_appstart_es_event_handler_comps[] ={}; -static void dedicated_init_on_appstart_es_event_handler_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) +//static constexpr ecs::ComponentDesc dedicated_init_on_appstart_es_comps[] ={}; +static void dedicated_init_on_appstart_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) { G_UNUSED(components); G_FAST_ASSERT(evt.is()); - dedicated::dedicated_init_on_appstart_es_event_handler(static_cast(evt) + dedicated::dedicated_init_on_appstart_es(static_cast(evt) ); } -static ecs::EntitySystemDesc dedicated_init_on_appstart_es_event_handler_es_desc +static ecs::EntitySystemDesc dedicated_init_on_appstart_es_es_desc ( "dedicated_init_on_appstart_es", "prog/daNetGame/net/dedicated/maindedES.cpp.inl", - ecs::EntitySystemOps(nullptr, dedicated_init_on_appstart_es_event_handler_all_events), + ecs::EntitySystemOps(nullptr, dedicated_init_on_appstart_es_all_events), empty_span(), empty_span(), empty_span(), diff --git a/prog/daNetGame/net/dedicated/maindedES.cpp.inl b/prog/daNetGame/net/dedicated/maindedES.cpp.inl index 594f5483a..d4566fb1d 100644 --- a/prog/daNetGame/net/dedicated/maindedES.cpp.inl +++ b/prog/daNetGame/net/dedicated/maindedES.cpp.inl @@ -24,27 +24,19 @@ extern void idle_loop(); namespace dedicated { -static void init() + +ECS_AFTER(on_gameapp_started_es) +static void dedicated_init_on_appstart_es(const EventOnGameAppStarted &) { set_no_gameres_factory_fatal(false); - - dedicated_matching::init(); - -#if _TARGET_PC_WIN | _TARGET_PC_MACOSX // On Linux using workcycle::idle_loop() is called automatically from dagor_idle_cycle() +#if !_TARGET_PC_LINUX // On Linux using workcycle::idle_loop() is called automatically from dagor_idle_cycle() // as close to start of new frame as possible (time calculation is relying on that) register_regular_action_to_idle_cycle([](void *) { workcycle_internal::idle_loop(); }, nullptr); #endif - + dedicated_matching::init(); g_entity_mgr->broadcastEventImmediate(DedicatedServerEventOnInit{}); } - -ECS_AFTER(on_gameapp_started_es) -static inline void dedicated_init_on_appstart_es_event_handler(const EventOnGameAppStarted &) -{ - delayed_call([]() { dedicated::init(); }); // DA to execute this after actual scene load -} - void update() { TIME_PROFILE(dedicated_update); diff --git a/prog/daNetGame/net/dedicated/matching.cpp b/prog/daNetGame/net/dedicated/matching.cpp index 363a2e341..650b03913 100644 --- a/prog/daNetGame/net/dedicated/matching.cpp +++ b/prog/daNetGame/net/dedicated/matching.cpp @@ -15,6 +15,67 @@ namespace dedicated_matching { using namespace dedicated_matching::state_data; +/* +Traffic encryption and client authentification + +Backend service send hmac_id-sha256 (authKey) and encryption_key (encKey) to client, which are generated using sessionId, +userId, and room secret. +Dedicated game server (host) process should be started with -session_id: +and -room_secret: commandline arguments. +Client send hmac_id and userid on connect (with launch_network_session({authKey, encKey, connect=List}) +from quirrel, or same bindings from daslang. +Host will accept connection only if everything is correct. + +Room info on backend sample: +{ + "mode_info": { + "gameName":"myGame", //needed for multgames on one matching instance, used for tests + } + "roomId":"uint64", //as STRING! + "sessionId":"uint64", //as string! + "public": { + "groupSize": 0//max group size for autogroups + }, + "members":[ + { + "userId":"unsigned int63 (only postivies uint64)", + "name":"any User Name", + "public":{ + "mteam":0, //any integer. Mteam is matchmaking team, set by matchmaking. Mteam id that was set by match-matching + "team":0, // any integer. Team id that was set by matching upon user request (like in lobby) + "squadId":0, //squadId, to find groups(parties) of players + "appId":0 + }, + "private": { //will be send only for user himself + "authKey":, + "encKey":, + } + } + ] +} +Most of mulitplayer games use concept of 'team', 'group'. +Some games can have multiple sessions per room (lobby style). +Players usually have at least names and some unique id (for performance reason we prefer int64, +but probably that can be changed in future). +Game modes can have other options, like session duration, score limit, team sizes, and so on. +Such settings can be set durion session or in backend (lobby, matchmaking, etc). +In DNG eash game session has separate dedicated game server process. + +Commandline arguments: + + dedicated: + + "-room_secret:" -- required for traffic encryption + "-session_id:" -- required for traffic encryption + "-nomatching" - disable Gaijin mathcing + "-nonetenc" - switch off traffic encryption + "-nopeerauth" - swithc off client authentification and traffic enryption + "-customPublicMatchingCfg:" - undocumented + + client (debug options): + + -force_player_group:int - debug option to for client squad(group) +*/ static void apply_custom_matching_public_config(const char *encoded_config) { @@ -76,7 +137,6 @@ void apply_room_info_on_join(const Json::Value ¶ms) register_room_member(members[i]); } } - void apply_room_invite(Json::Value const ¶ms, Json::Value &resp) { if (current_room_id != matching::INVALID_ROOM_ID) @@ -163,7 +223,7 @@ void apply_room_attr_changed(const Json::Value ¶ms) void init() { - if (dgs_get_argv("nomatching")) + if (dgs_get_argv("nomatching") || app_profile::get().disableRemoteNetServices) { debug("matching client disabled"); if (const char *encodedConfig = dgs_get_argv("customPublicMatchingCfg")) @@ -193,11 +253,11 @@ int get_player_team(matching::UserId uid) const Json::Value &member = get_room_member(uid); if (member.isNull()) return -1; - const Json::Value &mteam = member["public"]["mteam"]; + const Json::Value &mteam = member["public"]["mteam"]; // team set by matchmaking if (mteam.isIntegral()) return mteam.asInt(); - const Json::Value &team = member["public"]["team"]; + const Json::Value &team = member["public"]["team"]; // team set by user (in Lobby for example) if (team.isIntegral()) return team.asInt(); return -1; @@ -252,22 +312,6 @@ int64_t get_player_group(matching::UserId uid) return squadId.asUInt64(); } -int64_t get_player_original_group(matching::UserId uid) -{ - if (const char *player_group = dgs_get_argv("force_player_orig_group")) - if (*player_group) - return atoi(player_group); - - const Json::Value &member = get_room_member(uid); - if (member.isNull()) - return uid; - - const Json::Value &squadId = member["public"]["origSquadId"]; - if (!squadId.isIntegral()) - return uid; - return squadId.asUInt64(); -} - const Json::Value &get_mode_info() { return room_info["public"]; } const eastl::string &get_room_secret() diff --git a/prog/daNetGame/net/dedicated/matching.h b/prog/daNetGame/net/dedicated/matching.h index 6a0359a00..8ac363b5c 100644 --- a/prog/daNetGame/net/dedicated/matching.h +++ b/prog/daNetGame/net/dedicated/matching.h @@ -14,7 +14,6 @@ void shutdown(); int get_player_team(matching::UserId uid); int get_player_req_teams_num(matching::UserId uid); int64_t get_player_group(matching::UserId uid); -int64_t get_player_original_group(matching::UserId uid); int get_player_app_id(matching::UserId uid); eastl::string get_player_name(matching::UserId uid); const Json::Value &get_mode_info(); diff --git a/prog/daNetGame/net/dedicated/netded.cpp b/prog/daNetGame/net/dedicated/netded.cpp index 99ebd6adf..7f3211dc5 100644 --- a/prog/daNetGame/net/dedicated/netded.cpp +++ b/prog/daNetGame/net/dedicated/netded.cpp @@ -28,6 +28,8 @@ #include "net/net.h" #include "net/userid.h" #include +#include +#include #include "phys/physUtils.h" // phys_get_tickrate #include "net/dedicated.h" #include "net/time.h" @@ -55,6 +57,8 @@ DED_SERVER_ECS_EVENTS #undef DED_SERVER_ECS_EVENT extern net::INetworkObserver *get_net_observer(); +extern void init_loading_job_manager(); + namespace dedicated { @@ -91,10 +95,12 @@ static inline uint16_t try_parse_port(const char *str) // return 0 on error return ret; } -net::INetDriver *create_net_driver() +net::INetDriver *create_listen_net_driver() { - const char *listen = dgs_get_argv("listen"); net::INetDriver *drv = nullptr; + if (dgs_get_argv("nolisten")) + return drv; + const char *listen = dgs_get_argv("listen"); if (const char *udp_sock = dgs_get_argv("udp_sock")) // if udp_sock is passed than port should be passed as well { binded_net_port = listen ? try_parse_port(listen) : 0; @@ -325,7 +331,6 @@ struct DedicatedNetObserver final : public net::INetworkObserver matching::UserId userId = msg->get<1>(); eastl::string userName = dedicated_matching::get_player_name(userId); int64_t groupId = dedicated_matching::get_player_group(userId); - int64_t origGroupId = dedicated_matching::get_player_original_group(userId); int mteam = dedicated_matching::get_player_team(userId); // team assigned by matching if (mteam != TEAM_UNASSIGNED) mteam += FIRST_GAME_TEAM; @@ -370,9 +375,8 @@ struct DedicatedNetObserver final : public net::INetworkObserver } } updater::Version ver{msg->get<7>()}; - debug("Client #%d connected with user{name,id}=<%s>/%lld, groupId=%lld, origGroupId=%lld, mteam=%d, flags=0x%x, ver=%s, pltf=%s", - (int)conn.getId(), userName.c_str(), (long long)userId, (long long)groupId, (long long)origGroupId, mteam, (int)msg->get<3>(), - ver.to_string(), pltf.c_str()); + debug("Client #%d connected with user{name,id}=<%s>/%lld, groupId=%lld, mteam=%d, flags=0x%x, ver=%s, pltf=%s", (int)conn.getId(), + userName.c_str(), (long long)userId, (long long)groupId, mteam, (int)msg->get<3>(), ver.to_string(), pltf.c_str()); // Try to sync vroms during clien't connection const bool vromsAreTheSame = check_client_vroms_and_send_diffs(msg); @@ -393,8 +397,8 @@ struct DedicatedNetObserver final : public net::INetworkObserver int app_id = dedicated_matching::get_player_app_id(userId); { - EventOnClientConnected evt(conn.getId(), userId, eastl::move(userName), groupId, origGroupId, msg->get<3>(), platformUid, - eastl::string(pltf), mteam, app_id); + EventOnClientConnected evt(conn.getId(), userId, eastl::move(userName), groupId, msg->get<3>(), platformUid, eastl::string(pltf), + mteam, app_id); if (vromsAreTheSame) g_entity_mgr->broadcastEventImmediate(eastl::move(evt)); else @@ -412,6 +416,9 @@ struct DedicatedNetObserver final : public net::INetworkObserver { debug("Client #%d connected, wait for identity message", (int)conn.getId()); conn.getConnFlagsRW() = net::CF_PENDING; + + if (ecs::get_common_loading_job_mgr() == cpujobs::COREID_IMMEDIATE) // Init MT loading mgr on first connect + init_loading_job_manager(); } else // replay connection { diff --git a/prog/daNetGame/net/dedicated/stub/dedstubs.cpp b/prog/daNetGame/net/dedicated/stub/dedstubs.cpp index c6d58ebc5..30a6df953 100644 --- a/prog/daNetGame/net/dedicated/stub/dedstubs.cpp +++ b/prog/daNetGame/net/dedicated/stub/dedstubs.cpp @@ -25,7 +25,7 @@ void shutdown() {} String setup_log() { return String(); } bool init_statsd(const char *) { return false; } void statsd_report_ctrl_ploss(ControlsPlossCalc &, uint16_t &, uint16_t) {} -net::INetDriver *create_net_driver() { return nullptr; } +net::INetDriver *create_listen_net_driver() { return nullptr; } uint16_t get_binded_port() { return 0; } net::msg_handler_t get_clientinfo_msg_handler() { return NULL; } net::msg_handler_t get_sync_vroms_done_msg_handler() { return NULL; } diff --git a/prog/daNetGame/net/net.cpp b/prog/daNetGame/net/net.cpp index 5d1cae599..65ec4fb8d 100644 --- a/prog/daNetGame/net/net.cpp +++ b/prog/daNetGame/net/net.cpp @@ -605,7 +605,7 @@ struct ListenServerNetObserver final : public net::INetworkObserver // Warn: no } { - EventOnClientConnected evt(conn.getId(), userId, eastl::move(userName), groupId, groupId, msg->get<3>(), platformUid, + EventOnClientConnected evt(conn.getId(), userId, eastl::move(userName), groupId, msg->get<3>(), platformUid, eastl::string(pltf), mteam, app_profile::get().appId); g_entity_mgr->broadcastEventImmediate(eastl::move(evt)); } @@ -658,9 +658,8 @@ static net::INetworkObserver *create_listen_server_net_observer(void *, size_t) bool net_init_early() { - net::INetDriver *drv = dedicated::create_net_driver(); - bool ded = drv != NULL; - if (const char *listen = (!ded && DAGOR_DBGLEVEL > 0) ? dgs_get_argv("listen") : NULL) //-V560 + net::INetDriver *drv = dedicated::create_listen_net_driver(); + if (const char *listen = (!dedicated::is_dedicated() && DAGOR_DBGLEVEL > 0) ? dgs_get_argv("listen") : NULL) //-V560 { uint16_t port = 0; drv = net::create_net_driver_listen(listen, NET_MAX_PLAYERS, &port); @@ -673,7 +672,7 @@ bool net_init_early() } } if (drv) - net_ctx.demandInit(drv, ded ? &dedicated::create_server_net_observer : &create_listen_server_net_observer); + net_ctx.demandInit(drv, dedicated::is_dedicated() ? &dedicated::create_server_net_observer : &create_listen_server_net_observer); return true; } diff --git a/prog/daNetGame/render/XeSuperSampling.cpp b/prog/daNetGame/render/XeSuperSampling.cpp index 8a73cbd19..ec842599f 100644 --- a/prog/daNetGame/render/XeSuperSampling.cpp +++ b/prog/daNetGame/render/XeSuperSampling.cpp @@ -28,31 +28,32 @@ XeSuperSampling::XeSuperSampling(const IPoint2 &outputResolution) : AntiAliasing float y = inputResolution.y; d3d::driver_command(Drv3dCommand::SET_XESS_VELOCITY_SCALE, &x, &y); - applierNode = resource_slot::register_access("xess", DABFG_PP_NODE_SRC, - {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, - [this](resource_slot::State slotsState, dabfg::Registry registry) { - auto opaqueFinalTargetHndl = - registry.readTexture("final_target_with_motion_blur").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto depthHndl = - registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto motionVecsHndl = registry.readTexture("motion_vecs_after_transparency") - .optional() - .atStage(dabfg::Stage::CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - auto antialiasedHndl = registry - .createTexture2d(slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::No, - {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED, registry.getResolution<2>("display")}) - .atStage(dabfg::Stage::CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - return [this, depthHndl, motionVecsHndl, opaqueFinalTargetHndl, antialiasedHndl] { - OptionalInputParams params; - params.depth = depthHndl.view().getTex2D(); - params.motion = motionVecsHndl.view().getTex2D(); - xess_render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), inputResolution, jitterOffset, params); - }; - }); + applierNode = dabfg::register_node("xess", DABFG_PP_NODE_SRC, [this](dabfg::Registry registry) { + auto opaqueFinalTargetHndl = + registry.readTexture("final_target_with_motion_blur").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto depthHndl = + registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto motionVecsHndl = registry.readTexture("motion_vecs_after_transparency") + .optional() + .atStage(dabfg::Stage::CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + auto antialiasedHndl = registry + .createTexture2d("frame_after_aa", dabfg::History::No, + {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED, registry.getResolution<2>("display")}) + .atStage(dabfg::Stage::CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + auto exposureTexHndl = + registry.readTexture("exposure_tex").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + return [this, depthHndl, motionVecsHndl, opaqueFinalTargetHndl, antialiasedHndl, exposureTexHndl] { + OptionalInputParams params; + params.depth = depthHndl.view().getTex2D(); + params.motion = motionVecsHndl.view().getTex2D(); + params.exposure = exposureTexHndl.view().getTex2D(); + xess_render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), inputResolution, jitterOffset, params); + }; + }); } void xess_render(Texture *in_color, @@ -65,6 +66,7 @@ void xess_render(Texture *in_color, xessParams.inColor = in_color; xessParams.inDepth = params.depth; xessParams.inMotionVectors = params.motion; + xessParams.inExposure = params.exposure; xessParams.inJitterOffsetX = jitter_offset.x; xessParams.inJitterOffsetY = jitter_offset.y; xessParams.outColor = out_color; diff --git a/prog/daNetGame/render/XeSuperSampling.h b/prog/daNetGame/render/XeSuperSampling.h index 6080d76c7..3af617295 100644 --- a/prog/daNetGame/render/XeSuperSampling.h +++ b/prog/daNetGame/render/XeSuperSampling.h @@ -14,7 +14,7 @@ class XeSuperSampling : public AntiAliasing static bool is_enabled(); private: - resource_slot::NodeHandleWithSlotsAccess applierNode; + dabfg::NodeHandle applierNode; }; void xess_render(Texture *in_color, diff --git a/prog/daNetGame/render/deepLearningSuperSampling.cpp b/prog/daNetGame/render/deepLearningSuperSampling.cpp index 0b9eb49d4..312f5ec79 100644 --- a/prog/daNetGame/render/deepLearningSuperSampling.cpp +++ b/prog/daNetGame/render/deepLearningSuperSampling.cpp @@ -92,43 +92,37 @@ DeepLearningSuperSampling::DeepLearningSuperSampling(const IPoint2 &outputResolu dlss->setOptions(0, mode, outputResolution, optimalSettings->sharpness); } - applierNode = resource_slot::register_access("dlss", DABFG_PP_NODE_SRC, - {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, - [this](resource_slot::State slotsState, dabfg::Registry registry) { - auto opaqueFinalTargetHndl = registry.readTexture("final_target_with_motion_blur") - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - auto depthHndl = - registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto motionVectorsHndl = registry.readTexture("motion_vecs_after_transparency") - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - auto exposureNormFactorHndl = registry.readTexture("exposure_normalization_factor") - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - auto antialiasedHndl = registry - .createTexture2d(slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::No, - {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, registry.getResolution<2>("display")}) + applierNode = dabfg::register_node("dlss", DABFG_PP_NODE_SRC, [this](dabfg::Registry registry) { + auto opaqueFinalTargetHndl = registry.readTexture("final_target_with_motion_blur") + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + auto depthHndl = + registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto motionVectorsHndl = registry.readTexture("motion_vecs_after_transparency") .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::COLOR_ATTACHMENT) + .useAs(dabfg::Usage::SHADER_RESOURCE) .handle(); - auto camera = registry.readBlob("current_camera").handle(); - auto cameraHistory = registry.readBlobHistory("current_camera").handle(); - - return - [this, depthHndl, motionVectorsHndl, exposureNormFactorHndl, opaqueFinalTargetHndl, antialiasedHndl, camera, cameraHistory] { - OptionalInputParams params; - params.depth = depthHndl.view().getTex2D(); - params.motion = motionVectorsHndl.view().getTex2D(); - params.exposure = exposureNormFactorHndl.view().getTex2D(); - dlss_render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), jitterOffset, params, camera.ref(), - cameraHistory.ref()); - }; - }); - + auto exposureTexHndl = + registry.readTexture("exposure_tex").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto antialiasedHndl = registry + .createTexture2d("frame_after_aa", dabfg::History::No, + {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, registry.getResolution<2>("display")}) + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::COLOR_ATTACHMENT) + .handle(); + auto camera = registry.readBlob("current_camera").handle(); + auto cameraHistory = registry.readBlobHistory("current_camera").handle(); + + return [this, depthHndl, motionVectorsHndl, exposureTexHndl, opaqueFinalTargetHndl, antialiasedHndl, camera, cameraHistory] { + OptionalInputParams params; + params.depth = depthHndl.view().getTex2D(); + params.motion = motionVectorsHndl.view().getTex2D(); + params.exposure = exposureTexHndl.view().getTex2D(); + dlss_render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), jitterOffset, params, camera.ref(), + cameraHistory.ref()); + }; + }); if (dlss->isFrameGenerationSupported()) { if (::dgs_get_settings()->getBlockByNameEx("video")->getBool("dlssFrameGeneration", false)) diff --git a/prog/daNetGame/render/deepLearningSuperSampling.h b/prog/daNetGame/render/deepLearningSuperSampling.h index b0eb7bf09..89c50f249 100644 --- a/prog/daNetGame/render/deepLearningSuperSampling.h +++ b/prog/daNetGame/render/deepLearningSuperSampling.h @@ -40,7 +40,7 @@ class DeepLearningSuperSampling : public AntiAliasing bool needDepthHistory() const override { return isFrameGenerationEnabled(); } private: - resource_slot::NodeHandleWithSlotsAccess applierNode; + dabfg::NodeHandle applierNode; dabfg::NodeHandle frameGenerationNode; dabfg::NodeHandle lifetimeExtenderNode; }; diff --git a/prog/daNetGame/render/fidelityFXSuperResolution.cpp b/prog/daNetGame/render/fidelityFXSuperResolution.cpp index 79ef6ba3b..c92d2843c 100644 --- a/prog/daNetGame/render/fidelityFXSuperResolution.cpp +++ b/prog/daNetGame/render/fidelityFXSuperResolution.cpp @@ -57,42 +57,37 @@ FidelityFXSuperResolution::FidelityFXSuperResolution(const IPoint2 &outputResolu inputResolution = fsr->getRenderingResolution(fsr->getUpscalingMode(), outputResolution); - applierNode = resource_slot::register_access("fsr", DABFG_PP_NODE_SRC, - {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, - [this](resource_slot::State slotsState, dabfg::Registry registry) { - auto opaqueFinalTargetHndl = - registry.readTexture("final_target_with_motion_blur").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + applierNode = dabfg::register_node("fsr", DABFG_PP_NODE_SRC, [this](dabfg::Registry registry) { + auto opaqueFinalTargetHndl = + registry.readTexture("final_target_with_motion_blur").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto depthHndl = - registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto motionVecsHndl = - registry.readTexture("motion_vecs_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - auto antialiasedHndl = registry - .createTexture2d(slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::No, - {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, registry.getResolution<2>("display")}) - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::COLOR_ATTACHMENT) - .handle(); - auto exposureNormFactorHndl = registry.readTexture("exposure_normalization_factor") - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - auto camera = registry.readBlob("current_camera").handle(); + auto depthHndl = + registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto motionVecsHndl = + registry.readTexture("motion_vecs_after_transparency").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto antialiasedHndl = registry + .createTexture2d("frame_after_aa", dabfg::History::No, + {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, registry.getResolution<2>("display")}) + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::COLOR_ATTACHMENT) + .handle(); + auto exposureTexHndl = + registry.readTexture("exposure_tex").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto camera = registry.readBlob("current_camera").handle(); - auto reactiveHandle = - registry.readTexture("reactive_mask").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + auto reactiveHandle = + registry.readTexture("reactive_mask").atStage(dabfg::Stage::CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - return - [this, depthHndl, motionVecsHndl, opaqueFinalTargetHndl, antialiasedHndl, exposureNormFactorHndl, camera, reactiveHandle] { - OptionalInputParams params; - params.depth = depthHndl.view().getTex2D(); - params.motion = motionVecsHndl.view().getTex2D(); - params.exposure = exposureNormFactorHndl.view().getTex2D(); - params.reactive = reactiveHandle.view().getTex2D(); - params.perspective = camera.ref().noJitterPersp; - render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), params); - }; - }); + return [this, depthHndl, motionVecsHndl, opaqueFinalTargetHndl, antialiasedHndl, exposureTexHndl, camera, reactiveHandle] { + OptionalInputParams params; + params.depth = depthHndl.view().getTex2D(); + params.motion = motionVecsHndl.view().getTex2D(); + params.exposure = exposureTexHndl.view().getTex2D(); + params.reactive = reactiveHandle.view().getTex2D(); + params.perspective = camera.ref().noJitterPersp; + render(opaqueFinalTargetHndl.view().getTex2D(), antialiasedHndl.view().getTex2D(), params); + }; + }); } FidelityFXSuperResolution::~FidelityFXSuperResolution() { fsr->teardownUpscaling(); } diff --git a/prog/daNetGame/render/fidelityFXSuperResolution.h b/prog/daNetGame/render/fidelityFXSuperResolution.h index 99c2de63b..bd877c985 100644 --- a/prog/daNetGame/render/fidelityFXSuperResolution.h +++ b/prog/daNetGame/render/fidelityFXSuperResolution.h @@ -28,6 +28,6 @@ class FidelityFXSuperResolution : public AntiAliasing private: eastl::unique_ptr fsr; int dlss_jitter_offsetVarId = get_shader_glob_var_id("dlss_jitter_offset"); - resource_slot::NodeHandleWithSlotsAccess applierNode; + dabfg::NodeHandle applierNode; float deltaTimeMs; }; diff --git a/prog/daNetGame/render/renderAnimCharIcon.cpp b/prog/daNetGame/render/renderAnimCharIcon.cpp index 6d46ef044..059297d62 100644 --- a/prog/daNetGame/render/renderAnimCharIcon.cpp +++ b/prog/daNetGame/render/renderAnimCharIcon.cpp @@ -982,6 +982,9 @@ bool RenderAnimCharIcon::renderInternal(Texture *to, int x, int y, int dstw, int const char *animation = info.getStr("animation", ""); const bool recalcAnimation = info.getBool("recalcAnimation", false); + if (recalcAnimation) + for (size_t i = 1; i < iconAnimchar.size(); ++i) + iconAnimchar[0].animchar->setAttachedChar(iconAnimchar[i].slotId, 0, &iconAnimchar[i].animchar->baseComp(), false); if (strcmp(animation, "") != 0) { int stateIdx = iconAnimchar[0].animchar->getAnimGraph()->getStateIdx(animation); diff --git a/prog/daNetGame/render/screencap.cpp b/prog/daNetGame/render/screencap.cpp index 160760803..43261e6e3 100644 --- a/prog/daNetGame/render/screencap.cpp +++ b/prog/daNetGame/render/screencap.cpp @@ -321,14 +321,15 @@ void screencap::schedule_screenshot(bool with_gui, int sequence_number, const ch #endif } -void screencap::start_prending_request() +void screencap::start_pending_request() { #ifdef CAPTURE_SCREENSHOT_FRAMES if (--pending_delay > 0) return; #endif - screenshot_scheduled = screenshot_scheduled_pending; - screenshot_scheduled_pending = false; + if (!eastl::exchange(screenshot_scheduled_pending, false)) + return; + screenshot_scheduled = true; scheduled_screenshot_name = scheduled_screenshot_name_pending; capturing_gui = capturing_gui_pending; sequence_num = sequence_num_pending; diff --git a/prog/daNetGame/render/screencap.h b/prog/daNetGame/render/screencap.h index 138bd15ec..28fe1ce1e 100644 --- a/prog/daNetGame/render/screencap.h +++ b/prog/daNetGame/render/screencap.h @@ -28,7 +28,7 @@ void make_screenshot(const ManagedTex &srgb_frame, ColorSpace colorspace = ColorSpace::sRGB, const char *additional_postfix = nullptr); void schedule_screenshot(bool with_gui = false, int sequence_number = -1, const char *name_override = nullptr); -void start_prending_request(); +void start_pending_request(); bool is_screenshot_scheduled(); diff --git a/prog/daNetGame/render/temporalSuperResolution.cpp b/prog/daNetGame/render/temporalSuperResolution.cpp index e1a5a0496..50f59dfa7 100644 --- a/prog/daNetGame/render/temporalSuperResolution.cpp +++ b/prog/daNetGame/render/temporalSuperResolution.cpp @@ -122,53 +122,49 @@ TemporalSuperResolution::TemporalSuperResolution(const IPoint2 &output_resolutio computeRenderer.reset(new_compute_shader("tsr_cs")); - applierNode = resource_slot::register_access("tsr", DABFG_PP_NODE_SRC, - {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, - [this, output_resolution](resource_slot::State slotsState, dabfg::Registry registry) { - auto opaqueFinalTargetHndl = registry.readTexture("final_target_with_motion_blur") - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - read_gbuffer(registry, dabfg::Stage::PS_OR_CS); - registry.readTexture("motion_vecs_after_transparency").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("motion_gbuf").optional(); - registry.read("gbuf_sampler").blob().bindToShaderVar("motion_gbuf_samplerstate").optional(); - registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("depth_gbuf"); - registry.read("gbuf_sampler").blob().bindToShaderVar("depth_gbuf_samplerstate"); - - auto antialiasedHndl = - registry - .createTexture2d(slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::ClearZeroOnFirstFrame, - {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, output_resolution}) - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - - auto antialiasedHistHndl = registry.readTextureHistory(slotsState.resourceToCreateFor("postfx_input_slot")) + applierNode = dabfg::register_node("tsr", DABFG_PP_NODE_SRC, [this, output_resolution](dabfg::Registry registry) { + auto opaqueFinalTargetHndl = registry.readTexture("final_target_with_motion_blur") .atStage(dabfg::Stage::PS_OR_CS) .useAs(dabfg::Usage::SHADER_RESOURCE) .handle(); - - auto confidenceHndl = registry - .createTexture2d("tsr_confidence", dabfg::History::ClearZeroOnFirstFrame, - {TEXFMT_R8 | TEXCF_UNORDERED | TEXCF_RTARGET, output_resolution}) - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE) - .handle(); - - auto confidenceHistHndl = - registry.readTextureHistory("tsr_confidence").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); - - registry.readTexture("reactive_mask").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("tsr_reactive_mask").optional(); - - auto cameraHndl = registry.readBlob("current_camera").handle(); - - return [this, opaqueFinalTargetHndl, antialiasedHndl, antialiasedHistHndl, confidenceHndl, confidenceHistHndl, cameraHndl] { - set_viewvecs_to_shader(cameraHndl.ref().viewTm, cameraHndl.ref().jitterProjTm); - tsr_render(TextureIDPair{opaqueFinalTargetHndl.view().getTex2D(), opaqueFinalTargetHndl.view().getTexId()}, - antialiasedHndl.view(), antialiasedHistHndl.view(), confidenceHndl.view(), confidenceHistHndl.view(), getDebugRenderTarget(), - computeRenderer.get(), outputResolution); - }; - }); + read_gbuffer(registry, dabfg::Stage::PS_OR_CS); + registry.readTexture("motion_vecs_after_transparency").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("motion_gbuf").optional(); + registry.read("gbuf_sampler").blob().bindToShaderVar("motion_gbuf_samplerstate").optional(); + registry.readTexture("depth_after_transparency").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("depth_gbuf"); + registry.read("gbuf_sampler").blob().bindToShaderVar("depth_gbuf_samplerstate"); + + auto antialiasedHndl = registry + .createTexture2d("frame_after_aa", dabfg::History::ClearZeroOnFirstFrame, + {TEXFMT_A16B16G16R16F | TEXCF_UNORDERED | TEXCF_RTARGET, output_resolution}) + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + + auto antialiasedHistHndl = + registry.readTextureHistory("frame_after_aa").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + + auto confidenceHndl = registry + .createTexture2d("tsr_confidence", dabfg::History::ClearZeroOnFirstFrame, + {TEXFMT_R8 | TEXCF_UNORDERED | TEXCF_RTARGET, output_resolution}) + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + + auto confidenceHistHndl = + registry.readTextureHistory("tsr_confidence").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + + registry.readTexture("reactive_mask").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("tsr_reactive_mask").optional(); + registry.readTexture("exposure_tex").atStage(dabfg::Stage::CS).bindToShaderVar("tsr_exposure").optional(); + + auto cameraHndl = registry.readBlob("current_camera").handle(); + + return [this, opaqueFinalTargetHndl, antialiasedHndl, antialiasedHistHndl, confidenceHndl, confidenceHistHndl, cameraHndl] { + set_viewvecs_to_shader(cameraHndl.ref().viewTm, cameraHndl.ref().jitterProjTm); + tsr_render(TextureIDPair{opaqueFinalTargetHndl.view().getTex2D(), opaqueFinalTargetHndl.view().getTexId()}, + antialiasedHndl.view(), antialiasedHistHndl.view(), confidenceHndl.view(), confidenceHistHndl.view(), getDebugRenderTarget(), + computeRenderer.get(), outputResolution); + }; + }); } int TemporalSuperResolution::getTemporalFrameCount() const diff --git a/prog/daNetGame/render/temporalSuperResolution.h b/prog/daNetGame/render/temporalSuperResolution.h index c8d1f90e3..9307999e1 100644 --- a/prog/daNetGame/render/temporalSuperResolution.h +++ b/prog/daNetGame/render/temporalSuperResolution.h @@ -39,7 +39,7 @@ class TemporalSuperResolution : public AntiAliasing eastl::unique_ptr computeRenderer; UniqueTex debugTex; - resource_slot::NodeHandleWithSlotsAccess applierNode; + dabfg::NodeHandle applierNode; Preset preset; }; diff --git a/prog/daNetGame/render/world/bvh.h b/prog/daNetGame/render/world/bvh.h index ea548a751..ac483a6e0 100644 --- a/prog/daNetGame/render/world/bvh.h +++ b/prog/daNetGame/render/world/bvh.h @@ -7,4 +7,9 @@ void initBVH(); void closeBVH(); void prepareFXForBVH(const Point3 &cameraPos); bool is_bvh_enabled(); -void draw_rtr_validation(); \ No newline at end of file +bool is_rtsm_enabled(); +bool is_rtr_enabled(); +bool is_rtao_enabled(); +bool is_denoiser_enabled(); +void draw_rtr_validation(); +void bvh_cables_changed(); \ No newline at end of file diff --git a/prog/daNetGame/render/world/bvhES.cpp.gen.es.cpp b/prog/daNetGame/render/world/bvhES.cpp.gen.es.cpp index 30d37c65c..7689dbf47 100644 --- a/prog/daNetGame/render/world/bvhES.cpp.gen.es.cpp +++ b/prog/daNetGame/render/world/bvhES.cpp.gen.es.cpp @@ -84,11 +84,12 @@ static ecs::EntitySystemDesc bvh_free_visibility_es_es_desc ,"render"); static constexpr ecs::ComponentDesc init_bvh_scene_es_comps[] = { -//start of 5 rw components at [0] +//start of 6 rw components at [0] {ECS_HASH("bvh__update_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("denoiser_prepare_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("rtsm_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("rtr_node"), ecs::ComponentTypeInfo()}, + {ECS_HASH("rtao_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("bvh__rendinst_visibility"), ecs::ComponentTypeInfo()} }; static void init_bvh_scene_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) @@ -99,6 +100,7 @@ static void init_bvh_scene_es_all_events(const ecs::Event &__restrict evt, const , ECS_RW_COMP(init_bvh_scene_es_comps, "denoiser_prepare_node", dabfg::NodeHandle) , ECS_RW_COMP(init_bvh_scene_es_comps, "rtsm_node", dabfg::NodeHandle) , ECS_RW_COMP(init_bvh_scene_es_comps, "rtr_node", dabfg::NodeHandle) + , ECS_RW_COMP(init_bvh_scene_es_comps, "rtao_node", dabfg::NodeHandle) , ECS_RW_COMP(init_bvh_scene_es_comps, "bvh__rendinst_visibility", RiGenVisibilityECS) ); while (++comp != compE); @@ -108,7 +110,7 @@ static ecs::EntitySystemDesc init_bvh_scene_es_es_desc "init_bvh_scene_es", "prog/daNetGame/render/world/bvhES.cpp.inl", ecs::EntitySystemOps(nullptr, init_bvh_scene_es_all_events), - make_span(init_bvh_scene_es_comps+0, 5)/*rw*/, + make_span(init_bvh_scene_es_comps+0, 6)/*rw*/, empty_span(), empty_span(), empty_span(), diff --git a/prog/daNetGame/render/world/bvhES.cpp.inl b/prog/daNetGame/render/world/bvhES.cpp.inl index 3f487f181..742c3dc61 100644 --- a/prog/daNetGame/render/world/bvhES.cpp.inl +++ b/prog/daNetGame/render/world/bvhES.cpp.inl @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -28,6 +31,7 @@ // Can't be stored in ECS, because then it'd be reset on level change. static bvh::ContextId bvhRenderingContextId; static BVHConnection *fxBvhConnection = nullptr; +static bool cablesChanged = false; struct BvhHeightProvider final : public bvh::HeightProvider { @@ -77,16 +81,21 @@ void initBVH() if (is_bvh_enabled()) { bvh::init(bvh::process_elem); - bvhRenderingContextId = - bvh::create_context("Rendering", static_cast(bvh::Features::Terrain | bvh::Features::RIFull | bvh::Features::Fx)); + bvhRenderingContextId = bvh::create_context("Rendering", + static_cast(bvh::Features::Terrain | bvh::Features::RIFull | bvh::Features::Fx | bvh::Features::Cable)); bvh::connect_fx(bvhRenderingContextId, [](BVHConnection *connection) { fxBvhConnection = connection; }); // TODO proper resolution setting support // TODO dynamic resolution support int w, h; d3d::get_screen_size(w, h); - denoiser::initialize(w, h); - rtsm::initialize(w, h, rtsm::RenderMode::Denoised, false); - rtr::initialize(false, true); + if (is_denoiser_enabled()) + denoiser::initialize(w, h); + if (is_rtsm_enabled()) + rtsm::initialize(w, h, rtsm::RenderMode::Denoised, false); + if (is_rtr_enabled()) + rtr::initialize(true, true); + if (is_rtao_enabled()) + rtao::initialize(true); } } @@ -94,6 +103,7 @@ void closeBVH() { if (bvhRenderingContextId) { + rtao::teardown(); rtr::teardown(); rtsm::turn_off(); rtsm::teardown(); @@ -170,12 +180,37 @@ void prepareFXForBVH(const Point3 &cameraPos) { acesfx::prepare_bvh_culling(get_ bool is_bvh_enabled() { - static bool isEnabled = dgs_get_settings()->getBlockByNameEx("graphics")->getBool("enableBVH", false); + // Allow for debugging in the ImGUI window, even with no render features + constexpr bool isDebug = DAGOR_DBGLEVEL > 0; + static bool isEnabled = dgs_get_settings()->getBlockByNameEx("graphics")->getBool("enableBVH", false) && isDebug; + return (bvh::is_available() && isEnabled) || is_rtsm_enabled() || is_rtr_enabled() || is_rtao_enabled(); +} + +bool is_rtsm_enabled() +{ + const char *rtsmSetting = dgs_get_settings()->getBlockByNameEx("graphics")->getStr("enableRTSM", "off"); + static bool isEnabled = strcmp(rtsmSetting, "sun_and_dynamic") == 0 || strcmp(rtsmSetting, "sun") == 0; + return bvh::is_available() && isEnabled; +} + +bool is_rtr_enabled() +{ + static bool isEnabled = dgs_get_settings()->getBlockByNameEx("graphics")->getBool("enableRTR", false); + return bvh::is_available() && isEnabled; +} + +bool is_rtao_enabled() +{ + static bool isEnabled = dgs_get_settings()->getBlockByNameEx("graphics")->getBool("enableRTAO", false); return bvh::is_available() && isEnabled; } +bool is_denoiser_enabled() { return is_rtsm_enabled() || is_rtr_enabled() || is_rtao_enabled(); } + void draw_rtr_validation() { rtr::render_validation_layer(); } +void bvh_cables_changed() { cablesChanged = true; } + static void update_fx_for_bvh() { TIME_D3D_PROFILE(bvh_fx) @@ -208,8 +243,18 @@ static dabfg::NodeHandle makeBVHUpdateNode() bvh::prepare_ri_extra_instances(); Frustum frustum = get_bvh_culling_matrix(cameraPos); rendinst::prepareRIGenVisibility(frustum, cameraPos, visibility, false, nullptr); - bvh::update_instances(bvhRenderingContextId, cameraPos, cameraHndl.ref().jitterFrustum, nullptr, visibility); + bvh::update_instances(bvhRenderingContextId, cameraPos, cameraHndl.ref().jitterFrustum, nullptr, nullptr, visibility); update_fx_for_bvh(); + if (auto cables = get_cables_mgr()) + { + if (cablesChanged) + { + static int globalFrameBlockId = ShaderGlobal::getBlockId("global_frame"); + FRAME_LAYER_GUARD(globalFrameBlockId); + bvh::on_cables_changed(cables, bvhRenderingContextId); + cablesChanged = false; + } + } bvh::build(bvhRenderingContextId, cameraHndl.ref().viewItm, cameraHndl.ref().jitterProjTm, cameraPos, Point3::ZERO); // TODO: data race, because there is no order with daskies::prepare bvh::finalize_async_atmosphere_update(bvhRenderingContextId); @@ -223,7 +268,7 @@ static dabfg::NodeHandle makeBVHUpdateNode() static dabfg::NodeHandle makeDenoiserPrepareNode() { - if (!is_bvh_enabled()) + if (!is_denoiser_enabled()) return {}; return dabfg::register_node("denoiser_prepare", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.executionHas(dabfg::SideEffects::External); @@ -233,7 +278,16 @@ static dabfg::NodeHandle makeDenoiserPrepareNode() read_gbuffer(registry, dabfg::Stage::PS_OR_CS); auto motionVecsHndl = read_gbuffer_motion(registry, dabfg::Stage::PS_OR_CS).handle(); read_gbuffer_depth(registry, dabfg::Stage::PS_OR_CS); - return [cameraHndl, prevCameraHndl, motionVecsHndl]() { + auto downsampledMotionVectorsHndl = registry.read("downsampled_motion_vectors_tex") + .texture() + .atStage(dabfg::Stage::PS_OR_CS) + .useAs(dabfg::Usage::SHADER_RESOURCE) + .handle(); + auto downsampledNormalsHndl = + registry.readTexture("downsampled_normals").atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + registry.read("close_depth").texture().atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("downsampled_close_depth_tex"); + + return [cameraHndl, prevCameraHndl, motionVecsHndl, downsampledMotionVectorsHndl, downsampledNormalsHndl]() { denoiser::FrameParams params; params.viewPos = cameraHndl.ref().viewItm.getcol(3); params.prevViewPos = prevCameraHndl.ref().viewItm.getcol(3); @@ -245,8 +299,10 @@ static dabfg::NodeHandle makeDenoiserPrepareNode() params.prevProjTm = prevCameraHndl.ref().noJitterProjTm; params.jitter = Point2(cameraHndl.ref().jitterPersp.ox, cameraHndl.ref().jitterPersp.oy); params.prevJitter = Point2(prevCameraHndl.ref().jitterPersp.ox, prevCameraHndl.ref().jitterPersp.oy); - params.motionMultiplier = Point3(1, 1, 0); + params.motionMultiplier = Point3::ONE; params.motionVectors = motionVecsHndl.view().getTex2D(); + params.halfMotionVectors = downsampledMotionVectorsHndl.view().getTex2D(); + params.halfNormals = {downsampledNormalsHndl.view().getTex2D(), downsampledNormalsHndl.view().getTexId()}; denoiser::prepare(params); }; }); @@ -257,7 +313,7 @@ static ShaderVariableInfo from_sun_directionVarId = ShaderVariableInfo("from_sun static dabfg::NodeHandle makeRTSMNode() { - if (!is_bvh_enabled()) + if (!is_rtsm_enabled()) return {}; return dabfg::register_node("rtsm", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.executionHas(dabfg::SideEffects::External); @@ -279,7 +335,7 @@ static dabfg::NodeHandle makeRTSMNode() static dabfg::NodeHandle makeRTRNode() { - if (!is_bvh_enabled()) + if (!is_rtr_enabled()) return {}; return dabfg::register_node("rtr", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.executionHas(dabfg::SideEffects::External); @@ -291,9 +347,34 @@ static dabfg::NodeHandle makeRTRNode() read_gbuffer(registry, dabfg::Stage::PS_OR_CS); read_gbuffer_motion(registry, dabfg::Stage::PS_OR_CS); read_gbuffer_depth(registry, dabfg::Stage::PS_OR_CS); - return [cameraHndl]() { + auto closeDepthHndl = + registry.read("close_depth").texture().atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("downsampled_close_depth_tex").handle(); + return [cameraHndl, closeDepthHndl]() { + set_viewvecs_to_shader(cameraHndl.ref().viewTm, cameraHndl.ref().jitterProjTm); + rtr::render(bvhRenderingContextId, cameraHndl.ref().jitterProjTm, true, false, false, closeDepthHndl.view().getTexId()); + }; + }); +} + +static dabfg::NodeHandle makeRTAONode() +{ + if (!is_rtao_enabled()) + return {}; + return dabfg::register_node("rtao", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { + registry.executionHas(dabfg::SideEffects::External); + registry.readBlob("bvh_ready_token"); + registry.readBlob("denoiser_ready_token"); + registry.createBlob("rtao_token", dabfg::History::No); + auto cameraHndl = registry.readBlob("current_camera").handle(); + registry.readBlob("world_view_pos").bindToShaderVar("world_view_pos"); + read_gbuffer(registry, dabfg::Stage::PS_OR_CS); + read_gbuffer_motion(registry, dabfg::Stage::PS_OR_CS); + read_gbuffer_depth(registry, dabfg::Stage::PS_OR_CS); + auto closeDepthHndl = + registry.read("close_depth").texture().atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("downsampled_close_depth_tex").handle(); + return [cameraHndl, closeDepthHndl]() { set_viewvecs_to_shader(cameraHndl.ref().viewTm, cameraHndl.ref().jitterProjTm); - rtr::render(bvhRenderingContextId, cameraHndl.ref().jitterProjTm, true, false, false, BAD_D3DRESID /*TODO::*/); + rtao::render(bvhRenderingContextId, cameraHndl.ref().jitterProjTm, true, closeDepthHndl.view().getTexId()); }; }); } @@ -305,12 +386,14 @@ static void init_bvh_scene_es(const ecs::Event &, dabfg::NodeHandle &denoiser_prepare_node, dabfg::NodeHandle &rtsm_node, dabfg::NodeHandle &rtr_node, + dabfg::NodeHandle &rtao_node, RiGenVisibilityECS &bvh__rendinst_visibility) { bvh__update_node = makeBVHUpdateNode(); denoiser_prepare_node = makeDenoiserPrepareNode(); rtsm_node = makeRTSMNode(); rtr_node = makeRTRNode(); + rtao_node = makeRTAONode(); bvh__rendinst_visibility.visibility = rendinst::createRIGenVisibility(midmem); } @@ -335,8 +418,10 @@ static void process_elem(const ShaderMesh::RElem &elem, static int atlas_last_tileVarId = get_shader_variable_id("atlas_last_tile"); static int detail0_const_colorVarId = get_shader_variable_id("detail0_const_color"); static int paint_const_colorVarId = get_shader_variable_id("paint_const_color"); + static int is_rendinst_clipmapVarId = get_shader_variable_id("is_rendinst_clipmap"); - // TODO trees are not supported yet + int isClipmap = 0; + elem.mat->getIntVariable(is_rendinst_clipmapVarId, isClipmap); bool isTree = strncmp(elem.mat->getShaderClassName(), "rendinst_tree", 13) == 0; bool isLayered = strncmp(elem.mat->getShaderClassName(), "rendinst_layered", 16) == 0 || strncmp(elem.mat->getShaderClassName(), "dynamic_layered", 15) == 0; @@ -399,6 +484,10 @@ static void process_elem(const ShaderMesh::RElem &elem, bool isTwoSided = impostor_textures || (elem.mat->get_flags() & (SHFLG_2SIDED | SHFLG_REAL2SIDED)); + + if (isClipmap) + mesh_info.isClipmap = true; + if (use_paintingValue > 0) { mesh_info.painted = true; diff --git a/prog/daNetGame/render/world/destructablesRenderES.cpp.inl b/prog/daNetGame/render/world/destructablesRenderES.cpp.inl index 9570b61a1..02e131c33 100644 --- a/prog/daNetGame/render/world/destructablesRenderES.cpp.inl +++ b/prog/daNetGame/render/world/destructablesRenderES.cpp.inl @@ -162,6 +162,6 @@ static __forceinline void destructables_render_trans_es(const UpdateStageInfoRen d3d::settm(TM_VIEW, stg.viewTm); } -destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *) { return nullptr; } +destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *, bool) { return nullptr; } void destructables::clear_rend_data(destructables::DestrRendData *) {} void destructables::DestrRendDataDeleter::operator()(destructables::DestrRendData *) {} \ No newline at end of file diff --git a/prog/daNetGame/render/world/dynModelRenderer.cpp b/prog/daNetGame/render/world/dynModelRenderer.cpp index 86e9e5787..2a1fd1946 100644 --- a/prog/daNetGame/render/world/dynModelRenderer.cpp +++ b/prog/daNetGame/render/world/dynModelRenderer.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "dynModelRenderer.h" #include "global_vars.h" #include @@ -12,8 +13,10 @@ #include #include <3d/dag_multidrawContext.h> #include "shaders/dynModelsPackedMultidrawParams.hlsli" +#include #include #include +#include using namespace dynmodel_renderer; @@ -41,6 +44,16 @@ static struct DynModelRendering MultidrawContext multidrawContext = {"dynmodel_multidraw"}; } dynmodel_rendering; +static void fill_node_collapser_data(const DynamicRenderableSceneInstance *scene, + const eastl::span node_collapser_data) +{ + const DynamicRenderableSceneInstance::NodeCollapserBits &ncBits = scene->getNodeCollapserBits(); + node_collapser_data[0] = Point4(bitwise_cast(ncBits[0]), bitwise_cast(ncBits[1]), bitwise_cast(ncBits[2]), + bitwise_cast(ncBits[3])); + node_collapser_data[1] = Point4(bitwise_cast(ncBits[4]), bitwise_cast(ncBits[5]), bitwise_cast(ncBits[6]), + bitwise_cast(ncBits[7])); +} + void DynModelRenderingState::process_animchar(uint32_t start_stage, uint32_t end_stage, const DynamicRenderableSceneInstance *scene, @@ -162,12 +175,21 @@ void DynModelRenderingState::process_animchar(uint32_t start_stage, auto skins = lodResource->getSkins(); const int currentInstanceData = instanceData.size(); const ShaderSkinnedMesh &skin = *skins[0]->getMesh(); - instanceData.resize(instanceData.size() + additional_data_size + skin.bonesCount() * matrixStride); + instanceData.resize(instanceData.size() + additional_data_size + ADDITIONAL_BONE_MTX_OFFSET + skin.bonesCount() * matrixStride); vec4f *__restrict instanceDataPtr = (vec4f *__restrict)&instanceData[currentInstanceData]; + if (additional_data_size) memcpy(instanceDataPtr, bones_additional_data, sizeof(Point4) * additional_data_size); instanceDataPtr += additional_data_size; + + if (render_mask == UpdateStageInfoRender::RenderPass::RENDER_SHADOW) + memset(instanceDataPtr, 0, ADDITIONAL_BONE_MTX_OFFSET * sizeof(Point4)); + else + fill_node_collapser_data(scene, eastl::span(reinterpret_cast(instanceDataPtr), ADDITIONAL_BONE_MTX_OFFSET)); + instanceDataPtr += ADDITIONAL_BONE_MTX_OFFSET; + instanceDataPtr += prepare_bones_to(instanceDataPtr, skin, *scene, addPreviousMatrices); + auto skinNodes = lodResource->getSkinNodes(); for (int i = 0, e = skinNodes.size(); i < e; i++) if ((!path_filter && !scene->isNodeHidden(skinNodes[i])) || diff --git a/prog/daNetGame/render/world/frameGraphNodes/frameGraphNodes.h b/prog/daNetGame/render/world/frameGraphNodes/frameGraphNodes.h index 63271f2a1..2172b7315 100644 --- a/prog/daNetGame/render/world/frameGraphNodes/frameGraphNodes.h +++ b/prog/daNetGame/render/world/frameGraphNodes/frameGraphNodes.h @@ -163,8 +163,12 @@ dabfg::NodeHandle makeStaticUpsampleNode(const char *source_name); dabfg::NodeHandle makeAfterPostFxEcsEventNode(); +resource_slot::NodeHandleWithSlotsAccess makePostFxInputSlotProviderNode(); + resource_slot::NodeHandleWithSlotsAccess makePreparePostFxNode(); +dabfg::NodeHandle makeDistortionFxNode(); + dabfg::NodeHandle makeRenameDepthNode(); eastl::fixed_vector makeSubsamplingNodes(bool sub_sampling, bool super_sampling); @@ -177,7 +181,7 @@ eastl::array makeExternalFinalFrameControlNodes(bool requi dabfg::NodeHandle makePostfxTargetProducerNode(bool requires_multisampling); -resource_slot::NodeHandleWithSlotsAccess makePrepareForPostfxNoAANode(); +dabfg::NodeHandle makePrepareForPostfxNoAANode(); dabfg::NodeHandle makeAfterWorldRenderNode(); diff --git a/prog/daNetGame/render/world/frameGraphNodes/gbufferNodes.cpp b/prog/daNetGame/render/world/frameGraphNodes/gbufferNodes.cpp index 6e572243d..83a7bf748 100644 --- a/prog/daNetGame/render/world/frameGraphNodes/gbufferNodes.cpp +++ b/prog/daNetGame/render/world/frameGraphNodes/gbufferNodes.cpp @@ -175,7 +175,8 @@ static inline float w_to_depth(float w, const Point2 &zNearFar, float def) #define RESOLVE_GBUFFER_SHADERVARS \ VAR(thin_gbuf_resolve, true) \ - VAR(frame_tex, false) + VAR(frame_tex, false) \ + VAR(use_rtr, true) #define VAR(a, o) static int a##VarId = -1; RESOLVE_GBUFFER_SHADERVARS @@ -247,7 +248,7 @@ dabfg::NodeHandle makeResolveGbufferNode(const char *resolve_pshader_name, [resolve_pshader_name, resolve_cshader_name, classify_cshader_name, permutations_desc](dabfg::Registry registry) { auto &wr = *static_cast(get_world_renderer()); registry.orderMeAfter("combine_shadows_node"); - registry.readBlob("rtr_token").optional(); + auto rtrTokenHndl = registry.readBlob("rtr_token").optional().handle(); registry.read("gi_before_frame_lit_token").blob().optional(); auto gbufDepthHndl = @@ -289,6 +290,7 @@ dabfg::NodeHandle makeResolveGbufferNode(const char *resolve_pshader_name, use_volfog(registry, dabfg::Stage::PS_OR_CS); registry.readTexture("ssao_tex").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("ssao_tex").optional(); registry.read("ssao_sampler").blob().bindToShaderVar("ssao_tex_samplerstate").optional(); + registry.readBlob("rtao_token").optional(); // for SSAO&SSR registry.read("upscale_sampling_tex") .texture() @@ -308,10 +310,12 @@ dabfg::NodeHandle makeResolveGbufferNode(const char *resolve_pshader_name, return [enabledDepthBoundsId = shaders::overrides::create(state), shadingResolver = eastl::make_unique(resolve_pshader_name, resolve_cshader_name, classify_cshader_name, permutations_desc), - gbufDepthHndl, finalTargetHndl, cameraHndl, hasAnyDynamicLightsHndl, waterModeHndl]() { + gbufDepthHndl, finalTargetHndl, cameraHndl, hasAnyDynamicLightsHndl, waterModeHndl, rtrTokenHndl]() { // Pointer is always non-zero because world renderer contains this node auto &wr = *static_cast(get_world_renderer()); + ShaderGlobal::set_int(use_rtrVarId, !!rtrTokenHndl.get()); + ManagedTexView finalTarget = finalTargetHndl.view(); ManagedTexView gbufDepth = gbufDepthHndl.view(); const auto &camera = cameraHndl.ref(); diff --git a/prog/daNetGame/render/world/frameGraphNodes/postFxNodes.cpp b/prog/daNetGame/render/world/frameGraphNodes/postFxNodes.cpp index 96d9baf0c..2cd949f59 100644 --- a/prog/daNetGame/render/world/frameGraphNodes/postFxNodes.cpp +++ b/prog/daNetGame/render/world/frameGraphNodes/postFxNodes.cpp @@ -229,14 +229,6 @@ resource_slot::NodeHandleWithSlotsAccess makePostFxNode() registry.readTexture("blood_texture").atStage(dabfg::Stage::PS).bindToShaderVar("blood_texture").optional(); registry.read("blood_on_screen_sampler").blob().bindToShaderVar("blood_texture_samplerstate").optional(); - registry.readTexture("haze_offset").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_offset_tex").optional(); - registry.create("haze_default_sampler", dabfg::History::No) - .blob(d3d::request_sampler({})) - .bindToShaderVar("haze_offset_tex_samplerstate") - .bindToShaderVar("haze_depth_tex_samplerstate") - .optional(); - registry.readTexture("haze_color").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_color_tex").optional(); - registry.readTexture("haze_depth").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_depth_tex").optional(); auto closeupsNs = registry.root() / "opaque" / "closeups"; postfx_bind_additional_textures_from_namespace(closeupsNs); @@ -261,6 +253,15 @@ resource_slot::NodeHandleWithSlotsAccess makePostFxNode() }); } +resource_slot::NodeHandleWithSlotsAccess makePostFxInputSlotProviderNode() +{ + return resource_slot::register_access("postfx_input_slot_provider", DABFG_PP_NODE_SRC, + {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, [](resource_slot::State slotsState, dabfg::Registry registry) { + registry.renameTexture("frame_after_distortion", slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::No); + return []() {}; + }); +} + extern ConVarB adaptationIlluminance; resource_slot::NodeHandleWithSlotsAccess makePreparePostFxNode() @@ -308,4 +309,27 @@ resource_slot::NodeHandleWithSlotsAccess makePreparePostFxNode() ShaderGlobal::set_texture(depth_gbufVarId, BAD_TEXTUREID); }; }); +} + +dabfg::NodeHandle makeDistortionFxNode() +{ + return dabfg::register_node("distortion_postfx_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { + auto frame = registry.createTexture2d("frame_after_distortion", dabfg::History::No, + {TEXFMT_R11G11B10F | TEXCF_RTARGET, registry.getResolution<2>("post_fx")}); + + registry.requestRenderPass().color({frame}); + + registry.readTexture("frame_after_aa").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("frame_tex"); + + registry.readTexture("haze_offset").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_offset_tex").optional(); + registry.create("haze_default_sampler", dabfg::History::No) + .blob(d3d::request_sampler({})) + .bindToShaderVar("haze_offset_tex_samplerstate") + .bindToShaderVar("haze_depth_tex_samplerstate") + .optional(); + registry.readTexture("haze_color").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_color_tex").optional(); + registry.readTexture("haze_depth").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("haze_depth_tex").optional(); + + return [distortionPostfx = PostFxRenderer("distortion_postfx")]() { distortionPostfx.render(); }; + }); } \ No newline at end of file diff --git a/prog/daNetGame/render/world/frameGraphNodes/prepareForPostfxNoAANode.cpp b/prog/daNetGame/render/world/frameGraphNodes/prepareForPostfxNoAANode.cpp index 41e8be286..cc79f7331 100644 --- a/prog/daNetGame/render/world/frameGraphNodes/prepareForPostfxNoAANode.cpp +++ b/prog/daNetGame/render/world/frameGraphNodes/prepareForPostfxNoAANode.cpp @@ -4,10 +4,8 @@ #include "frameGraphNodes.h" -resource_slot::NodeHandleWithSlotsAccess makePrepareForPostfxNoAANode() +dabfg::NodeHandle makePrepareForPostfxNoAANode() { - return resource_slot::register_access("prepare_for_postfx", DABFG_PP_NODE_SRC, - {resource_slot::Create{"postfx_input_slot", "frame_for_postfx"}}, [](resource_slot::State slotsState, dabfg::Registry registry) { - registry.renameTexture("final_target_with_motion_blur", slotsState.resourceToCreateFor("postfx_input_slot"), dabfg::History::No); - }); + return dabfg::register_node("prepare_for_postfx", DABFG_PP_NODE_SRC, + [](dabfg::Registry registry) { registry.renameTexture("final_target_with_motion_blur", "frame_after_aa", dabfg::History::No); }); } diff --git a/prog/daNetGame/render/world/private_worldRenderer.h b/prog/daNetGame/render/world/private_worldRenderer.h index 7efcebd36..dcf09a0b5 100644 --- a/prog/daNetGame/render/world/private_worldRenderer.h +++ b/prog/daNetGame/render/world/private_worldRenderer.h @@ -1248,8 +1248,9 @@ class WorldRenderer final : public IRenderWorld, public IShadowInfoProvider eastl::fixed_vector subSuperSamplingNodes; dabfg::NodeHandle frameToPresentProducerNode; eastl::array externalFinalFrameControlNodes; + dabfg::NodeHandle distortionFxNode; dabfg::NodeHandle postfxTargetProducerNode; - resource_slot::NodeHandleWithSlotsAccess prepareForPostfxNoAANode; + dabfg::NodeHandle prepareForPostfxNoAANode; dabfg::NodeHandle motionBlurAccumulateNode; dabfg::NodeHandle motionBlurApplyNode; MotionBlurNodeStatus motionBlurStatus = MotionBlurNodeStatus::UNINITIALIZED; diff --git a/prog/daNetGame/render/world/worldRenderer.cpp b/prog/daNetGame/render/world/worldRenderer.cpp index 1b0cca55c..dd18f78f0 100644 --- a/prog/daNetGame/render/world/worldRenderer.cpp +++ b/prog/daNetGame/render/world/worldRenderer.cpp @@ -300,7 +300,11 @@ CONSOLE_BOOL_VAL("render", immediate_flush, false); CONSOLE_BOOL_VAL("render", use_24bit_depth, false); CONSOLE_BOOL_VAL("ridestr", show_ri_phys_bboxes, false); +#if DAGOR_DBGLEVEL > 0 CONSOLE_BOOL_VAL("bfg", test_dynamic_node_allocation, false); +#else +static constexpr bool test_dynamic_node_allocation = false; +#endif CONSOLE_FLOAT_VAL_MINMAX("skies", sun_direction_update_threshold_deg, 1, 0, 180); CONSOLE_FLOAT_VAL_MINMAX("skies", dynamic_time_scale, 0, -10000, 10000); @@ -1752,7 +1756,7 @@ eastl::optional WorldRenderer::getDimsForVrsTexture(int screenWidth, in void WorldRenderer::setAntialiasing() { - prepareForPostfxNoAANode.reset(); + prepareForPostfxNoAANode = {}; fxaaNode = {}; ssaaNode = {}; IPoint2 postFxResolution; @@ -1848,7 +1852,7 @@ void WorldRenderer::setResolution() antiAliasing.reset(); closeStaticUpsample(); closeFsr(); - prepareForPostfxNoAANode.reset(); + prepareForPostfxNoAANode = {}; if (hasFeature(FeatureRenderFlags::TAA)) { @@ -2632,8 +2636,10 @@ void WorldRenderer::createNodes() eastl::move(nodes.begin(), nodes.end(), eastl::back_inserter(fgNodeHandles)); } fgNodeHandles.push_back(makeOpaqueDynamicsNode()); + fgNodeHandles.push_back(makeDistortionFxNode()); resource_slot::NodeHandleWithSlotsAccess (*resSlotFactories[])(){ + makePostFxInputSlotProviderNode, makePostFxNode, makePreparePostFxNode, }; @@ -3800,7 +3806,11 @@ void WorldRenderer::beforeRender(float scaled_dt, // should be called in WorldRenderer::beforeRender to avoid data race with ParallelUpdateFrame if (get_cables_mgr()) - get_cables_mgr()->beforeRender(); + { + bool cablesChanged = get_cables_mgr()->beforeRender(); + if (cablesChanged) + bvh_cables_changed(); + } // dispatch performed in this functions, so it should be done in beforeRender { @@ -3945,9 +3955,11 @@ static void set_mip_bias(float bias_value) void WorldRenderer::draw(float realDt) { - screencap::start_prending_request(); // Must call before additional game jobs are started to avoid data race - superPixels = getSuperPixels(); - subPixels = getSubPixels(); + auto callBeforePUFD = []() { // `PUFD` is abbr ParallelUpdateFrameDelayed + screencap::start_pending_request(); + rendinst::applyTiledScenesUpdateForRIGenExtra(2000, 1000); + }; + callBeforePUFD(); // Must be called before additional job (aka PUFD) to avoid data races & lock order inversions start_async_game_tasks(AGT_ADDITIONAL, /*wake*/ true); // Note: long job - start as early as possible const TMatrix &itm = currentFrameCamera.viewItm; @@ -3986,8 +3998,6 @@ void WorldRenderer::draw(float realDt) if (attemptsToUpdateSkySph != 0) // It means that we have failed attempts to compute sky spherical harmonic updateSkyProbeDiffuse(); - rendinst::applyTiledScenesUpdateForRIGenExtra(2000, 1000); - cameraHeight = 4.0f; // fixme: get real height if (lmeshMgr) { @@ -4465,14 +4475,11 @@ void WorldRenderer::draw(float realDt) AimRenderingData aimRenderingData = get_aim_rendering_data(); dabfg::NodeHandle testEmptyNode; - - if (test_dynamic_node_allocation.get()) - { + if (test_dynamic_node_allocation) testEmptyNode = dabfg::register_node("empty_test_node", DABFG_PP_NODE_SRC, [](dabfg::Registry) { return [] {}; }); - } - const bool requiresSubsamplingThisFrame = subPixels > 1; - const bool requiresSuperSamplingThisFrame = superPixels > 1; + const bool requiresSubsamplingThisFrame = (subPixels = getSubPixels()) > 1; + const bool requiresSuperSamplingThisFrame = (superPixels = getSuperPixels()) > 1; if (requiresSuperSamplingThisFrame) { int superW = w * superPixels, superH = h * superPixels; @@ -6034,7 +6041,7 @@ void WorldRenderer::renderWaterSSR(bool enabled, waterSSRStrenght->getTex2D()->generateMips(); ShaderGlobal::set_texture(water_reflection_strenght_texVarId, waterSSRStrenght->getTexId()); - ShaderGlobal::set_int(force_ignore_historyVarId, getSubPixels() > 1 || getSuperPixels() > 1); + ShaderGlobal::set_int(force_ignore_historyVarId, subPixels > 1 || superPixels > 1); } else { @@ -6810,7 +6817,7 @@ int WorldRenderer::getTemporalShadowFramesCount() const return 1; } // Count how many samples will be taken to avoid repeating dithering pattern - return getSubPixels() * getSubPixels(); + return subPixels * subPixels; } int WorldRenderer::getShadowFramesCount() const @@ -6826,7 +6833,7 @@ int WorldRenderer::getShadowFramesCount() const return 8; } // Count how many samples will be taken to avoid repeating dithering pattern - return getSubPixels() * getSubPixels(); + return subPixels * subPixels; } bool WorldRenderer::isTimeDynamic() const { return timeDynamic || dynamic_time_scale != 0; } diff --git a/prog/daNetGame/scripts/das/remote/jsonrpc_args.das b/prog/daNetGame/scripts/das/remote/jsonrpc_args.das index 47caa0e6c..90b4c9fb6 100644 --- a/prog/daNetGame/scripts/das/remote/jsonrpc_args.das +++ b/prog/daNetGame/scripts/das/remote/jsonrpc_args.das @@ -19,7 +19,7 @@ def get_arg_name(params : JsonValue?; name : string) : JsonValue? if params == null return null if params is _object - return (params as _object)?[name] ?? [[JsonValue? ]] + return (params as _object)?[name] ?? [[JsonValue?]] return null diff --git a/prog/daNetGame/scripts/das/remote/jsonrpc_boost.das b/prog/daNetGame/scripts/das/remote/jsonrpc_boost.das index 0a6b6a539..78aa989c5 100644 --- a/prog/daNetGame/scripts/das/remote/jsonrpc_boost.das +++ b/prog/daNetGame/scripts/das/remote/jsonrpc_boost.das @@ -101,34 +101,34 @@ def private transform_args(var func; is_call; var errors : das_string) : bool let processArgsNum = argsNum - (is_call ? 1 : 0) for i in range(processArgsNum) if true - var inscope argi <- new [[ExprCall() at = at, name := "get_arg" ]] + var inscope argi <- new [[ExprCall() at = at, name := "get_arg"]] argi.arguments |> emplace_new(new [[ExprVar() at = at, name := paramsName]]) - argi.arguments |> emplace_new(new [[ExprConstInt() at = at, value = i ]]) + argi.arguments |> emplace_new(new [[ExprConstInt() at = at, value = i]]) assume baseArg = fn.arguments[i] assume baseArgType = baseArg._type if baseArgType.baseType == Type tInt - var inscope toValue <- new [[ExprCall() at = at, name := "as_int" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_int"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif baseArgType.baseType == Type tUInt - var inscope toValue <- new [[ExprCall() at = at, name := "as_uint" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_uint"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif baseArgType.baseType == Type tFloat - var inscope toValue <- new [[ExprCall() at = at, name := "as_float" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_float"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif baseArgType.baseType == Type tDouble - var inscope toValue <- new [[ExprCall() at = at, name := "as_double" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_double"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif baseArgType.baseType == Type tBool - var inscope toValue <- new [[ExprCall() at = at, name := "as_bool" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_bool"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif baseArgType.baseType == Type tString - var inscope toValue <- new [[ExprCall() at = at, name := "as_string" ]] + var inscope toValue <- new [[ExprCall() at = at, name := "as_string"]] toValue.arguments |> emplace(argi) argi |> move() <| toValue elif (baseArgType.baseType == Type tPointer && baseArgType.firstType != null && baseArgType.firstType.baseType == Type tStructure @@ -138,7 +138,7 @@ def private transform_args(var func; is_call; var errors : das_string) : bool errors := "{baseArg.name}: {describe(baseArgType)} - unsupported argument type" return false - var inscope vlet <- new [[ExprLet() at = at, atInit = at ]] + var inscope vlet <- new [[ExprLet() at = at, atInit = at]] vlet.variables |> emplace_new() <| new [[Variable() at = at, name := baseArg.name, _type := baseArgType, diff --git a/prog/daNetGame/scripts/das/remote/jsonrpc_handler.das b/prog/daNetGame/scripts/das/remote/jsonrpc_handler.das index 34d34fa7d..db4f7df9f 100644 --- a/prog/daNetGame/scripts/das/remote/jsonrpc_handler.das +++ b/prog/daNetGame/scripts/das/remote/jsonrpc_handler.das @@ -76,7 +76,7 @@ class JsonRpcMatch : Matcher if length(requests) == 0 return <- [[MatchResult invalid = null]] - return <- [[MatchResult success = end ]] + return <- [[MatchResult success = end]] def parseReq(str : string) : bool var res = false diff --git a/prog/daNetGame/scripts/das/remote/server.das b/prog/daNetGame/scripts/das/remote/server.das index 2e131064d..f2f2db7b1 100644 --- a/prog/daNetGame/scripts/das/remote/server.das +++ b/prog/daNetGame/scripts/das/remote/server.das @@ -19,7 +19,7 @@ class StringMatch : Matcher matchStr = str def override match(str : string) : MatchResult if str == matchStr - return <- [[MatchResult success = length(str) ]] + return <- [[MatchResult success = length(str)]] return <- [[MatchResult invalid = null]] diff --git a/prog/daNetGame/scripts/das/remote/server_agent.das b/prog/daNetGame/scripts/das/remote/server_agent.das index 37429595d..0b7a2650a 100644 --- a/prog/daNetGame/scripts/das/remote/server_agent.das +++ b/prog/daNetGame/scripts/das/remote/server_agent.das @@ -83,7 +83,7 @@ class WebDebugAgent : DapiDebugAgent debug(call) continue unsafe - var scoped = reinterpret (call) + var scoped = reinterpret(call) let currentScope & = *(scoped.ctx) if addr(currentScope) == addr(ctx) toRemoveCalls |> push(name) @@ -101,7 +101,7 @@ class WebDebugAgent : DapiDebugAgent debug(call) continue unsafe - var scoped = reinterpret (call) + var scoped = reinterpret(call) let currentScope & = *(scoped.ctx) if addr(currentScope) == addr(ctx) toRemoveNotifications |> push(name) diff --git a/prog/daNetGame/scripts/stubs/app b/prog/daNetGame/scripts/stubs/app index eb8888ce9..6a2f16c0b 100644 --- a/prog/daNetGame/scripts/stubs/app +++ b/prog/daNetGame/scripts/stubs/app @@ -15,6 +15,7 @@ return { launch_network_session = @(_params) null exit_game = @() null + is_app_terminated = @() false circuit_name = get_arg_value_by_name("circuit") set_timespeed = @(_speed) null get_timespeed = @() 1.0 diff --git a/prog/daNetGame/scripts/stubs/appsFlyer b/prog/daNetGame/scripts/stubs/appsFlyer index 4b11ac674..e2b030a2f 100644 --- a/prog/daNetGame/scripts/stubs/appsFlyer +++ b/prog/daNetGame/scripts/stubs/appsFlyer @@ -5,4 +5,6 @@ return { setAppsFlyerCUID = @(_) null setAppsFlyerConsent = @(_,__,___) null startAppsFlyer = @() null + getAppsFlyerDeepLink = @() "{}" + clearAppsFlyerDeepLink = @() null } \ No newline at end of file diff --git a/prog/daNetGame/setup.jam b/prog/daNetGame/setup.jam index c65413167..680ab0641 100644 --- a/prog/daNetGame/setup.jam +++ b/prog/daNetGame/setup.jam @@ -119,7 +119,7 @@ if $(Platform) && $(Platform) in ps4 ps5 xboxOne scarlett nswitch { # too slow f if $(Platform)-$(PlatformArch) = linux-x86_64 { # same build cfg as linux dedicated (to be able share build output) SSEVersion = 4 ; MArch ?= haswell ; # MOVBE,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,POPCNT,CX16,SAHF,FXSR,AVX,XSAVE,PCLMUL,FSGSBASE,RDRND,F16C,AVX2,BMI,BMI2,LZCNT,FMA,MOVBE,HLE - if ! -march=$(MArch) in $(GlobalCPPopt) { GlobalCPPopt += -march=$(MArch) ; } + if $(MArch) != -default- && ! -march=$(MArch) in $(GlobalCPPopt) { GlobalCPPopt += -march=$(MArch) ; } } FmodStudio ?= 2.01.06 ; diff --git a/prog/daNetGame/shaders/_build/common_assumes.blk b/prog/daNetGame/shaders/_build/common_assumes.blk index 2ef0986b5..7edf6fea3 100644 --- a/prog/daNetGame/shaders/_build/common_assumes.blk +++ b/prog/daNetGame/shaders/_build/common_assumes.blk @@ -30,7 +30,6 @@ has_discard_without_prepass:i=0 bloom_tex:i=1 dof_linear_depth:i = 0 volumetric_light_assumed_off:i=0 -froxel_fog_use_experimental_offscreen_reprojection:i = 0 use_directional_blood_on_screen:i=0 blood_wound_high_quality:i=0 blood_puddles_has_separate_flowmap:i=0 @@ -125,3 +124,4 @@ ssr_denoiser_type:i=0 ds_motion_vectors_with_z:i=1 detect_cockpit_by_distance:i=0 clouds_panorama_split:i=0 +has_pre_exposure:i=0 diff --git a/prog/daNetGame/shaders/_build/common_compatibility_assumes.blk b/prog/daNetGame/shaders/_build/common_compatibility_assumes.blk index 3e770803c..83fa239db 100644 --- a/prog/daNetGame/shaders/_build/common_compatibility_assumes.blk +++ b/prog/daNetGame/shaders/_build/common_compatibility_assumes.blk @@ -17,4 +17,7 @@ shore_distance_field_tex:i=0 object_tess_factor:r=0 gi_quality:i=0 ssr_alternate_reflections:i=0 -static_shadows_cascades:i=2 \ No newline at end of file +static_shadows_cascades:i=2 +froxel_fog_use_experimental_offscreen_reprojection:i = 0 +froxel_fog_use_self_shadowing:i = 0 +lens_zoom_factor:r=1.0 \ No newline at end of file diff --git a/prog/daNetGame/shaders/_build/common_inc_dirs.blk b/prog/daNetGame/shaders/_build/common_inc_dirs.blk index b34fadaaa..45862aae6 100644 --- a/prog/daNetGame/shaders/_build/common_inc_dirs.blk +++ b/prog/daNetGame/shaders/_build/common_inc_dirs.blk @@ -29,6 +29,7 @@ incDir:t="../../../prog/gameLibs/render/rtsm/shaders" //incDir:t="../../../prog/gameLibs/daGI/shaders" incDir:t="../../../prog/gameLibs/render/rtr/shaders" +incDir:t="../../../prog/gameLibs/render/rtao/shaders" incDir:t="../../../prog/gameLibs/bvh/shaders" incDir:t="../../../prog/gameLibs/render/denoiser/shaders/NRD" diff --git a/prog/daNetGame/shaders/_build/raytracing.blk b/prog/daNetGame/shaders/_build/raytracing.blk index 477793556..5271cbdc8 100644 --- a/prog/daNetGame/shaders/_build/raytracing.blk +++ b/prog/daNetGame/shaders/_build/raytracing.blk @@ -1,5 +1,6 @@ include "../../../../prog/gameLibs/render/denoiser/shaders/build.blk" include "../../../../prog/gameLibs/render/rtsm/shaders/build.blk" +include "../../../../prog/gameLibs/render/rtao/shaders/build.blk" include "../../../../prog/gameLibs/render/rtr/shaders/build.blk" "@override:source" diff --git a/prog/daNetGame/shaders/_build/shadersList.blk b/prog/daNetGame/shaders/_build/shadersList.blk index 651425f30..080aebeb9 100644 --- a/prog/daNetGame/shaders/_build/shadersList.blk +++ b/prog/daNetGame/shaders/_build/shadersList.blk @@ -1,6 +1,7 @@ include shadersListCommon.blk file:t = "giHelpers/render_lru_collision.dshl" file:t = "giHelpers/trees_above_process.dshl" + file:t = "giHelpers/trees_above_clear.dshl" file:t = "../computeGradedColorLUT.dshl" file:t = "../fsr.dshl" file:t = "ssr_compute.dshl" diff --git a/prog/daNetGame/shaders/_build/shadersListCommon.blk b/prog/daNetGame/shaders/_build/shadersListCommon.blk index 0e0552b23..213a939a6 100644 --- a/prog/daNetGame/shaders/_build/shadersListCommon.blk +++ b/prog/daNetGame/shaders/_build/shadersListCommon.blk @@ -47,6 +47,7 @@ file:t = "../water_3d_depth.dshl" file:t = "../water_3d_distant.dshl" file:t = "../water_3d_ssr.dshl" + file:t = "../distortion_postfx.dshl" file:t = "../postfx.dshl" file:t = "../static_upsample.dshl" file:t = "../screenshot_composer.dshl" diff --git a/prog/daNetGame/shaders/_build/shadersListForward.blk b/prog/daNetGame/shaders/_build/shadersListForward.blk index d4b0413e8..102629e50 100644 --- a/prog/daNetGame/shaders/_build/shadersListForward.blk +++ b/prog/daNetGame/shaders/_build/shadersListForward.blk @@ -76,6 +76,7 @@ file:t = "find_max_depth_2d.dshl" file:t = "giHelpers/trees_above_process.dshl" + file:t = "giHelpers/trees_above_clear.dshl" file:t = "hudprim/gui_aces.dshl" file:t = "../rendinst_clipmap.dshl" file:t = "../heightmap_patches.dshl" diff --git a/prog/daNetGame/shaders/_build/shadersListMobileDeferred.blk b/prog/daNetGame/shaders/_build/shadersListMobileDeferred.blk index 258e18828..2b5705d54 100644 --- a/prog/daNetGame/shaders/_build/shadersListMobileDeferred.blk +++ b/prog/daNetGame/shaders/_build/shadersListMobileDeferred.blk @@ -76,6 +76,7 @@ file:t = "find_max_depth_2d.dshl" file:t = "giHelpers/trees_above_process.dshl" + file:t = "giHelpers/trees_above_clear.dshl" file:t = "hudprim/gui_aces.dshl" file:t = "../rendinst_clipmap.dshl" file:t = "../heightmap_patches.dshl" diff --git a/prog/daNetGame/shaders/_build/shadersListOculus.blk b/prog/daNetGame/shaders/_build/shadersListOculus.blk index e3d63ceaa..16598bca3 100644 --- a/prog/daNetGame/shaders/_build/shadersListOculus.blk +++ b/prog/daNetGame/shaders/_build/shadersListOculus.blk @@ -80,6 +80,7 @@ file:t = "find_max_depth_2d.dshl" file:t = "giHelpers/trees_above_process.dshl" + file:t = "giHelpers/trees_above_clear.dshl" file:t = "hudprim/gui_aces.dshl" file:t = "../rendinst_clipmap.dshl" file:t = "../heightmap_patches.dshl" diff --git a/prog/daNetGame/shaders/_build/shaders_dx12xs.blk b/prog/daNetGame/shaders/_build/shaders_dx12xs.blk index 52d92a65b..9e0835bbd 100644 --- a/prog/daNetGame/shaders/_build/shaders_dx12xs.blk +++ b/prog/daNetGame/shaders/_build/shaders_dx12xs.blk @@ -11,6 +11,7 @@ include "shaders_xboxOne.blk" "@override:assume_vars" { gi_voxelize_use_multidraw:i=1 + froxel_fog_use_experimental_offscreen_reprojection:i = 1 // we don't have DF on this platform, but we can afford this feature at least "@override:dagi_sp_has_exposure_assume":i=0 } } diff --git a/prog/daNetGame/shaders/_build/shaders_tools11.blk b/prog/daNetGame/shaders/_build/shaders_tools11.blk index 986763481..31484732f 100644 --- a/prog/daNetGame/shaders/_build/shaders_tools11.blk +++ b/prog/daNetGame/shaders/_build/shaders_tools11.blk @@ -82,6 +82,7 @@ Compile baked_impostor_multisample:i=1 fx_apply_volfog_per_pixel:i=1 fx_has_volfog_injection:i=1 + froxel_fog_use_experimental_offscreen_reprojection:i = 0 use_ssss:i=0 ssss_quality:i=0 rendinst_use_cell_sbuffer:i=0 diff --git a/prog/daNetGame/shaders/animchar_additional_data_types.hlsli b/prog/daNetGame/shaders/animchar_additional_data_types.hlsli index 7fff5c9cc..570604cb4 100644 --- a/prog/daNetGame/shaders/animchar_additional_data_types.hlsli +++ b/prog/daNetGame/shaders/animchar_additional_data_types.hlsli @@ -9,3 +9,6 @@ //todo: should be splitted into separate parameters. Now there are: burning, projective blood decals, torn wounds #define HUMAN_COMBINED_PARAMS 7 + +// 2 float4 rows for 2*4*32 bits, for masking a maximum of 256 bones +#define ADDITIONAL_BONE_MTX_OFFSET 2 diff --git a/prog/daNetGame/shaders/clipmap_common_inc.dshl b/prog/daNetGame/shaders/clipmap_common_inc.dshl index 360e10708..cf0f70194 100644 --- a/prog/daNetGame/shaders/clipmap_common_inc.dshl +++ b/prog/daNetGame/shaders/clipmap_common_inc.dshl @@ -46,11 +46,9 @@ macro USE_CLIPMAP_VS(VS_INPUT_M, VS_OUTPUT_M, use_worldpos_from_input) output.tcWorldPos.w = worldPos.y; #endif #if !PN_TESSELATION - float heightForPuddle = worldPos.y; // no displacement without tessellation, it's not accurate at all if the triangle edges are long #if NEED_TC_WORLDPOS output.tcWorldPos.w = worldPos.y; - output.heightForPuddle = heightForPuddle; #endif #endif @@ -110,7 +108,11 @@ macro USE_CLIPMAP_PS(VS_OUTPUT, use_worldpos_from_input) computeSnowSparkle(realWorldPos, world_view_pos, sparkles, result.normal, result.smoothness); calculateHeightmapMicrodetails(result, detailNo, tcWorldPos, realWorldPos, verticalNormal, clipNormalXY, porosity, normalWetness, wetness); - half puddle = addPuddles(result, realWorldPos, input.tcWorldPos.w, htTc, porosity, input.heightForPuddle); + ##if shader == rendinst_landclass + half puddle = addPuddlesWithConstHeight(result, realWorldPos, input.tcWorldPos.w, htTc, porosity, worldPos.y + get_landclass_water_level()); + ##else + half puddle = addPuddles(result, realWorldPos, input.tcWorldPos.w, htTc, porosity, input.tcWorldPos.w); + ##endif ##else result.albedo.rgb = float3(0.5, 0.5, 0.5); ##endif diff --git a/prog/daNetGame/shaders/combine_shadows.dshl b/prog/daNetGame/shaders/combine_shadows.dshl index 82eb4029a..68bd7b0c7 100644 --- a/prog/daNetGame/shaders/combine_shadows.dshl +++ b/prog/daNetGame/shaders/combine_shadows.dshl @@ -107,7 +107,7 @@ shader combine_shadows float NoL = dot(gbuffer.normal, -from_sun_direction); float additionalLight = load_additional_light(input.texcoord); BRANCH - if (!(isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile) && gbuffer.translucency > 1.0/255) && NoL <= 0.f) + if (!(isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile) && gbuffer.translucency > 1.0/255) && NoL <= 0.f) { float cloudsShadow = calculate_clouds_shadow(additionalLight, input.texcoord, input.viewVec); return get_black_shadow(additionalLight, cloudsShadow); diff --git a/prog/daNetGame/shaders/combine_shadows_common.dshl b/prog/daNetGame/shaders/combine_shadows_common.dshl index afd4a189b..1077443cb 100644 --- a/prog/daNetGame/shaders/combine_shadows_common.dshl +++ b/prog/daNetGame/shaders/combine_shadows_common.dshl @@ -386,7 +386,7 @@ macro USE_COMBINE_SHADOWS() if (contactShadow<0.999) { ProcessedGbuffer gbuffer = readProcessedGbuffer(hitUV);//reads TWO textures - material and translucency!!!. Can be optimized, probably. - if (isSubSurfaceProfileValid(gbuffer.sss_profile)) + if (isTranslucentProfileValid(gbuffer.sss_profile)) contactShadow = lerp(contactShadow, contactShadow*0.25 + 0.75, gbuffer.translucency); ##if shadows_quality != high contactShadow = gbuffer.dynamic ? 1.0 : contactShadow; diff --git a/prog/daNetGame/shaders/deferred_light_common.dshl b/prog/daNetGame/shaders/deferred_light_common.dshl index 215f8f8a5..d0dec9c8d 100644 --- a/prog/daNetGame/shaders/deferred_light_common.dshl +++ b/prog/daNetGame/shaders/deferred_light_common.dshl @@ -16,7 +16,6 @@ include "custom_probe_inc.dshl" include "world_sdf.dshl" include "use_gi.dshl" -include "rtr_use.dshl" int shadow_frame = 0; @@ -51,7 +50,6 @@ macro INIT_AND_USE_DEFERRED_LIGHT_COMMON(code) USE_CUSTOM_PROBE(code) USE_HDR(code) INIT_HDR(code) - USING_RTR(code) (code) { hero_cockpit_camera_to_point@f3 = hero_cockpit_camera_to_point; @@ -263,15 +261,7 @@ macro INIT_AND_USE_DEFERRED_LIGHT_COMMON(code) half3 totalReflection = environmentAmbientReflection; - /*#if HAS_RTR - // TODO make a variant for this to avoid calculating with SSR at all - if (isRTREnabled()) - { - totalReflection = getRTR(viewPixcoord.xy); - } - else - #endif - { + /*{ half4 ssrReflections = getSSR(gbuffer.linearRoughness, vr_reproject(viewTexcoord, rawDepth), viewPixcoord); half enviSSR = (1-ssrReflections.a); diff --git a/prog/daNetGame/shaders/deferred_shadow_common.dshl b/prog/daNetGame/shaders/deferred_shadow_common.dshl index 7d23b51ae..f8cc3e145 100644 --- a/prog/daNetGame/shaders/deferred_shadow_common.dshl +++ b/prog/daNetGame/shaders/deferred_shadow_common.dshl @@ -29,6 +29,8 @@ include "deferred_snow_cover.dshl" include "water_heightmap.dshl" include "use_gi.dshl" include "night_light.dshl" +include "rtao_use.dshl" +include "rtr_use.dshl" float4 stereo_params = (0, 0, 0, 0); @@ -58,6 +60,7 @@ int combined_shadows_has_caustics; float4 tank_cockpit__bsphere = float4(0., 0., 0., 0.); float tank_cockpit_fake_ambient_light_strength = 0.25; +int use_rtr = 0; macro COMMON_RESOLVE_SIMPLE(code) (code) { @@ -114,6 +117,9 @@ macro COMMON_RESOLVE_EXTENDED(code) USE_UPSCALE_SAMPLING_BASE(code) INIT_SSAO_BASE(code) USE_SSAO_UPSCALE_BASE_WITH_SMP(code, ssao_tex_samplerstate) + USING_RTAO(code, 3) + USING_RTR(code) + (code) {use_rtr@i1 = use_rtr;} hlsl(code) { #define SSR_UPSCALE_MODE SSR_UPSCALE_MISS_HIT_AWARE @@ -333,6 +339,12 @@ macro USE_DEFERRED_SHADOW_PER_SAMPLE(code) half4 ssrReflections = getSSRWeighted(gbuffer.linearRoughness, curViewTc, screenpos, weights); //SSAO_TYPE ssao = getSSAO(w, screenpos); + if (isRTAOEnabled()) + { + float rtao = getRTAO(uint2(screenpos)); + ssao.x = rtao; + } + patch_gbuffer(gbuffer, worldPos.xyz, ssao.x); //ssao = 1; //gbuffer.diffuseColor = 0.5; @@ -342,7 +354,7 @@ macro USE_DEFERRED_SHADOW_PER_SAMPLE(code) float geometryFactor = 1; - half translucencyStrength = isSubSurfaceProfileValid(gbuffer.sss_profile) ? gbuffer.translucency : 0; + half translucencyStrength = isTranslucentProfileValid(gbuffer.sss_profile) ? gbuffer.translucency : 0; // zero and disabled if not subsurface and sss profile is not cloth, see processGbuffer float sheenStrength = gbuffer.sheen; @@ -381,7 +393,7 @@ macro USE_DEFERRED_SHADOW_PER_SAMPLE(code) float NoL = dot(gbuffer.normal, lightDir); half3 result = 0; - bool isValidSubsurface = isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile); + bool isValidSubsurface = isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile); float csmShadow, ssssTransmittance, base_caustics, cloudShadow; get_combined_shadows_sample(curViewTc, csmShadow, ssssTransmittance, base_caustics, cloudShadow); @@ -547,10 +559,19 @@ macro USE_DEFERRED_SHADOW_PER_SAMPLE(code) //totalReflection *= specularAOcclusion; ##endif + // isRTREnabled returns true when SSR denoiser is used, so use_rtr works around that + if (isRTREnabled() && use_rtr) + { + totalReflection = getRTR(uint2(screenpos)) * enviBRDF; + } + + + bool isTranslucent = + (isFoliageShader(gbuffer.material) || (isSubSurfaceShader(gbuffer.material) && gbuffer.sss_profile == SSS_PROFILE_NEUTRAL_TRANSLUCENT)) && + translucencyStrength > 1.0/255; - bool isSubSurfaceFoliage = isFoliageShader(gbuffer.material) && translucencyStrength > 1.0/255; BRANCH - if (isSubSurfaceFoliage) + if (isTranslucent) { if ((SSSshadow > 0)) { result += (gbuffer.ao * foliageSSS(NoL, view, lightDir) * SSSshadow) * lightColor * gbuffer.translucencyColor; diff --git a/prog/daNetGame/shaders/deferred_shadow_simple.dshl b/prog/daNetGame/shaders/deferred_shadow_simple.dshl index 94faaf140..a46da746b 100644 --- a/prog/daNetGame/shaders/deferred_shadow_simple.dshl +++ b/prog/daNetGame/shaders/deferred_shadow_simple.dshl @@ -176,7 +176,8 @@ shader deferred_simple, satellite_render_resolve float NoL = dot(gbuffer.normal, lightDir); half3 result = 0; - bool subSurface = isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile); + + bool subSurface = isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile); half vsmShadow = 1; half otherShadow = clouds_shadow(worldPos.xyz); diff --git a/prog/daNetGame/shaders/distortion_postfx.dshl b/prog/daNetGame/shaders/distortion_postfx.dshl new file mode 100644 index 000000000..f897bef68 --- /dev/null +++ b/prog/daNetGame/shaders/distortion_postfx.dshl @@ -0,0 +1,129 @@ +include "contrast_adaptive_sharpening.dshl" +include "heatHazeOffset.dshl" +include "postfx_common.dshl" + +float4 chromatic_aberration_params = float4(0.01,0.007,1,0); + +shader distortion_postfx { + + INIT_HEAT_HAZE_OFFSET() + USE_HEAT_HAZE_OFFSET() + COMMON_POSTFX() + INIT_CONTRAST_ADAPTIVE_SHARPENING(ps) + USE_CONTRAST_ADAPTIVE_SHARPENING(ps) + + local float4 frame_tex_resolution = get_dimensions(frame_tex, 0); + + (ps) { + frame_tex@smp2d = frame_tex; + frame_tex_resolution@f4 = (frame_tex_resolution.xy, 1/frame_tex_resolution.xy); + chromatic_aberration_params@f3 = chromatic_aberration_params; + } + + hlsl(ps) { + #include + #include + #include + + float4 blurred_source2(float2 tc, float2 offset, out float4 centerSample){ + //Can be changed to tex2Dlod with mipmap filter + float4 c0 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, -1) * offset, 0.0, 0.0)); + float4 c1 = h4tex2Dlod(frame_tex, half4(tc + float2(0, -1) * offset, 0.0, 0.0)); + float4 c2 = h4tex2Dlod(frame_tex, half4(tc + float2(1, -1) * offset, 0.0, 0.0)); + float4 c3 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, 0) * offset, 0.0, 0.0)); + float4 c4 = h4tex2Dlod(frame_tex, half4(tc, 0.0, 0.0)); + float4 c5 = h4tex2Dlod(frame_tex, half4(tc + float2(1, 0) * offset, 0.0, 0.0)); + float4 c6 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, 1) * offset, 0.0, 0.0)); + float4 c7 = h4tex2Dlod(frame_tex, half4(tc + float2(0, 1) * offset, 0.0, 0.0)); + float4 c8 = h4tex2Dlod(frame_tex, half4(tc + float2(1, 1) * offset, 0.0, 0.0)); + centerSample = c4; + return 0.0625f * (c0 + 2 * c1 + c2 + 2 * c3 + 4 * c4 + 2 * c5 + c6 + 2 * c7 + c8); + } + + float4 blurred_source(float2 tc, float offset){ + float4 centerSample; + return blurred_source2(tc, float2(offset,offset), centerSample); + } + + half3 sampleSceneColor(float2 uv) + { + if(contrast_adaptive_sharpening < -0.125) + return tex2DCAS(frame_tex, uv, frame_tex_resolution.xy, frame_tex_resolution.zw, contrast_adaptive_sharpening).rgb; + else + return tex2Dlod(frame_tex, float4(uv,0,0)).rgb; + } + + float4 distortion_postfx_ps(VsOutput input HW_USE_SCREEN_POS) : SV_Target0 + { + half2 distortionOffset; + half3 distortionOffsetMul; + half distortionBlur; + sample_heat_haze_offset_mul_blur(input.tc, distortionOffset, distortionOffsetMul, distortionBlur); + + float2 sceneUV = input.tc + distortionOffset; + float3 frame; + + BRANCH + if (all(distortionOffsetMul == 1)) + { + ##if (haze_offset_tex != NULL) + BRANCH + if (distortionBlur > distortionBlurThreshold) + frame = blurred_source(sceneUV, distortionBlur).rgb; + else + ##endif + frame = sampleSceneColor(sceneUV); + } + else + { + ##if (haze_offset_tex != NULL) + BRANCH + if (distortionBlur > distortionBlurThreshold) + { + frame.r = blurred_source(input.tc + distortionOffset * distortionOffsetMul.r, distortionBlur).r; + frame.g = blurred_source(input.tc + distortionOffset * distortionOffsetMul.g, distortionBlur).g; + frame.b = blurred_source(input.tc + distortionOffset * distortionOffsetMul.b, distortionBlur).b; + } + else + ##endif + { + frame.r = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.r).r; + frame.g = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.g).g; + frame.b = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.b).b; + } + } + + BRANCH + if (chromatic_aberration_params.z < 1) + { + float2 screenPosR = (input.tc + distortionOffset * distortionOffsetMul.r)*2-1; + float2 screenPosG = (input.tc + distortionOffset * distortionOffsetMul.g)*2-1; + float4 screenPos = float4(screenPosR, screenPosG); + float2 caRGScale = chromatic_aberration_params.xy; + float caStartOffset = chromatic_aberration_params.z; + + float4 uvRG; + uvRG = screenPos - sign(screenPos) * saturate(abs(screenPos) - caStartOffset) * caRGScale.xxyy; + uvRG = uvRG*0.5+0.5; + ##if (haze_offset_tex != NULL) + BRANCH + if (distortionBlur > distortionBlurThreshold) + { + frame.r = blurred_source(uvRG.xy, distortionBlur).r; + frame.g = blurred_source(uvRG.zw, distortionBlur).g; + } + else + ##endif + { + frame.r = sampleSceneColor(uvRG.xy).r; + frame.g = sampleSceneColor(uvRG.zw).g; + } + } + + return float4(frame, 1.0); + } + } + + compile("target_vs", "postfx_vs"); + compile("target_ps", "distortion_postfx_ps"); +} \ No newline at end of file diff --git a/prog/daNetGame/shaders/gbuffer.dshl b/prog/daNetGame/shaders/gbuffer.dshl index 28f02d5a7..4907c04b5 100644 --- a/prog/daNetGame/shaders/gbuffer.dshl +++ b/prog/daNetGame/shaders/gbuffer.dshl @@ -38,6 +38,7 @@ hlsl { #define SSS_PROFILE_MASK 0xF8 #define SSS_PROFILE_EYES 0xF0 #define SSS_PROFILE_CLOTH 0x08 +#define SSS_PROFILE_NEUTRAL_TRANSLUCENT 0x10 bool isSubSurfaceShader(int material) { ##if mobile_render == deferred @@ -51,6 +52,10 @@ bool isEmissiveShader(float material) {return material == SHADING_SELFILLUM;} bool isFoliageShader(uint material) {return material == SHADING_FOLIAGE;} bool isSubSurfaceProfileValid(uint sss_profile) { + return sss_profile != SSS_PROFILE_EYES && sss_profile != SSS_PROFILE_CLOTH && sss_profile != SSS_PROFILE_NEUTRAL_TRANSLUCENT; +} + +bool isTranslucentProfileValid(uint sss_profile) { return sss_profile != SSS_PROFILE_EYES && sss_profile != SSS_PROFILE_CLOTH; } @@ -276,6 +281,11 @@ hlsl(code) { return gbuffer; } + + #ifndef NEUTRAL_SSS_FACTOR + #define NEUTRAL_SSS_FACTOR half3(1,1,1) + #endif + #ifndef BLOOD_SSS_FACTOR #define BLOOD_SSS_FACTOR half3(0.8,0.4,0.3) #endif @@ -285,7 +295,7 @@ hlsl(code) { #endif #ifndef SHEEN_SSS_FACTOR - #define SHEEN_SSS_FACTOR half3(1,1,1) + #define SHEEN_SSS_FACTOR NEUTRAL_SSS_FACTOR #endif ProcessedGbuffer processGbuffer(UnpackedGbuffer gbuf) @@ -301,8 +311,8 @@ hlsl(code) { gbuffer.extracted_albedo_ao = decode_albedo_ao(gbuf.albedo); gbuffer.diffuseColor = gbuf.albedo-gbuffer.metalness*gbuf.albedo;//*(1-met) gbuffer.albedo = gbuf.albedo; - gbuffer.translucencyColor = isSubSurfaceProfileValid(gbuf.sss_profile) ? (gbuffer.diffuseColor * gbuffer.translucency) : gbuf.sss_profile == SSS_PROFILE_CLOTH ? SHEEN_SSS_FACTOR : 0; - gbuffer.translucencyColor *= gbuffer.material == SHADING_SUBSURFACE ? (gbuf.sss_profile == 0 ? BLOOD_SSS_FACTOR : half3(1, 1, 1)) : LEAVES_SSS_FACTOR; + gbuffer.translucencyColor = isTranslucentProfileValid(gbuf.sss_profile) ? (gbuffer.diffuseColor * gbuffer.translucency) : gbuf.sss_profile == SSS_PROFILE_CLOTH ? SHEEN_SSS_FACTOR : 0; + gbuffer.translucencyColor *= gbuffer.material == SHADING_SUBSURFACE ? (gbuf.sss_profile == 0 ? BLOOD_SSS_FACTOR : NEUTRAL_SSS_FACTOR) : LEAVES_SSS_FACTOR; gbuffer.sheen = gbuf.sss_profile == SSS_PROFILE_CLOTH ? gbuf.translucency : 0; gbuffer.shadow = gbuf.shadow; gbuffer.dynamic = gbuf.dynamic; @@ -430,7 +440,7 @@ macro WRITE_GBUFFER() } else if (mobile_render == forward) { - WRITE_GBUFFER_FORWARD() + WRITE_GBUFFER_FORWARD_WITH_EXPOSURE() } else { diff --git a/prog/daNetGame/shaders/gbuffer_forward.dshl b/prog/daNetGame/shaders/gbuffer_forward.dshl index ec95249c7..205530f6c 100644 --- a/prog/daNetGame/shaders/gbuffer_forward.dshl +++ b/prog/daNetGame/shaders/gbuffer_forward.dshl @@ -70,7 +70,7 @@ macro INIT_AND_USE_TILED_LIGHTS_FORWARD() } endmacro -macro WRITE_GBUFFER_FORWARD() +macro WRITE_GBUFFER_FORWARD_BASE(preExposureTerm) if (use_postfx == off) { USE_FULL_TONEMAP_LUT(ps) @@ -175,7 +175,7 @@ macro WRITE_GBUFFER_FORWARD() #if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT half backlight = 0.0f; #if USE_SSS_THIN - if (isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile)) + if (isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile)) backlight += foliageSSSfast(NoL) * gbuffer.translucency; #endif sunLight = diffuseLambert( gbuffer.diffuseColor ) * (saturate(NoL) + backlight) * shadow; @@ -226,7 +226,7 @@ macro WRITE_GBUFFER_FORWARD() half3 ambientLight = enviAO * environmentAmbientUnoccludedLighting * gbuffer.diffuseColor; #if USE_SSS_THIN - if (isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile)) + if (isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile)) ambientLight *= (1.0f + gbuffer.translucency); #endif @@ -356,7 +356,7 @@ macro WRITE_GBUFFER_FORWARD() GBUFFER_OUTPUT encode_gbuffer(UnpackedGbuffer gbuf, float3 pointToEye, float4 screenPos) { - return encode_gbuffer_exposure(gbuf, pointToEye, screenPos, get_exposure_mul(), + return encode_gbuffer_exposure(gbuf, pointToEye, screenPos, preExposureTerm, gbuffer_sun_light_dir.xyz, gbuffer_sun_light_col.rgb, gbuffer_enviSPH0, gbuffer_enviSPH1, gbuffer_enviSPH2, gbuffer_sun_light_col.w); } @@ -377,4 +377,12 @@ macro WRITE_GBUFFER_FORWARD() } #endif } +endmacro + +macro WRITE_GBUFFER_FORWARD_WITH_EXPOSURE() + WRITE_GBUFFER_FORWARD_BASE(get_exposure_mul()) +endmacro + +macro WRITE_GBUFFER_FORWARD() + WRITE_GBUFFER_FORWARD_BASE(1) endmacro \ No newline at end of file diff --git a/prog/daNetGame/shaders/gbuffer_thin.dshl b/prog/daNetGame/shaders/gbuffer_thin.dshl index 32fa2c727..0d3421619 100644 --- a/prog/daNetGame/shaders/gbuffer_thin.dshl +++ b/prog/daNetGame/shaders/gbuffer_thin.dshl @@ -19,8 +19,6 @@ macro WRITE_GBUFFER_THIN() GBUFFER_OUTPUT apply_gbuffer_hdr(GBUFFER_OUTPUT ret) { - ret.sunLight.rgb *= get_exposure_mul(); - ret.ambientLight.rgb *= get_exposure_mul(); #if BLEND_GBUFFER ret.sunLight.a = 0; ret.ambientLight.a = 0; @@ -63,7 +61,7 @@ macro WRITE_GBUFFER_THIN() #if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT half backlight = 0.0f; #if USE_SSS_THIN - if (isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile)) + if (isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile)) backlight += foliageSSSfast(NoL) * gbuffer.translucency; #endif sunLight = diffuseLambert( gbuffer.diffuseColor ) * (saturate(NoL) + backlight) * shadow; @@ -111,7 +109,8 @@ macro WRITE_GBUFFER_THIN() half3 ambientLight = enviAO * environmentAmbientUnoccludedLighting * gbuffer.diffuseColor; #if USE_SSS_THIN - if (isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile)) + // @TODO: unlock + if (isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile)) ambientLight *= (1.0f + gbuffer.translucency); #endif @@ -120,8 +119,7 @@ macro WRITE_GBUFFER_THIN() //envi- ambientLight += gbuffer.emissionColor + environmentAmbientReflection; - ambientLight *= exposure;//hdr - ret.sunLight.rgb = sunLight*exposure;//hdr + ret.sunLight.rgb = sunLight;//hdr ret.ambientLight.rgb = ambientLight;//hdr ret.sunLight.a = 0; diff --git a/prog/daNetGame/shaders/icon_render.dshl b/prog/daNetGame/shaders/icon_render.dshl index 50319ded0..928becfde 100644 --- a/prog/daNetGame/shaders/icon_render.dshl +++ b/prog/daNetGame/shaders/icon_render.dshl @@ -344,7 +344,7 @@ shader deferred_immediate_resolve float NoL = dot(gbuffer.normal, lightDir); half3 result = 0; - bool subSurface = isSubSurfaceShader(gbuffer.material) && isSubSurfaceProfileValid(gbuffer.sss_profile); + bool subSurface = isSubSurfaceShader(gbuffer.material) && isTranslucentProfileValid(gbuffer.sss_profile); half csmShadow = 1; diff --git a/prog/daNetGame/shaders/optional_puddle_access.dshl b/prog/daNetGame/shaders/optional_puddle_access.dshl index ccd4ab3d7..8e3ff37cb 100644 --- a/prog/daNetGame/shaders/optional_puddle_access.dshl +++ b/prog/daNetGame/shaders/optional_puddle_access.dshl @@ -7,13 +7,13 @@ endmacro define_macro_if_not_defined USE_PUDDLE(stage) hlsl(stage) { - void getPuddleData(float tc_world_pos_w, float3 worldPos, float hmapH, out float puddle, out float worldPosYPuddleOffset, out float puddleHeight) + void getPuddleData(float tc_world_pos_w, float3 worldPos, float hmapH, out float puddle, out float worldPosYPuddleOffset, inout float puddleHeight) { puddle = 0; worldPosYPuddleOffset = 0; puddleHeight = 0; } - void getPuddleData(float tc_world_pos_w, float3 worldPos, out float puddle, out float worldPosYPuddleOffset, out float puddleHeight) + void getPuddleData(float tc_world_pos_w, float3 worldPos, out float puddle, out float worldPosYPuddleOffset, inout float puddleHeight) { getPuddleData(tc_world_pos_w, worldPos, tc_world_pos_w, puddle, worldPosYPuddleOffset, puddleHeight); } @@ -32,5 +32,10 @@ define_macro_if_not_defined USE_AND_CALCULATE_PUDDLES() { return 0; } + + half addPuddlesWithConstHeight(inout UnpackedGbuffer result, float3 worldPos, half tc_world_pos_w, float2 htTc, half porosity, float puddleHeight) + { + return 0; + } } endmacro \ No newline at end of file diff --git a/prog/daNetGame/shaders/postfx.dshl b/prog/daNetGame/shaders/postfx.dshl index 99be3d983..0b0bfe412 100644 --- a/prog/daNetGame/shaders/postfx.dshl +++ b/prog/daNetGame/shaders/postfx.dshl @@ -5,7 +5,6 @@ include "sky_shader_global.dshl" include "contact_shadows.dshl" include "clouds_vars.dshl" include "tonemapHelpers/use_full_tonemap_lut_inc.dshl" -include "heatHazeOffset.dshl" include "film_grain_inc.dshl" include "vignette_inc.dshl" include "flare_inc.dshl" @@ -20,7 +19,6 @@ texture fire_on_screen_tex; texture flash_blind_screen_tex; texture smoke_blackout_tex; -float4 chromatic_aberration_params = float4(0.01,0.007,1,0); float dash_ability_factor = 0; float confusion_effect_time_start = -1000; @@ -58,8 +56,6 @@ interval antialiasing_type: dlss < 1, taa < 2, tsr; int fsr_on = 1; -float contrast_adaptive_sharpening = -0.125; - define_macro_if_not_defined INIT_POSTFX_MODIFIER() endmacro @@ -88,7 +84,7 @@ hlsl(code) { float get_local_exposure(float3 frame, float2 tc) { - return getPrevExposureRatio(); + return getExposureScale(); } } endmacro @@ -126,13 +122,11 @@ shader postfx fsr_on@i1 = (fsr_on); frame_tex@smp2d = frame_tex; frame_tex_resolution@f4 = (frame_tex_resolution.xy, 1/frame_tex_resolution.xy); - contrast_adaptive_sharpening@f1 = contrast_adaptive_sharpening; damage_indicator_color@f4 = (damage_indicator_color.x, damage_indicator_color.y, damage_indicator_color.z, damage_indicator); // 0.21 and 0.09 are arbitrary values, which look good with the effect damage_indicator_size__blood@f2 = (damage_indicator_size + 0.21 + 0.09*damage_indicator, blood_on_screen, 0, 0); blood_texture@smp2d = blood_texture; screen_droplets_tex@smp2d = screen_droplets_tex; - chromatic_aberration_params@f3 = chromatic_aberration_params; confusion_params@f4 = ((time_phase(0, 0) - confusion_effect_time_start) / confusion_effect_duration * confusion_effect_speed * 20, (time_phase(0, 0) - confusion_effect_time_start) / confusion_effect_duration * confusion_effect_speed * 11, (time_phase(0, 0) - confusion_effect_time_start) / confusion_effect_duration * -3.5, @@ -186,11 +180,10 @@ shader postfx #define concussion_offset_time concussion_flash_fire_times.z } - INIT_HEAT_HAZE_OFFSET() - USE_HEAT_HAZE_OFFSET() COMMON_POSTFX() HDR_PS_OUTPUT(POSTFX_OUTPUT, float4) ENABLE_ASSERT(ps) + INIT_CONTRAST_ADAPTIVE_SHARPENING(ps) USE_CONTRAST_ADAPTIVE_SHARPENING(ps) hlsl(ps) { @@ -198,21 +191,6 @@ shader postfx #include #include - float4 blurred_source2(float2 tc, float2 offset, out float4 centerSample){ - //Can be changed to tex2Dlod with mipmap filter - float4 c0 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, -1) * offset, 0.0, 0.0)); - float4 c1 = h4tex2Dlod(frame_tex, half4(tc + float2(0, -1) * offset, 0.0, 0.0)); - float4 c2 = h4tex2Dlod(frame_tex, half4(tc + float2(1, -1) * offset, 0.0, 0.0)); - float4 c3 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, 0) * offset, 0.0, 0.0)); - float4 c4 = h4tex2Dlod(frame_tex, half4(tc, 0.0, 0.0)); - float4 c5 = h4tex2Dlod(frame_tex, half4(tc + float2(1, 0) * offset, 0.0, 0.0)); - float4 c6 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, 1) * offset, 0.0, 0.0)); - float4 c7 = h4tex2Dlod(frame_tex, half4(tc + float2(0, 1) * offset, 0.0, 0.0)); - float4 c8 = h4tex2Dlod(frame_tex, half4(tc + float2(1, 1) * offset, 0.0, 0.0)); - centerSample = c4; - return 0.0625f * (c0 + 2 * c1 + c2 + 2 * c3 + 4 * c4 + 2 * c5 + c6 + 2 * c7 + c8); - } - float4 sample_quad(float2 tc, float2 offset){ //Can be changed to tex2Dlod with mipmap filter float4 c00 = h4tex2Dlod(frame_tex, half4(tc + float2(-1, -1) * offset, 0.0, 0.0)); @@ -222,11 +200,6 @@ shader postfx return 0.25f * (c00 + c10 + c01 + c11); } - float4 blurred_source(float2 tc, float offset){ - float4 centerSample; - return blurred_source2(tc, float2(offset,offset), centerSample); - } - #if MOBILE_DEVICE void sampleSceneColor(float2 uv, out half3 color) { @@ -434,77 +407,38 @@ shader postfx result = apply_vignette(result, tc); } + void apply_dof_effect(float2 tc, inout float3 frame) + { + #if HAS_FAR_DOF + #if COMPLICATED_DOF + half4 cLayerFar = get_dof_far(tc, dof_rt_size.xy); + frame = lerp(frame, cLayerFar.rgb, cLayerFar.a); + #endif + #endif + #if HAS_NEAR_DOF + #if !COMPLICATED_DOF + half4 cLayerNear = tex2D_bicubic(dof_near_layer, dof_near_layer_samplerstate, tc, dof_rt_size.xy); + frame = frame.rgb*cLayerNear.a + cLayerNear.rgb; + #else + half4 cLayerNear = get_dof_near(tc, dof_rt_size.xy); + frame = lerp(frame, cLayerNear.rgb, cLayerNear.a); + #endif + #endif + } + POSTFX_OUTPUT postfx_ps(VsOutput input HW_USE_SCREEN_POS) { float4 pos = GET_SCREEN_POS(input.pos); - half2 distortionOffset; - half3 distortionOffsetMul; - half distortionBlur; - sample_heat_haze_offset_mul_blur(input.tc, distortionOffset, distortionOffsetMul, distortionBlur); - - float2 sceneUV = input.tc + distortionOffset; + float2 sceneUV = input.tc; half3 frame; - #if MOBILE_DEVICE - sampleSceneColor(sceneUV, frame); - #else - BRANCH - if (all(distortionOffsetMul == 1)) - { - ##if (haze_offset_tex != NULL) - BRANCH - if (distortionBlur > distortionBlurThreshold) - frame = blurred_source(sceneUV, distortionBlur).rgb; - else - ##endif - frame = sampleSceneColor(sceneUV); - } - else - { - ##if (haze_offset_tex != NULL) - BRANCH - if (distortionBlur > distortionBlurThreshold) - { - frame.r = blurred_source(input.tc + distortionOffset * distortionOffsetMul.r, distortionBlur).r; - frame.g = blurred_source(input.tc + distortionOffset * distortionOffsetMul.g, distortionBlur).g; - frame.b = blurred_source(input.tc + distortionOffset * distortionOffsetMul.b, distortionBlur).b; - } - else - ##endif - { - frame.r = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.r).r; - frame.g = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.g).g; - frame.b = sampleSceneColor(input.tc + distortionOffset * distortionOffsetMul.b).b; - } - } + #if MOBILE_DEVICE + sampleSceneColor(sceneUV, frame); + #else + frame = sampleSceneColor(sceneUV); + #endif - BRANCH - if (chromatic_aberration_params.z < 1) - { - float2 screenPosR = (input.tc + distortionOffset * distortionOffsetMul.r)*2-1; - float2 screenPosG = (input.tc + distortionOffset * distortionOffsetMul.g)*2-1; - float4 screenPos = float4(screenPosR, screenPosG); - float2 caRGScale = chromatic_aberration_params.xy; - float caStartOffset = chromatic_aberration_params.z; - - float4 uvRG; - uvRG = screenPos - sign(screenPos) * saturate(abs(screenPos) - caStartOffset) * caRGScale.xxyy; - uvRG = uvRG*0.5+0.5; - ##if (haze_offset_tex != NULL) - BRANCH - if (distortionBlur > distortionBlurThreshold) - { - frame.r = blurred_source(uvRG.xy, distortionBlur).r; - frame.g = blurred_source(uvRG.zw, distortionBlur).g; - } - else - ##endif - { - frame.r = sampleSceneColor(uvRG.xy).r; - frame.g = sampleSceneColor(uvRG.zw).g; - } - } - #endif + apply_dof_effect(input.tc, frame); BRANCH if (confusion_params.z > -3.5) @@ -526,22 +460,6 @@ shader postfx apply_postfx_modifiers(sceneUV, frame); - #if HAS_FAR_DOF - #if COMPLICATED_DOF - half4 cLayerFar = get_dof_far(input.tc.xy, dof_rt_size.xy); - frame = lerp(frame, cLayerFar.rgb, cLayerFar.a); - #endif - #endif - #if HAS_NEAR_DOF - #if !COMPLICATED_DOF - half4 cLayerNear = tex2D_bicubic(dof_near_layer, dof_near_layer_samplerstate, input.tc.xy, dof_rt_size.xy); - frame = frame.rgb*cLayerNear.a + cLayerNear.rgb; - #else - half4 cLayerNear = get_dof_near(input.tc.xy, dof_rt_size.xy); - frame = lerp(frame, cLayerNear.rgb, cLayerNear.a); - #endif - #endif - half3 result = common_postfx(frame, input.tc, get_local_exposure(frame, input.tc)); apply_post_bloom_effects(input.tc, result); diff --git a/prog/daNetGame/shaders/postfx_common.dshl b/prog/daNetGame/shaders/postfx_common.dshl index 2c012f6fb..1a5b97b16 100644 --- a/prog/daNetGame/shaders/postfx_common.dshl +++ b/prog/daNetGame/shaders/postfx_common.dshl @@ -55,7 +55,7 @@ macro COMMON_POSTFX() apply_bloom(tc, frame); ##if (in_editor_assume == yes) - frame *= getPrevExposureRatio(); + frame *= getExposureScale(); ##else frame *= exposure; ##endif diff --git a/prog/daNetGame/shaders/prefab_clipmap.dshl b/prog/daNetGame/shaders/prefab_clipmap.dshl index dce381ef1..5d1cc89f4 100644 --- a/prog/daNetGame/shaders/prefab_clipmap.dshl +++ b/prog/daNetGame/shaders/prefab_clipmap.dshl @@ -47,7 +47,6 @@ shader land_mesh_clipmap // aka prefab_clipmap float3 pointToEye : TEXCOORD0; float3 normal : TEXCOORD1; float4 tcWorldPos : TEXCOORD2; - float heightForPuddle : TEXCOORD3; }; } diff --git a/prog/daNetGame/shaders/projective_wounds.dshl b/prog/daNetGame/shaders/projective_wounds.dshl index 976d3e40e..306450e89 100644 --- a/prog/daNetGame/shaders/projective_wounds.dshl +++ b/prog/daNetGame/shaders/projective_wounds.dshl @@ -286,6 +286,11 @@ endmacro macro USE_BLOOD_DECAL(samplerName) hlsl(vs) { + float2 rotate_on_minus_pi (float2 coords) + { + return float2(-coords.x, -coords.y); + } + void vs_blood_decal_function(float3 input_pos, inout float4 bloodDecalTC, inout float textureIndexTime) { bloodDecalTC = NaN; @@ -313,6 +318,10 @@ hlsl(vs) { bloodDecalTC.xyz = pos; bloodDecalTC.w = i + 1; textureIndexTime = start_time; + + //we rotate all texture for 180 degreese, to make floating along attachment + bloodDecalTC.xy = rotate_on_minus_pi(bloodDecalTC.xy); + } } } diff --git a/prog/daNetGame/shaders/rendinst_clipmap.dshl b/prog/daNetGame/shaders/rendinst_clipmap.dshl index 20cf60371..30e0b85a2 100644 --- a/prog/daNetGame/shaders/rendinst_clipmap.dshl +++ b/prog/daNetGame/shaders/rendinst_clipmap.dshl @@ -201,6 +201,11 @@ shader rendinst_clipmap, rendinst_landclass if (shader == rendinst_landclass) { static float4 texcoord_scale_offset = (1.0, 1.0, 0.0, 0.0); + + // Default value is set to -1 + // (As -1 meter is the clear puddle depth in `puddle_make.dshl`) + // (Note: puddle height can vary from -2 meters to 1 meter above ground) + static float landclass_water_level = -1; } channel float3 pos = pos; @@ -281,7 +286,6 @@ shader rendinst_clipmap, rendinst_landclass #endif #if NEED_TC_WORLDPOS VOXEL_CENTROID float4 tcWorldPos : TEXCOORD1; - float heightForPuddle : TEXCOORD4; #endif #if NEED_NORMAL float3 normal : TEXCOORD3; @@ -318,6 +322,7 @@ shader rendinst_clipmap, rendinst_landclass (vs) { texcoord_scale_offset@f4 = (texcoord_scale_offset.x, texcoord_scale_offset.y, texcoord_scale_offset.z, texcoord_scale_offset.w); + landclass_water_level@f1 = landclass_water_level; ri_landscape_tc_to_world@f4 = ( rendinst_landscape_area_left_top_right_bottom.z - rendinst_landscape_area_left_top_right_bottom.x, @@ -604,11 +609,6 @@ shader rendinst_clipmap, rendinst_landclass } ##endif - float heightForPuddle = worldPos.y; - float deformAmount = 0; - float puddle, worldPosYPuddleOffset, puddleHeight; - getPuddleData(worldPos.y, worldPos, heightForPuddle, puddle, worldPosYPuddleOffset, puddleHeight); - output.pos.xyz = worldPos; #if NEED_POINT_TO_EYE @@ -617,7 +617,6 @@ shader rendinst_clipmap, rendinst_landclass #if NEED_TC_WORLDPOS output.tcWorldPos.w = worldPos.y; - output.heightForPuddle = heightForPuddle; #endif #if DRAW_ID_USES_INSTANCE_OFFSET_ID diff --git a/prog/daNetGame/shaders/rendinst_translucent.dshl b/prog/daNetGame/shaders/rendinst_translucent.dshl new file mode 100644 index 000000000..ddc7b94f2 --- /dev/null +++ b/prog/daNetGame/shaders/rendinst_translucent.dshl @@ -0,0 +1,258 @@ +include "psh_derivate.dshl" +include "psh_tangent.dshl" +include "rendinst_inc.dshl" +include "rendinst_opaque_inc.dshl" +include "rendinst_voxelize_albedo_inc.dshl" +include "vertex_density_overlay_inc.dshl" +include "normaldetail.dshl" +include "character_micro_detail.dshl" + +shader rendinst_translucent +{ + VERTEX_DENSITY_INIT_VS() + VERTEX_DENSITY_WRITE() + + if (compatibility_mode == compatibility_mode_on) + { + hlsl { + #define SPECULAR_DISABLED 1 + #define BRDF_DIFFUSE DIFFUSE_LAMBERT + #define USE_SSS_THIN 1 + } + } + + if (rendinst_render_pass == rendinst_render_pass_grassify || + rendinst_render_pass == rendinst_render_pass_to_heightmap || + rendinst_render_pass == rendinst_render_pass_impostor_color || + rendinst_render_pass == rendinst_render_pass_impostor_shadow) + { + dont_render; + } + + texture tex = material.texture.diffuse; + texture normal = material.texture[2]; + + channel float3 pos = pos; + channel color8 norm = norm unsigned_pack; + channel float2 tc[0] = tc[0]; + + // @NOTE: this could be replaced/augmented with a configurable color, but that would require gbuffer fromat changes. + // Or, maybe we could pack some coarse color palette into the 5 bits allocated for the profile? + static int profile = 0; + (ps) { profile@i1 = profile; } + + static float translucency_override = -1.0; + interval translucency_override: off < 0.0, on; + + SETUP_CHARACTER_MICRODETAIL() + + ENABLE_MULTI_DRAW( + rendinst_render_pass == rendinst_render_pass_to_shadow || + rendinst_render_pass == rendinst_render_pass_depth) + + RENDINST_BLOCK() + RI_VOXELIZE_ALBEDO() + RENDINST_INSTANCING() + + NO_DYNSTCODE() + + if (translucency_override == on) + { + (ps) { translucency_override@f1 = translucency_override; } + } + + USE_CHARACTER_MICRODETAIL() + + if (rendinst_render_pass == rendinst_render_pass_to_shadow) + { + hlsl { + struct VsOutput + { + VS_OUT_POSITION(pos) + #if defined(VSOUT_DRAW_ID) + VSOUT_DRAW_ID + #endif + }; + } + hlsl(vs) { + INSTANCING_BUFFERS + struct VsInput + { + float3 pos : POSITION; + }; + + VsOutput simple_vs(VsInput input HW_USE_INSTANCE_ID) + { + VsOutput output; + + float3 localNormal = 1; + float3 localPos = input.pos; + VB_PERFORM_INSTANCING + + output.pos = mulPointTm(worldPos + camera_base_offset, globtm); + + return output; + } + } + compile("ps_null", "rendinst_render_depth_black_ps"); + } + else + { + hlsl { + struct VsOutput + { + PRECISE VS_OUT_POSITION(pos) + ##if rendinst_render_pass != rendinst_render_pass_depth + float4 normal_ao : TEXCOORD0; + ##endif + float4 pointToEye : TEXCOORD1; + ##if (rendinst_render_pass != rendinst_render_pass_depth) + float3 diffuseTexcoord : TEXCOORD2; + ##endif + float3 localPos : TEXCOORD4; + #if defined(VSOUT_DRAW_ID) + VSOUT_DRAW_ID + #endif + }; + } + + hlsl(vs) { + INSTANCING_BUFFERS + + struct VsInput + { + float3 pos : POSITION; + ##if (rendinst_render_pass != rendinst_render_pass_depth) + float4 normal_ao : NORMAL; + float2 diffuseTexcoord : TEXCOORD0; + ##endif + }; + + VsOutput simple_vs(VsInput input HW_USE_INSTANCE_ID) + { + VsOutput output; + + #if SET_UP_MULTIDRAW + INIT_MULTIDRAW(output); + SET_DRAW_CALL_ID(GET_MATERIAL_OFFSET); + #endif + + float3 localNormal = 1; + ##if (rendinst_render_pass != rendinst_render_pass_depth) + localNormal = normalize(BGR_SWIZZLE(input.normal_ao.xyz)*2-1); + ##endif + + float3 localPos = input.pos; + output.localPos = localPos; + + VB_PERFORM_INSTANCING + + float3 pointToEye = world_view_pos-worldPos; + + output.pos = mulPointTm(worldPos + camera_base_offset, globtm); + ##if rendinst_render_pass != rendinst_render_pass_depth + output.normal_ao = float4(worldNormal.xyz, input.normal_ao.a); + ##endif + output.pointToEye = pointToEye.xyzz; + + ##if (rendinst_render_pass != rendinst_render_pass_depth) + output.diffuseTexcoord.xyz = float3(input.diffuseTexcoord, 0.0001); + ##endif + + writeVertexDensityPos(output.pos); + + return output; + } + } + + if (rendinst_render_pass != rendinst_render_pass_depth) + { + USE_PIXEL_TANGENT_SPACE() + WRITE_GBUFFER() + + (ps) { + diffuse_tex@static = tex; + normal_tex@static = normal; + } + + hlsl(ps) { + #if VOXELIZE_ALBEDO_PASS + void simple_ps(VsOutput input INPUT_VFACE HW_USE_SCREEN_POS) + #else + GBUFFER_OUTPUT simple_ps(VsOutput input INPUT_VFACE HW_USE_SCREEN_POS) + #endif + { + #if SET_UP_MULTIDRAW + SET_DRAW_CALL_ID(GET_MATERIAL_OFFSET(input)); + #endif + #ifdef VOXELIZE_DISCARD_PRIM + VOXELIZE_DISCARD_PRIM + #endif + #ifndef IS_DYNAMIC + #define IS_DYNAMIC 0 + #endif + + float4 screenpos = GET_SCREEN_POS(input.pos); + + half4 diffuseColor = tex2DBindless(get_diffuse_tex(), input.diffuseTexcoord.xy); + input.normal_ao.xyz = MUL_VFACE(input.normal_ao.xyz); + + UnpackedGbuffer gbuffer; + init_gbuffer(gbuffer); + + half4 packedNormalMap = tex2DBindless(get_normal_tex(), input.diffuseTexcoord.xy); + + half smoothness = packedNormalMap.r; + half3 normalMap = unpack_ag_normal(packedNormalMap); + half3 worldNormal = perturb_normal(normalMap, normalize(input.normal_ao.xyz), input.pointToEye.xyz, input.diffuseTexcoord.xy); + + ##if translucency_override == on + half translucency = get_translucency_override(); + ##else + half translucency = packedNormalMap.b; + ##endif + + if (character_micro_detail_layer >= 0) + { + half reflectance = 0.0; // modified with detail, but the value is not used in apply_character_micro_detail + apply_character_micro_detail( + sample_character_micro_detail(input.diffuseTexcoord.xy * get_character_micro_detail_scale().xy, character_micro_detail_layer), + diffuseColor.rgb, + normalMap, + reflectance, + smoothness); + } + + init_ao(gbuffer, input.normal_ao.a); + init_translucency(gbuffer, translucency); + + // @NOTE: if there are more than two profiles, this should be unhardcoded. + // Currently it's: (-inf, 0] : neutral, [1, inf) : foliage + init_material(gbuffer, get_profile() < 1 ? SHADING_SUBSURFACE : SHADING_FOLIAGE); + init_sss_profile(gbuffer, get_profile() < 1 ? SSS_PROFILE_NEUTRAL_TRANSLUCENT : 0); + + init_smoothness(gbuffer, smoothness); + init_normal(gbuffer, worldNormal); + init_albedo(gbuffer, diffuseColor.rgb); + + #if VOXELIZE_ALBEDO_PASS + float3 worldPos = world_view_pos - input.pointToEye.xyz; + WRITE_SCENE25D_VOXEL_DATA(worldPos, gbuffer.albedo.rgb, 0, 0); + #else + init_dynamic(gbuffer, IS_DYNAMIC); + init_order(gbuffer, GBUFFER_ORDER_DYNAMIC); + return encode_gbuffer(gbuffer, input.pointToEye.xyz, GET_SCREEN_POS(input.pos)); + #endif + } + } + + compile("target_ps", "simple_ps"); + } + else + { + compile("ps_null", "rendinst_render_depth_black_ps"); + } + } + + COMPILE_RI_VS_TARGET("simple_vs") +} \ No newline at end of file diff --git a/prog/daNetGame/shaders/resolve_thin_g_buffer.dshl b/prog/daNetGame/shaders/resolve_thin_g_buffer.dshl index 681e33790..4200acb48 100644 --- a/prog/daNetGame/shaders/resolve_thin_g_buffer.dshl +++ b/prog/daNetGame/shaders/resolve_thin_g_buffer.dshl @@ -211,8 +211,7 @@ shader thin_g_resolve, deferred_shadow_bare_minimum half3 fog_mul, fog_add; get_volfog_with_scattering(tc.xy, scatterTc, view, dist, w, fog_mul, fog_add); - //apply exposure for additive part, otherwise it will lit up image - result = mad(result, fog_mul, fog_add * get_exposure_mul()); + result = mad(result, fog_mul, fog_add); return result; } @@ -342,7 +341,7 @@ shader thin_g_resolve, deferred_shadow_bare_minimum half3 specularColor = gbuffer.specularColor * gbuffer.extracted_albedo_ao; half3 dynamicLight = get_dynamic_lighting(gbuffer, worldPos.xyz, -viewVect, w, screenpos.xy, NoV, specularColor, input.texcoord.xy, gbuffer.ao); - result += dynamicLight * get_exposure_mul(); + result += dynamicLight; ##endif #if HAS_SCATTERING diff --git a/prog/daNetGame/shaders/rt/rt_lighting.dshl b/prog/daNetGame/shaders/rt/rt_lighting.dshl index 40c62337b..e1bbb7cad 100644 --- a/prog/daNetGame/shaders/rt/rt_lighting.dshl +++ b/prog/daNetGame/shaders/rt/rt_lighting.dshl @@ -225,6 +225,8 @@ macro USE_RT_LIGHTING(stage, use_cockpit_lights) else return 0; + albedo *= hitInfo.color; + half3 normalh = (half3)hitInfo.normal; half linearRoughness = linearSmoothnessToLinearRoughness(smoothness); diff --git a/prog/daNetGame/shaders/shader_global.dshl b/prog/daNetGame/shaders/shader_global.dshl index 460f25838..fac79a0e5 100644 --- a/prog/daNetGame/shaders/shader_global.dshl +++ b/prog/daNetGame/shaders/shader_global.dshl @@ -532,8 +532,8 @@ macro USE_HDR(code) half get_exposure_mul() {return getExposureScale();} half get_exposure_inv() {return getInvExposureScale();} - half3 pack_hdr(half3 a) {return a * get_exposure_mul();} - half3 unpack_hdr(half3 a) {return a * get_exposure_inv();} + half3 pack_hdr(half3 a) {return a;} + half3 unpack_hdr(half3 a) {return a;} #endif } endmacro @@ -546,7 +546,7 @@ macro USE_COMPAT_HDR_WRITE_BASE(code, exposure_name) #define HAS_HDR_DEFINED 1 half get_exposure_mul() {return exposure_name;} - half3 pack_hdr(half3 a) {return a * get_exposure_mul();} + half3 pack_hdr(half3 a) {return a;} #endif } endmacro diff --git a/prog/daNetGame/shaders/skinning_inc2.dshl b/prog/daNetGame/shaders/skinning_inc2.dshl index 3c5800f3f..2cc8de414 100644 --- a/prog/daNetGame/shaders/skinning_inc2.dshl +++ b/prog/daNetGame/shaders/skinning_inc2.dshl @@ -61,13 +61,13 @@ macro USE_BONE_VERTEX_UNPACKING() } endmacro -macro USE_BONE_MATRIX_BLENDING_GEN(blend_bone_mtx_name_t, fetch_bone_mtx_name_t, bone_mtx_stride, bone_mtx_row_getter) +macro USE_BONE_MATRIX_BLENDING_GEN(blend_bone_mtx_name_t, fetch_bone_mtx_name_t, bone_mtx_stride, bone_mtx_row_getter, additional_offset) hlsl(vs) { bone_t blend_bone_mtx_name_t(uint offset, uint4 bi, float4 bw) { bone_t skinnedTm; - bi = bi * bone_mtx_stride + offset; + bi = bi * bone_mtx_stride + offset + additional_offset; skinnedTm.r0 = bone_mtx_row_getter(bi.x+0) * bw.x + bone_mtx_row_getter(bi.y+0) * bw.y + bone_mtx_row_getter(bi.z+0) * bw.z + bone_mtx_row_getter(bi.w+0) * bw.w; skinnedTm.r1 = bone_mtx_row_getter(bi.x+1) * bw.x + bone_mtx_row_getter(bi.y+1) * bw.y + bone_mtx_row_getter(bi.z+1) * bw.z + bone_mtx_row_getter(bi.w+1) * bw.w; skinnedTm.r2 = bone_mtx_row_getter(bi.x+2) * bw.x + bone_mtx_row_getter(bi.y+2) * bw.y + bone_mtx_row_getter(bi.z+2) * bw.z + bone_mtx_row_getter(bi.w+2) * bw.w; @@ -76,7 +76,7 @@ macro USE_BONE_MATRIX_BLENDING_GEN(blend_bone_mtx_name_t, fetch_bone_mtx_name_t, bone_t fetch_bone_mtx_name_t(uint offset, uint bi) { bone_t skinnedTm; - bi = bi * bone_mtx_stride + offset; + bi = bi * bone_mtx_stride + offset + additional_offset; skinnedTm.r0 = bone_mtx_row_getter(bi.x+0); skinnedTm.r1 = bone_mtx_row_getter(bi.x+1); skinnedTm.r2 = bone_mtx_row_getter(bi.x+2); @@ -183,6 +183,8 @@ if (in_editor_assume == yes) hlsl(vs) { +#include + ##if in_editor_assume == yes #define SKINNING_MATRIX_STRIDE 6 #define SKINNING_BONE_ROW_GETTER(bi) get_bone_row(bi) @@ -196,7 +198,7 @@ hlsl(vs) INIT_PER_INSTANCE_DATA(vs) USE_BONE_VERTEX_UNPACKING() -USE_BONE_MATRIX_BLENDING_GEN(blend_skinning_matrix_base, fetch_skinning_matrix_base, SKINNING_MATRIX_STRIDE, SKINNING_BONE_ROW_GETTER) +USE_BONE_MATRIX_BLENDING_GEN(blend_skinning_matrix_base, fetch_skinning_matrix_base, SKINNING_MATRIX_STRIDE, SKINNING_BONE_ROW_GETTER, ADDITIONAL_BONE_MTX_OFFSET) hlsl(vs) { @@ -204,10 +206,42 @@ hlsl(vs) float3 mul_bone3(float3 p3, bone_t m) { return float3(dot(m.r0.xyz, p3), dot(m.r1.xyz, p3), dot(m.r2.xyz, p3)); } float3 mul_bone3m(float3 p3, float3x3 m3) { return mul(m3, p3); } + + void get_node_collapser_bits(out uint4 node_collapser_bits[2]) + { + // bone rows start from ADDITIONAL_BONE_MTX_OFFSET, these rows are used for node collapser + node_collapser_bits[0] = asuint(SKINNING_BONE_ROW_GETTER(INST_OFFSET_GETTER + 0)); + node_collapser_bits[1] = asuint(SKINNING_BONE_ROW_GETTER(INST_OFFSET_GETTER + 1)); + } + + bool checkBoneToCollapse(uint bi, float bw, uint4 node_collapser_bits[2]) + { + uint4 bits = (bi < 128) ? node_collapser_bits[0] : node_collapser_bits[1]; + return bw == 0 || (bits[bi >> 5] & (1u << (bi & 31))) != 0; + } + + bool checkAllBonesToCollapse(uint4 bi, float4 bw) + { + uint4 nodeCollapserBits[2]; + get_node_collapser_bits(nodeCollapserBits); + return checkBoneToCollapse(bi.x, bw.x, nodeCollapserBits) && + checkBoneToCollapse(bi.y, bw.y, nodeCollapserBits) && + checkBoneToCollapse(bi.z, bw.z, nodeCollapserBits) && + checkBoneToCollapse(bi.w, bw.w, nodeCollapserBits); + } + bool checkSingleBoneToCollapse(uint bi) + { + uint4 nodeCollapserBits[2]; + get_node_collapser_bits(nodeCollapserBits); + return checkBoneToCollapse(bi, 1, nodeCollapserBits); + } + bone_t blend_skinning_matrix(uint4 bi, float4 bw, uint in_matrix_offset) { ##if in_editor_assume == no in_matrix_offset += INST_OFFSET_GETTER; + if (checkAllBonesToCollapse(bi, bw)) + return (bone_t)0; ##endif return blend_skinning_matrix_base(in_matrix_offset, bi, bw); } @@ -218,6 +252,8 @@ hlsl(vs) uint offset = 0; ##else uint offset = INST_OFFSET_GETTER; + if (checkSingleBoneToCollapse(bi)) + return (bone_t)0; ##endif return fetch_skinning_matrix_base(offset, bi); } @@ -397,7 +433,7 @@ macro USE_BINDPOSE_VS() #define BINDPOSE_BONE_ROW_GETTER(bi) bind_pose_tr_buffer[bi] } USE_BONE_VERTEX_UNPACKING() - USE_BONE_MATRIX_BLENDING_GEN(blend_bindpose_matrix_base, fetch_bindpose_matrix_base, 3, BINDPOSE_BONE_ROW_GETTER) + USE_BONE_MATRIX_BLENDING_GEN(blend_bindpose_matrix_base, fetch_bindpose_matrix_base, 3, BINDPOSE_BONE_ROW_GETTER, 0) hlsl(vs) { bone_t blend_bindpose_matrix(uint4 bi, float4 bw) @@ -415,7 +451,7 @@ macro USE_BINDPOSE_VS() bone_t bindpose_matrix(uint bi) { uint offset = get_immediate_dword_1(); - return fetch_skinning_matrix_base(offset, bi); + return fetch_bindpose_matrix_base(offset, bi); } bone_t calc_bone_wtm(bone_t skinning_tm, bone_t bindpose_tm) diff --git a/prog/daNetGame/shaders/ssr_common.dshl b/prog/daNetGame/shaders/ssr_common.dshl index c5352f8ad..aa6d13897 100644 --- a/prog/daNetGame/shaders/ssr_common.dshl +++ b/prog/daNetGame/shaders/ssr_common.dshl @@ -33,11 +33,18 @@ macro SETUP_SSR(code) } endmacro -macro SSR_CALCULATE(code) +macro SSR_USE_EXPOSURE(code) INIT_HDR(code) USE_HDR(code) hlsl(code){ #define PREV_FRAME_UNPACK(x) unpack_hdr(x) + #define PREV_FRAME_PACK(x) pack_hdr(x) + } +endmacro + +macro SSR_CALCULATE(code) + SSR_USE_EXPOSURE(code) + hlsl(code){ #include "ssr_common.hlsl" } endmacro \ No newline at end of file diff --git a/prog/daNetGame/shaders/tex2DCatmullRom.hlsl b/prog/daNetGame/shaders/tex2DCatmullRom.hlsl index 05230a4b1..1031c2885 100644 --- a/prog/daNetGame/shaders/tex2DCatmullRom.hlsl +++ b/prog/daNetGame/shaders/tex2DCatmullRom.hlsl @@ -61,4 +61,17 @@ void get_catmullrom_samples(float2 uv, float2 tex_size, float2 inv_tex_size, out fetch_uvs[8] = float2(texPos3.x, texPos3.y); } +float4 sample_texture_catmull_rom(in Texture2D tex, in SamplerState linear_sampler, in float2 uv, in float2 tex_size, in float2 inv_tex_size) +{ + float2 fetchUVs[9]; + float fetchWeights[9]; + get_catmullrom_samples(uv, tex_size, inv_tex_size, fetchUVs, fetchWeights); + float4 result = 0; + UNROLL + for (uint i = 0; i < 9; i++) + result += tex.SampleLevel(linear_sampler, fetchUVs[i], 0.0) * fetchWeights[i]; + return result; +} + + #endif \ No newline at end of file diff --git a/prog/daNetGame/shaders/use_tiled_lights.dshl b/prog/daNetGame/shaders/use_tiled_lights.dshl index 50726f260..5379170c8 100644 --- a/prog/daNetGame/shaders/use_tiled_lights.dshl +++ b/prog/daNetGame/shaders/use_tiled_lights.dshl @@ -65,7 +65,7 @@ if (dynamic_lights_count != lights_off) #define USE_SUBGROUP_BROADCAST 0 // TODO: move this to shader compiler predefines - #if (defined(_HARDWARE_XBOX) || defined(_HARDWARE_PS4) || defined(_HARDWARE_PS5)) && !defined(WaveGetLaneCount) + #if !defined(WaveGetLaneCount) uint WaveGetLaneCount() { return 64; } #endif diff --git a/prog/daNetGame/shaders/water_3d_ssr.dshl b/prog/daNetGame/shaders/water_3d_ssr.dshl index 3dfcc9072..c24cc1b23 100644 --- a/prog/daNetGame/shaders/water_3d_ssr.dshl +++ b/prog/daNetGame/shaders/water_3d_ssr.dshl @@ -394,10 +394,9 @@ shader water_ssr_nv2, water_ssr_nv2_heightmap float2 alpha__strength : SV_Target1; }; - void applyFogToReflection(float2 screen_tc, float dist, inout float3 color) + void applyFogToReflection(float3 view, float dist, inout float3 color) { half3 add,loss; - float3 view = normalize(getViewVecOptimized(screen_tc)); get_bruneton_fog(view, dist, loss, add); add = pack_hdr(add); color = color*loss + add; @@ -486,8 +485,14 @@ shader water_ssr_nv2, water_ssr_nv2_heightmap if (water_quality == water_quality_high && !hitSky && newTarget.a == 0) { float rayHitDist = 0; - get_alternate_reflections(newTarget, rayHitDist, screenpos.xy, reflect(-pointToEye, worldNormal), cameraToPoint, worldNormal, false, false); - applyFogToReflection(refractionTC, rayHitDist, newTarget.rgb); + float3 R = reflect(-pointToEye, worldNormal); + get_alternate_reflections(newTarget, rayHitDist, screenpos.xy, R, cameraToPoint, worldNormal, false, false); + if (newTarget.a > 0) + { + float3 cameraToReflection = (rayHitDist*R + cameraToPoint); + float cameraToReflectionLen = length(cameraToReflection); + applyFogToReflection(cameraToReflection*rcp(max(1e-6,cameraToReflectionLen)), cameraToReflectionLen, newTarget.rgb); + } } bool discardHistory = offscreen || (isGbufferDynamic(oldUv) && (prevScreen.z < sample_close_depth_tex(oldUv, 0))) || force_ignore_history > 0; diff --git a/prog/daNetGame/ui/overlayES.cpp.inl b/prog/daNetGame/ui/overlayES.cpp.inl index 043cce098..ed9fb4f7f 100644 --- a/prog/daNetGame/ui/overlayES.cpp.inl +++ b/prog/daNetGame/ui/overlayES.cpp.inl @@ -60,7 +60,7 @@ #if _TARGET_C1 | _TARGET_C2 -#elif _TARGET_XBOX +#elif _TARGET_GDK #include #endif #include @@ -201,7 +201,7 @@ static void bind_overlay_ui_script_apis(SqModules *moduleMgr, HSQUIRRELVM vm) watchdog::bind_sq(moduleMgr); -#if _TARGET_XBOX +#if _TARGET_GDK bindquirrel::xbox::bind_sq(moduleMgr); #elif _TARGET_C1 | _TARGET_C2 @@ -268,7 +268,7 @@ void init_network_services() { fps_profile::initPerfProfile(); -#if _TARGET_XBOX +#if _TARGET_GDK bindquirrel::xbox::init(); #endif g_entity_mgr->broadcastEventImmediate(EventScriptUiInitNetworkServices()); @@ -379,7 +379,7 @@ void shutdown_network_services() if (app_profile::get().disableRemoteNetServices) return; g_entity_mgr->broadcastEventImmediate(EventScriptUiTermNetworkServices()); -#if _TARGET_XBOX +#if _TARGET_GDK bindquirrel::xbox::shutdown(); #endif } diff --git a/prog/daNetGame/ui/uiVideoMode.cpp b/prog/daNetGame/ui/uiVideoMode.cpp index 125b94cf0..d1b85c747 100644 --- a/prog/daNetGame/ui/uiVideoMode.cpp +++ b/prog/daNetGame/ui/uiVideoMode.cpp @@ -419,6 +419,13 @@ static SQInteger is_hdr_available(HSQUIRRELVM vm) sq_getstring(vm, SQInteger(2), &displayName); bool available = d3d::driver_command(Drv3dCommand::IS_HDR_AVAILABLE, (void *)displayName); + + const DataBlock &blk_video = *dgs_get_settings()->getBlockByNameEx("video"); + const DataBlock *hdrSupport = blk_video.getBlockByNameEx("hdrSupport"); + bool gameSupportsHDROnDriver = hdrSupport->getBool(d3d::get_driver_name(), true); + + available = available && gameSupportsHDROnDriver; + sq_pushbool(vm, available); return 1; } @@ -468,7 +475,7 @@ static SQInteger is_only_low_gi_supported_sq(HSQUIRRELVM vm) static SQInteger is_hfr_supported(HSQUIRRELVM vm) { - sq_pushbool(vm, d3d::driver_command(Drv3dCommand::GET_PS5_HFR_SUPPORTED)); + sq_pushbool(vm, d3d::driver_command(Drv3dCommand::GET_CONSOLE_HFR_SUPPORTED)); return 1; } diff --git a/prog/daNetGameLibs/adaptation/render/adaptation_manager.h b/prog/daNetGameLibs/adaptation/render/adaptation_manager.h index c8774b994..63e1b6990 100644 --- a/prog/daNetGameLibs/adaptation/render/adaptation_manager.h +++ b/prog/daNetGameLibs/adaptation/render/adaptation_manager.h @@ -42,7 +42,7 @@ struct AdaptationManager void accumulateHistogram(); void adaptExposure(); void updateReadbackExposure(); - void clearNormalizationFactor(); + void clearExposureTex(); void sheduleClear() { isClearNeeded = true; } D3DRESID getExposureBufferId() { return g_Exposure.getBufId(); } void uploadInitialExposure(); @@ -57,7 +57,7 @@ struct AdaptationManager }; private: - UniqueTex exposureNormalizationFactor; + UniqueTex exposureTex; UniqueBuf g_Exposure, g_NoExposureBuffer; eastl::unique_ptr generateHistogramCenterWeightedFromSourceCS; eastl::unique_ptr adaptExposureCS, accumulate_hist_cs; diff --git a/prog/daNetGameLibs/adaptation/render/adaptation_managerES.cpp.inl b/prog/daNetGameLibs/adaptation/render/adaptation_managerES.cpp.inl index 84af250b0..e53829f02 100644 --- a/prog/daNetGameLibs/adaptation/render/adaptation_managerES.cpp.inl +++ b/prog/daNetGameLibs/adaptation/render/adaptation_managerES.cpp.inl @@ -71,13 +71,13 @@ AdaptationManager::AdaptationManager() generateHistogramCenterWeightedFromSourceCS.reset(new_compute_shader("GenerateHistogramCenterWeightedFromSourceCS")); accumulate_hist_cs.reset(new_compute_shader("accumulate_hist_cs")); - static constexpr int exposureNormalizationFlags = TEXCF_RTARGET | TEXCF_UNORDERED | TEXFMT_R32F; - exposureNormalizationFactor = dag::create_tex(NULL, 1, 1, exposureNormalizationFlags, 1, "exposure_normalization_factor"); + static constexpr int exposureTextureFlags = TEXCF_RTARGET | TEXCF_UNORDERED | TEXFMT_R32F; + exposureTex = dag::create_tex(NULL, 1, 1, exposureTextureFlags, 1, "exposure_tex"); registerExposureNodeHandle = dabfg::register_node("register_adapatation_resoureces", DABFG_PP_NODE_SRC, - [normFactorView = ManagedTexView(exposureNormalizationFactor)](dabfg::Registry registry) { + [exposure = ManagedTexView(exposureTex)](dabfg::Registry registry) { registry.multiplex(dabfg::multiplexing::Mode::None); - registry.registerTexture2d("exposure_normalization_factor", [normFactorView](auto) -> ManagedTexView { return normFactorView; }); + registry.registerTexture2d("exposure_tex", [exposure](auto) -> ManagedTexView { return exposure; }); registry.executionHas(dabfg::SideEffects::External); }); } @@ -93,7 +93,7 @@ void AdaptationManager::uploadInitialExposure() } } -void AdaptationManager::clearNormalizationFactor() +void AdaptationManager::clearExposureTex() { // Run only once after sheduleClear if (!isClearNeeded) @@ -101,7 +101,7 @@ void AdaptationManager::clearNormalizationFactor() isClearNeeded = false; float ones[4] = {1, 1, 1, 1}; - d3d::clear_rwtexf(exposureNormalizationFactor.getTex2D(), ones, 0, 0); + d3d::clear_rwtexf(exposureTex.getTex2D(), ones, 0, 0); } bool AdaptationManager::getExposure(float &exp) const @@ -192,11 +192,11 @@ void AdaptationManager::adaptExposure() ShaderGlobal::set_color4(EyeAdaptationParams_2VarId, 1, 0, float(DispatchInfo::pixelsCount), settings.fadeMul); ShaderGlobal::set_color4(EyeAdaptationParams_3VarId, settings.brightnessPerceptionLinear, settings.brightnessPerceptionPower, 0., adaptationInstant.get() ? 1.f : 0.f); - d3d::set_rwtex(STAGE_CS, 1, exposureNormalizationFactor.getTex2D(), 0, 0); + d3d::set_rwtex(STAGE_CS, 1, exposureTex.getTex2D(), 0, 0); ShaderGlobal::set_buffer(ExposureOutVarId, g_Exposure); adaptExposureCS->dispatch(1, 1, 1); d3d::set_rwtex(STAGE_CS, 1, nullptr, 0, 0); - d3d::resource_barrier({exposureNormalizationFactor.getTex2D(), RB_RO_SRV | RB_STAGE_PIXEL, 0, 0}); + d3d::resource_barrier({exposureTex.getTex2D(), RB_RO_SRV | RB_STAGE_PIXEL, 0, 0}); accumulatedTime = 0; } @@ -353,13 +353,10 @@ static void adaptation_settings_tracking_es(const ecs::Event &, adaptation__set_exposure_node = dabfg::register_node("set_exposure", DABFG_PP_NODE_SRC, [&adaptation__manager, render_settings__gpuResidentAdaptation, render_settings__forwardRendering](dabfg::Registry registry) { registry.orderMeBefore(render_settings__forwardRendering ? "frame_data_setup_mobile" : "setup_world_rendering_node"); - registry.modify("exposure_normalization_factor") - .buffer() - .atStage(dabfg::Stage::PS_OR_CS) - .useAs(dabfg::Usage::SHADER_RESOURCE); + registry.modify("exposure_tex").buffer().atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE); return [&adaptation__manager, render_settings__gpuResidentAdaptation]() { - adaptation__manager.clearNormalizationFactor(); + adaptation__manager.clearExposureTex(); if (!render_settings__gpuResidentAdaptation) { diff --git a/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.gen.es.cpp b/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.gen.es.cpp index c4ba363ef..1c0e11a37 100644 --- a/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.gen.es.cpp +++ b/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.gen.es.cpp @@ -47,7 +47,7 @@ static ecs::EntitySystemDesc reset_blood_es_es_desc ); static constexpr ecs::ComponentDesc update_blood_shader_params_es_comps[] = { -//start of 16 ro components at [0] +//start of 22 ro components at [0] {ECS_HASH("blood_begin_color"), ecs::ComponentTypeInfo()}, {ECS_HASH("blood_begin_color_value"), ecs::ComponentTypeInfo()}, {ECS_HASH("blood_end_color"), ecs::ComponentTypeInfo()}, @@ -63,7 +63,13 @@ static constexpr ecs::ComponentDesc update_blood_shader_params_es_comps[] = {ECS_HASH("blood_puddle_smoothness"), ecs::ComponentTypeInfo()}, {ECS_HASH("blood_puddle_smoothness_value"), ecs::ComponentTypeInfo()}, {ECS_HASH("blood_puddle_smoothness_edge"), ecs::ComponentTypeInfo()}, - {ECS_HASH("blood_puddle_smoothness_edge_value"), ecs::ComponentTypeInfo()} + {ECS_HASH("blood_puddle_smoothness_edge_value"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_reflectance"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_reflectance_value"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_smoothness_edge"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_smoothness_edge_value"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_albedo_darkening"), ecs::ComponentTypeInfo()}, + {ECS_HASH("blood_puddle_landscape_albedo_darkening_value"), ecs::ComponentTypeInfo()} }; static void update_blood_shader_params_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) { @@ -85,6 +91,12 @@ static void update_blood_shader_params_es_all_events(const ecs::Event &__restric , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_smoothness_value", float) , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_smoothness_edge", ShaderVar) , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_smoothness_edge_value", float) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_reflectance", ShaderVar) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_reflectance_value", float) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_smoothness_edge", ShaderVar) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_smoothness_edge_value", float) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_albedo_darkening", ShaderVar) + , ECS_RO_COMP(update_blood_shader_params_es_comps, "blood_puddle_landscape_albedo_darkening_value", float) ); while (++comp != compE); } @@ -94,7 +106,7 @@ static ecs::EntitySystemDesc update_blood_shader_params_es_es_desc "prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.inl", ecs::EntitySystemOps(nullptr, update_blood_shader_params_es_all_events), empty_span(), - make_span(update_blood_shader_params_es_comps+0, 16)/*ro*/, + make_span(update_blood_shader_params_es_comps+0, 22)/*ro*/, empty_span(), empty_span(), ecs::EventSetBuilder<>::build(), diff --git a/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.inl b/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.inl index 78a106c27..f56520dee 100644 --- a/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.inl +++ b/prog/daNetGameLibs/blood_puddles/private/render/bloodPuddlesES.cpp.inl @@ -746,7 +746,13 @@ static void update_blood_shader_params_es(const ecs::Event &, const ShaderVar &blood_puddle_smoothness, const float blood_puddle_smoothness_value, const ShaderVar &blood_puddle_smoothness_edge, - const float blood_puddle_smoothness_edge_value) + const float blood_puddle_smoothness_edge_value, + const ShaderVar &blood_puddle_landscape_reflectance, + const float blood_puddle_landscape_reflectance_value, + const ShaderVar &blood_puddle_landscape_smoothness_edge, + const float blood_puddle_landscape_smoothness_edge_value, + const ShaderVar &blood_puddle_landscape_albedo_darkening, + const float blood_puddle_landscape_albedo_darkening_value) { ShaderGlobal::set_color4(blood_begin_color, blood_begin_color_value); ShaderGlobal::set_color4(blood_end_color, blood_end_color_value); @@ -756,6 +762,9 @@ static void update_blood_shader_params_es(const ecs::Event &, ShaderGlobal::set_real(blood_puddle_reflectance, blood_puddle_reflectance_value); ShaderGlobal::set_real(blood_puddle_smoothness, blood_puddle_smoothness_value); ShaderGlobal::set_real(blood_puddle_smoothness_edge, blood_puddle_smoothness_edge_value); + ShaderGlobal::set_real(blood_puddle_landscape_reflectance, blood_puddle_landscape_reflectance_value); + ShaderGlobal::set_real(blood_puddle_landscape_smoothness_edge, blood_puddle_landscape_smoothness_edge_value); + ShaderGlobal::set_real(blood_puddle_landscape_albedo_darkening, blood_puddle_landscape_albedo_darkening_value); } static bool blood_puddle_console_handler(const char *argv[], int argc) diff --git a/prog/daNetGameLibs/blood_puddles/private/shaders/blood_puddles.dshl b/prog/daNetGameLibs/blood_puddles/private/shaders/blood_puddles.dshl index db5f2edc1..9fa4a312a 100644 --- a/prog/daNetGameLibs/blood_puddles/private/shaders/blood_puddles.dshl +++ b/prog/daNetGameLibs/blood_puddles/private/shaders/blood_puddles.dshl @@ -10,6 +10,9 @@ float blood_puddle_depth = 0.03; float blood_puddle_reflectance = 0.3 always_referenced; float blood_puddle_smoothness = 1.0 always_referenced; float blood_puddle_smoothness_edge = 0.9 always_referenced; +float blood_puddle_landscape_reflectance = 0.21 always_referenced; +float blood_puddle_landscape_smoothness_edge = 0.4 always_referenced; +float blood_puddle_landscape_albedo_darkening = 0.5 always_referenced; float4 blood_puddle_high_intensity_color = (0.157, 0.012, 0.000, 1.000); float4 blood_puddle_low_intensity_color = (0.086, 0.024, 0.020, 0.960); float4 blood_decals_atlas_size = (1, 1, 0, 0); @@ -35,7 +38,7 @@ macro BLOOD_PUDDLES_VS() float4 vecToEdge_starttime : TEXCOORD0; nointerpolation float4 patchCenter__inv_size : TEXCOORD1; nointerpolation float4 tang_shrink : TEXCOORD2; - nointerpolation uint3 decal_type__frame__rndIndex : TEXCOORD3; + nointerpolation uint3 decal_type_and_landscape__frame__rndIndex : TEXCOORD3; nointerpolation float strength : TEXCOORD4; }; } @@ -95,6 +98,7 @@ macro BLOOD_PUDDLES_VS() calc_world_values(decal, vertex_id, incidentAngleRatio, //input worldRight, worldNormal, worldPos, worldDecalPos); //output + uint packedTypeAndLandscape = type << 1 | (isLandscape ? 1 : 0); output.tang_shrink.xyz = worldRight; output.tang_shrink.w = 1.0 / incidentAngleRatio; output.pos = mulPointTm(worldPos, globtm); @@ -104,7 +108,7 @@ macro BLOOD_PUDDLES_VS() output.vecToEdge_starttime.w = noDrying ? -linearTime : linearTime; output.patchCenter__inv_size.xyz = worldDecalPos; output.patchCenter__inv_size.w = 1.0 / size; - output.decal_type__frame__rndIndex = uint3(type, frameNo, (puddle_id % 4) + 2); + output.decal_type_and_landscape__frame__rndIndex = uint3(packedTypeAndLandscape, frameNo, (puddle_id % 4) + 2); output.strength = strength; return output; } @@ -180,13 +184,16 @@ macro BLOOD_PUDDLES_COMMON_PS() void unpack_blood(VsOutput input, float4 screen, out float3 normal, out float drying_time, out float intensity, out float alpha, - out float flow_value, out float edge_closeness, out uint decal_type) + out float flow_value, out float edge_closeness, out uint decal_type__is_landscape) { uint2 atlasSize = atlas_size; - uint decalType = input.decal_type__frame__rndIndex.x; - uint frameNo = input.decal_type__frame__rndIndex.y; - uint rndIndex = input.decal_type__frame__rndIndex.z; + decal_type__is_landscape = input.decal_type_and_landscape__frame__rndIndex.x; + uint decalType = decal_type__is_landscape >> 1; + bool isLandscape = (decal_type__is_landscape & 0x1) == 1; + bool isPuddle = decalType == 0; + uint frameNo = input.decal_type_and_landscape__frame__rndIndex.y; + uint rndIndex = input.decal_type_and_landscape__frame__rndIndex.z; float3 worldNormal = normalize(input.normal_fadetime.xyz); float3 flow = normalize(normal * float3(1, 0.01, 1)); float3 vecToEdge = normalize(input.vecToEdge_starttime.xyz); @@ -227,17 +234,21 @@ macro BLOOD_PUDDLES_COMMON_PS() alpha = input.normal_fadetime.w * lerp(1, zeroStrengthAlpha, pow2(1-strength)); clip_alpha(alpha); - half3 normalMap = unpack_ag_normal(bloodParams); - normal = perturb_normal_precise(normalMap, worldNormal, pointToEye, decalTC.xy); + BRANCH + if (isLandscape && isPuddle) + normal = worldNormal; + else + { + half3 normalMap = unpack_ag_normal(bloodParams); + normal = perturb_normal_precise(normalMap, worldNormal, pointToEye, decalTC.xy); + } intensity = bloodParams.b; drying_time = saturate((max(linearTime, 0.0) + perGroupParams[decalType].dryingDelay) * perGroupParams[decalType].invDryingTime); - float edgeWidthScale = float(perGroupParams[input.decal_type__frame__rndIndex.x].bloodNormalDominanceTerm_edgeWidthScale >> 8)/255.0; + float edgeWidthScale = float(perGroupParams[decalType].bloodNormalDominanceTerm_edgeWidthScale >> 8)/255.0; float edgeClosenessScale = lerp(16.0, 1.0, edgeWidthScale); edge_closeness = 1.0 - saturate((flow_value - timeThreshold - cuttingOffset) * edgeClosenessScale); - - decal_type = decalType; } } endmacro @@ -279,13 +290,13 @@ shader blood_puddles_accumulation float3 normal; float intensity, edgeCloseness, alpha, stub; - uint decalType; - unpack_blood(input, screen, normal, stub, intensity, alpha, stub, edgeCloseness, decalType); + uint decalType__landscape; + unpack_blood(input, screen, normal, stub, intensity, alpha, stub, edgeCloseness, decalType__landscape); - float packedDecalType = ((float)decalType+0.1)/255.0f; + float packedDecalTypeAndLandscape = ((float)decalType__landscape+0.1)/255.0f; BloodAccumOutput o; - o.intensity_edgeCloseness_decalType_invAlpha = float4(intensity, edgeCloseness, packedDecalType, 1.0-alpha); + o.intensity_edgeCloseness_decalType_invAlpha = float4(intensity, edgeCloseness, packedDecalTypeAndLandscape, 1.0-alpha); o.normal = pack_normal_so(normal); return o; @@ -347,6 +358,10 @@ shader blood_puddles_resolve blood_puddle_reflectance@f1 = (blood_puddle_reflectance); blood_puddle_smoothness@f1 = (blood_puddle_smoothness); blood_puddle_smoothness_edge@f1 = (blood_puddle_smoothness_edge) + + blood_puddle_landscape_reflectance@f1 = (blood_puddle_landscape_reflectance); + blood_puddle_landscape_smoothness_edge@f1 = (blood_puddle_landscape_smoothness_edge); + blood_puddle_landscape_albedo_darkening@f1 = (blood_puddle_landscape_albedo_darkening); } @@ -358,10 +373,10 @@ shader blood_puddles_resolve if (invAlpha == 1.0) discard; - float alpha = 1.0 - invAlpha; - float edgeCloseness = accBuf0.g; - uint decalType = uint(accBuf0.b * 255.0); + uint decalType__landscape = uint(accBuf0.b * 255.0); + uint decalType = decalType__landscape >> 1; + bool isLandscape = (decalType__landscape & 0x1) == 1; float intensity = accBuf0.r; float thickness = 1.0 - intensity; @@ -371,19 +386,41 @@ shader blood_puddles_resolve float2 packedNormal = texelFetch(blood_acc_normal, input.pos.xy, 0).rg; float3 normal = unpack_normal_so(packedNormal); - float invEdgeCloseness = 1.0 - edgeCloseness; - float3 vecToEdge = (ddx(invEdgeCloseness) * (view_vecLT + view_vecLB) + ddy(invEdgeCloseness) * (view_vecLT + view_vecRT)).xyz; - if (fwidth(invEdgeCloseness) > 0.5 / 255) - normal = lerp(normal, vecToEdge, saturate(edgeCloseness)); - + float reflectance; + float smoothness; + float bloodNormalBlend; + float alpha = (1.0 - invAlpha); float3 diffuse = lerp(blood_puddle_low_intensity_color.xyz, blood_puddle_high_intensity_color.xyz, - intensity); - diffuse = lerp(1.0.xxx, diffuse, alpha); + 1.0 - thickness); + + BRANCH + if (isLandscape) + { + reflectance = blood_puddle_landscape_reflectance; + smoothness = lerp(blood_puddle_smoothness, blood_puddle_landscape_smoothness_edge, edgeCloseness); + bloodNormalBlend = 1.0 - edgeCloseness; - float smoothness = lerp(blood_puddle_smoothness, blood_puddle_smoothness_edge, edgeCloseness); + diffuse *= lerp(blood_puddle_landscape_albedo_darkening, 1.0, edgeCloseness); + alpha *= 1.0 - pow(edgeCloseness, 4.0); + } + else + { + reflectance = blood_puddle_reflectance; + smoothness = lerp(blood_puddle_smoothness, blood_puddle_smoothness_edge, edgeCloseness); + float invEdgeCloseness = 1.0 - edgeCloseness; + float3 vecToEdge = (ddx(invEdgeCloseness) * (view_vecLT + view_vecLB) + ddy(invEdgeCloseness) * (view_vecLT + view_vecRT)).xyz; + if (fwidth(invEdgeCloseness) > 0.5 / 255) + normal = lerp(normal, vecToEdge, saturate(edgeCloseness)); + + float bloodNormalDominanceTerm = float(perGroupParams[decalType].bloodNormalDominanceTerm_edgeWidthScale & 0xFF)/255.0; + bloodNormalBlend = max(edgeCloseness, bloodNormalDominanceTerm); + } + + diffuse = lerp(1.0.xxx, diffuse, alpha); float alpha3 = pow3(alpha); + float srcMulDstDominance = lerp(1.0, 0.96, alpha3); float srcDominance = (1.0/srcMulDstDominance - 1.0); @@ -391,7 +428,7 @@ shader blood_puddles_resolve init_gbuffer(output); init_albedo(output, diffuse * srcMulDstDominance); init_ao(output, srcDominance); - init_reflectance(output, blood_puddle_reflectance); + init_reflectance(output, reflectance); init_metalness(output, 0.0); init_smoothness(output, smoothness); init_normal(output, normal); @@ -402,9 +439,6 @@ shader blood_puddles_resolve output.smoothness = 0; ##endif - float bloodNormalDominanceTerm = float(perGroupParams[decalType].bloodNormalDominanceTerm_edgeWidthScale & 0xFF)/255.0; - float bloodNormalBlend = max(edgeCloseness, bloodNormalDominanceTerm); - GBUFFER_OUTPUT gbuf = encode_gbuffer(output, 0, GET_SCREEN_POS(input.pos)); gbuf.normal_material.w = bloodNormalBlend * alpha3; gbuf.smoothness_reflectance_metallTranslucency_shadow.w = 0.9 * alpha3; @@ -490,7 +524,8 @@ shader blood_puddles output.smoothness = 0; ##endif - float bloodNormalDominanceTerm = float(perGroupParams[input.decal_type__frame__rndIndex.x].bloodNormalDominanceTerm_edgeWidthScale & 0xFF)/255.0; + float decalType = input.decal_type_and_landscape__frame__rndIndex.x >> 1; + float bloodNormalDominanceTerm = float(perGroupParams[decalType].bloodNormalDominanceTerm_edgeWidthScale & 0xFF)/255.0; float bloodNormalBlend = max(edgeCloseness, bloodNormalDominanceTerm); GBUFFER_OUTPUT gbuf = encode_gbuffer(output, 0, GET_SCREEN_POS(input.pos));//should be PointToEye diff --git a/prog/daNetGameLibs/daGdp/debug/globalManagerDebugES.cpp.inl b/prog/daNetGameLibs/daGdp/debug/globalManagerDebugES.cpp.inl index f0ea43b41..d8f18cfb7 100644 --- a/prog/daNetGameLibs/daGdp/debug/globalManagerDebugES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/debug/globalManagerDebugES.cpp.inl @@ -61,11 +61,11 @@ static inline void global_manager_debug_imgui_ecs_query(Callable); static void imgui_callback() { - global_manager_debug_imgui_ecs_query([](GlobalManager &dagdp__global_manager) { dagdp__global_manager.imgui(); }); + global_manager_debug_imgui_ecs_query([](dagdp::GlobalManager &dagdp__global_manager) { dagdp__global_manager.imgui(); }); } } // namespace dagdp static constexpr auto IMGUI_WINDOW_GROUP = "daGDP"; static constexpr auto IMGUI_WINDOW = "daGDP##dagdp"; -REGISTER_IMGUI_WINDOW(IMGUI_WINDOW_GROUP, IMGUI_WINDOW, dagdp::imgui_callback); \ No newline at end of file +REGISTER_IMGUI_WINDOW(IMGUI_WINDOW_GROUP, IMGUI_WINDOW, dagdp::imgui_callback); diff --git a/prog/daNetGameLibs/daGdp/debug/placers/heightmapDebugES.cpp.inl b/prog/daNetGameLibs/daGdp/debug/placers/heightmapDebugES.cpp.inl index fb55f5774..904cc7ecb 100644 --- a/prog/daNetGameLibs/daGdp/debug/placers/heightmapDebugES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/debug/placers/heightmapDebugES.cpp.inl @@ -11,8 +11,8 @@ namespace dagdp { -ECS_NO_ORDER static inline void heightmap_debug_invalidate_views_es(const EventInvalidateViews &, - HeightmapManager &dagdp__heightmap_manager) +ECS_NO_ORDER static inline void heightmap_debug_invalidate_views_es(const dagdp::EventInvalidateViews &, + dagdp::HeightmapManager &dagdp__heightmap_manager) { dagdp__heightmap_manager.debug.builders.clear(); } @@ -132,7 +132,7 @@ static inline void heightmap_debug_imgui_ecs_query(Callable); static void imgui_callback() { - heightmap_debug_imgui_ecs_query([](GlobalManager &dagdp__global_manager, HeightmapManager &dagdp__heightmap_manager) { + heightmap_debug_imgui_ecs_query([](dagdp::GlobalManager &dagdp__global_manager, dagdp::HeightmapManager &dagdp__heightmap_manager) { imgui(dagdp__global_manager, dagdp__heightmap_manager); }); } @@ -141,4 +141,4 @@ static void imgui_callback() static constexpr auto IMGUI_WINDOW_GROUP = "daGDP"; static constexpr auto IMGUI_WINDOW = "Heightmap##dagdp-heightmap"; -REGISTER_IMGUI_WINDOW(IMGUI_WINDOW_GROUP, IMGUI_WINDOW, dagdp::imgui_callback); \ No newline at end of file +REGISTER_IMGUI_WINDOW(IMGUI_WINDOW_GROUP, IMGUI_WINDOW, dagdp::imgui_callback); diff --git a/prog/daNetGameLibs/daGdp/render/dynShadowsES.cpp.inl b/prog/daNetGameLibs/daGdp/render/dynShadowsES.cpp.inl index 06e2f40e3..1f520be91 100644 --- a/prog/daNetGameLibs/daGdp/render/dynShadowsES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/render/dynShadowsES.cpp.inl @@ -19,8 +19,8 @@ static inline void spot_lights_ecs_query(Callable); template static inline void omni_lights_ecs_query(Callable); -ECS_NO_ORDER static inline void dyn_shadows_recreate_views_es(const EventRecreateViews &evt, - DynShadowsManager &dagdp__dyn_shadows_manager) +ECS_NO_ORDER static inline void dyn_shadows_recreate_views_es(const dagdp::EventRecreateViews &evt, + dagdp::DynShadowsManager &dagdp__dyn_shadows_manager) { FRAMEMEM_REGION; G_UNUSED(dagdp__dyn_shadows_manager); @@ -101,4 +101,4 @@ ECS_TRACK(light__render_gpu_objects, omni_light__shadows, light__max_radius) ECS_REQUIRE(eastl::true_type light__render_gpu_objects, eastl::true_type omni_light__shadows, float light__max_radius) static void omni_lights_changed_es(const ecs::Event &) { destroy_views(); } -} // namespace dagdp \ No newline at end of file +} // namespace dagdp diff --git a/prog/daNetGameLibs/daGdp/render/globalManagerES.cpp.inl b/prog/daNetGameLibs/daGdp/render/globalManagerES.cpp.inl index de326a7d7..03f955b3f 100644 --- a/prog/daNetGameLibs/daGdp/render/globalManagerES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/render/globalManagerES.cpp.inl @@ -20,13 +20,13 @@ namespace dagdp static bool g_forceDisable = false; ECS_TAG(render) -static void dagdp_update_es(const UpdateStageInfoBeforeRender &, GlobalManager &dagdp__global_manager) +static void dagdp_update_es(const UpdateStageInfoBeforeRender &, dagdp::GlobalManager &dagdp__global_manager) { dagdp__global_manager.update(); } ECS_TAG(render) -static void dagdp_after_device_reset_es(const AfterDeviceReset &, GlobalManager &dagdp__global_manager) +static void dagdp_after_device_reset_es(const AfterDeviceReset &, dagdp::GlobalManager &dagdp__global_manager) { // Force recreation of all GPU buffers. dagdp__global_manager.invalidateViews(); @@ -54,7 +54,7 @@ static GlobalConfig get_current_config() } ECS_TAG(render) -static void dagdp_on_render_settings_change_es(const OnRenderSettingsReady &, GlobalManager &dagdp__global_manager) +static void dagdp_on_render_settings_change_es(const OnRenderSettingsReady &, dagdp::GlobalManager &dagdp__global_manager) { // Note: relying on this event to be broadcast at level load. @@ -62,7 +62,7 @@ static void dagdp_on_render_settings_change_es(const OnRenderSettingsReady &, Gl } ECS_TAG(render) -static void dagdp_on_render_features_change_es(const ChangeRenderFeatures &, GlobalManager &dagdp__global_manager) +static void dagdp_on_render_features_change_es(const ChangeRenderFeatures &, dagdp::GlobalManager &dagdp__global_manager) { // Always reconfigure (which implies invalidation) when render features have changed, // because shaders might be reloaded, and so cached data in the nodes may need to be reset. @@ -71,13 +71,13 @@ static void dagdp_on_render_features_change_es(const ChangeRenderFeatures &, Glo } ECS_TAG(render) -static void dagdp_on_shader_reload_es(const AfterShaderReload &, GlobalManager &dagdp__global_manager) +static void dagdp_on_shader_reload_es(const AfterShaderReload &, dagdp::GlobalManager &dagdp__global_manager) { dagdp__global_manager.reconfigure(get_current_config()); } ECS_TAG(render) -static void dagdp_on_level_unload_es(const UnloadLevel &, GlobalManager &dagdp__global_manager) +static void dagdp_on_level_unload_es(const UnloadLevel &, dagdp::GlobalManager &dagdp__global_manager) { GlobalConfig emptyConfig; // Everything disabled by default. dagdp__global_manager.reconfigure(emptyConfig); @@ -187,4 +187,4 @@ static bool dagdp_console_handler(const char *argv[], int argc) return found; } -REGISTER_CONSOLE_HANDLER(dagdp_console_handler); \ No newline at end of file +REGISTER_CONSOLE_HANDLER(dagdp_console_handler); diff --git a/prog/daNetGameLibs/daGdp/render/objects/riexES.cpp.inl b/prog/daNetGameLibs/daGdp/render/objects/riexES.cpp.inl index 00623eb26..80eea6665 100644 --- a/prog/daNetGameLibs/daGdp/render/objects/riexES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/render/objects/riexES.cpp.inl @@ -25,7 +25,7 @@ template static inline void riex_object_group_ecs_query(Callable); ECS_NO_ORDER -static inline void riex_object_group_process_es(const EventObjectGroupProcess &evt, RiexManager &dagdp__riex_manager) +static inline void riex_object_group_process_es(const dagdp::EventObjectGroupProcess &evt, dagdp::RiexManager &dagdp__riex_manager) { auto &rulesBuilder = *evt.get<0>(); auto &builder = dagdp__riex_manager.currentBuilder; @@ -202,7 +202,7 @@ static inline void riex_object_group_process_es(const EventObjectGroupProcess &e } ECS_NO_ORDER -static inline void riex_view_finalize_es(const EventViewFinalize &evt, RiexManager &dagdp__riex_manager) +static inline void riex_view_finalize_es(const dagdp::EventViewFinalize &evt, dagdp::RiexManager &dagdp__riex_manager) { const auto &viewInfo = evt.get<0>(); const auto &viewBuilder = evt.get<1>(); @@ -211,9 +211,12 @@ static inline void riex_view_finalize_es(const EventViewFinalize &evt, RiexManag } ECS_NO_ORDER -static inline void riex_finalize_es(const EventFinalize &, RiexManager &dagdp__riex_manager) { riex_finalize(dagdp__riex_manager); } +static inline void riex_finalize_es(const dagdp::EventFinalize &, dagdp::RiexManager &dagdp__riex_manager) +{ + riex_finalize(dagdp__riex_manager); +} -ECS_NO_ORDER static inline void riex_invalidate_views_es(const EventInvalidateViews &, RiexManager &dagdp__riex_manager) +ECS_NO_ORDER static inline void riex_invalidate_views_es(const dagdp::EventInvalidateViews &, dagdp::RiexManager &dagdp__riex_manager) { dagdp__riex_manager.shadowExtensionHandle = {}; } @@ -248,4 +251,4 @@ struct RiexPreload } // namespace dagdp ECS_DECLARE_RELOCATABLE_TYPE(dagdp::RiexPreload); -ECS_REGISTER_RELOCATABLE_TYPE(dagdp::RiexPreload, nullptr); \ No newline at end of file +ECS_REGISTER_RELOCATABLE_TYPE(dagdp::RiexPreload, nullptr); diff --git a/prog/daNetGameLibs/daGdp/render/placers/heightmapES.cpp.inl b/prog/daNetGameLibs/daGdp/render/placers/heightmapES.cpp.inl index 26dc3b4b4..54ab974d5 100644 --- a/prog/daNetGameLibs/daGdp/render/placers/heightmapES.cpp.inl +++ b/prog/daNetGameLibs/daGdp/render/placers/heightmapES.cpp.inl @@ -85,7 +85,8 @@ static inline void heightmap_density_mask_disappeared_es(const ecs::Event &) } ECS_NO_ORDER -static inline void heightmap_initialize_density_mask_es(const EventInitialize &, HeightmapManager &dagdp__heightmap_manager) +static inline void heightmap_initialize_density_mask_es(const dagdp::EventInitialize &, + dagdp::HeightmapManager &dagdp__heightmap_manager) { auto ¤tBuilder = dagdp__heightmap_manager.currentBuilder; @@ -97,7 +98,7 @@ static inline void heightmap_initialize_density_mask_es(const EventInitialize &, } ECS_NO_ORDER -static inline void heightmap_view_process_es(const EventViewProcess &evt, HeightmapManager &dagdp__heightmap_manager) +static inline void heightmap_view_process_es(const dagdp::EventViewProcess &evt, dagdp::HeightmapManager &dagdp__heightmap_manager) { FRAMEMEM_REGION; @@ -374,7 +375,8 @@ static inline void heightmap_view_process_es(const EventViewProcess &evt, Height } } -ECS_NO_ORDER static inline void heightmap_view_finalize_es(const EventViewFinalize &evt, HeightmapManager &dagdp__heightmap_manager) +ECS_NO_ORDER static inline void heightmap_view_finalize_es(const dagdp::EventViewFinalize &evt, + dagdp::HeightmapManager &dagdp__heightmap_manager) { const auto &viewInfo = evt.get<0>(); const auto &viewBuilder = evt.get<1>(); @@ -415,7 +417,7 @@ ECS_REQUIRE(ecs::Tag dagdp_placer_heightmap, float dagdp__heightmap_cell_size) static void dagdp_placer_heightmap_changed_es(const ecs::Event &) { - manager_ecs_query([](GlobalManager &dagdp__global_manager) { dagdp__global_manager.invalidateRules(); }); + manager_ecs_query([](dagdp::GlobalManager &dagdp__global_manager) { dagdp__global_manager.invalidateRules(); }); } } // namespace dagdp diff --git a/prog/daNetGameLibs/dascript_base/memory_profiler.das b/prog/daNetGameLibs/dascript_base/memory_profiler.das index 1415cb78d..2974a6767 100644 --- a/prog/daNetGameLibs/dascript_base/memory_profiler.das +++ b/prog/daNetGameLibs/dascript_base/memory_profiler.das @@ -54,7 +54,7 @@ struct Event childStringHeap : uint64 -var data : table +var data : table var stack : array diff --git a/prog/daNetGameLibs/imgui_daeditor/imgui/anim_graph_common.das b/prog/daNetGameLibs/imgui_daeditor/imgui/anim_graph_common.das index 4b4fbc0a9..f262b6cc9 100644 --- a/prog/daNetGameLibs/imgui_daeditor/imgui/anim_graph_common.das +++ b/prog/daNetGameLibs/imgui_daeditor/imgui/anim_graph_common.das @@ -333,7 +333,7 @@ def render_AnimBlendCtrl_Fifo3(var nod : IAnimBlendNode?; var graph : AnimationG let timeScaleParam = *node |> anim_blend_node_getTimeScaleParamId(state) add_input_param(timeScaleParam, ++inNodeIdx, "time scale", nodeId, state, graph, context) let paramId = *node |> anim_blend_node_getParamId() - var queue : AnimFifo3Queue? = reinterpret (state |> anim_state_holder_getInlinePtr(paramId)) + var queue : AnimFifo3Queue? = reinterpret(state |> anim_state_holder_getInlinePtr(paramId)) add_input_param(paramId, ++inNodeIdx, "state: {queue.state} t0: {queue.t0}", nodeId, state, graph, context) for idx in range(3) @@ -534,7 +534,7 @@ def render_AnimPostBlendCtrl(var nod : IAnimBlendNode?; var graph : AnimationGra [unused_argument(state)] -def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; var reset_state : bool&; var params_filter : ImGuiTextFilter&) +def render_anim_graph2(animchar : AnimcharBaseComponent; var graph : AnimationGraph; var state : IAnimStateHolder; var reset_state : bool&; var params_filter : ImGuiTextFilter&) var renderers : table renderers[AnimBlendNodeNullCID] = @@render_AnimBlendNodeNull @@ -624,7 +624,7 @@ def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; continue if paramType == PT_ScalarParam - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") var value = state |> anim_state_holder_getParam(param.id) let min = -1e8 let max = 1e8 @@ -634,7 +634,7 @@ def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; Spacing() elif paramType == PT_ScalarParamInt - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") let value = state |> anim_state_holder_getParamInt(param.id) let step = 1 let fastStep = 5 @@ -645,7 +645,7 @@ def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; elif showHiddenParams if paramType == PT_TimeParam - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") let timeValue = state |> anim_state_holder_getParam(param.id) let min = -1e8 let max = 1e8 @@ -663,29 +663,33 @@ def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; Spacing() elif paramType == PT_InlinePtr - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") imgui::TextUnformatted(" ") Spacing() elif paramType == PT_InlinePtrCTZ - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") imgui::TextUnformatted(" ") Spacing() elif paramType == PT_Fifo3 - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") imgui::TextUnformatted(" ") Spacing() elif paramType == PT_Effector - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") imgui::TextUnformatted(" ") Spacing() else - imgui::Text(param.name) + imgui::Text("({param.id}) {param.name}") Spacing() + if imgui::CollapsingHeader("Slots") + for i in range(animchar |> animchar_getAttachmentSlotsCount()) + let slotId = animchar |> animchar_getAttachmentSlotId(i) + imgui::Text("({slotId}) {animchar_getSlotName(slotId)}") imgui::EndChild() ImGuiEx_NextColumn() @@ -773,6 +777,8 @@ def render_anim_graph2(var graph : AnimationGraph; var state : IAnimStateHolder; var foundRender = false for uid, render in keys(renderers), values(renderers) if *nodePtr |> anim_blend_node_isSubOf(uid) + unsafe + imgui::Text("ID: {reinterpret nodePtr}") render |> invoke(nodePtr, graph, state, ctx, weight) foundRender = true break diff --git a/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspector_common_types_debug.das b/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspector_common_types_debug.das index 9c2938dbd..90eb412c5 100644 --- a/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspector_common_types_debug.das +++ b/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspector_common_types_debug.das @@ -261,7 +261,7 @@ def draw_EntityId(eid : array implicit; flags : uint; name : string; r var uVal = uint(*val) let TEXT_BASE_WIDTH = CalcTextSize("A").x SetNextItemWidth(imgui::GetColumnWidth() - TEXT_BASE_WIDTH * 12f) - if InputScalar("##{name}", ImGuiDataType U32, safe_addr(uVal), [[int? ]], [[int? ]], "%d", ImGuiInputTextFlags None) + if InputScalar("##{name}", ImGuiDataType U32, safe_addr(uVal), [[int?]], [[int?]], "%d", ImGuiInputTextFlags None) *val = EntityId(uVal) *changed = true if !!*val diff --git a/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspectors_common.das b/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspectors_common.das index b4c681981..2153f51dc 100644 --- a/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspectors_common.das +++ b/prog/daNetGameLibs/imgui_daeditor/imgui/daEditor/ecs_inspectors_common.das @@ -219,7 +219,7 @@ def call_inspector(type_name : string implicit; eid : array implicit; [apply_in_context(ecs_inspectors)] def add_editor(prefix : bool; tags : array implicit; var fn : EditorFn; var ctx : Context implicit) : bool var tagHashes <- [{ for tag in tags; !empty(tag) ? ecs_hash(tag) : 0u }] - editors |> emplace <| [[EditorDesc prefix=prefix, tags <- tagHashes, fn=new ContextEditorFn(fn, ctx) ]] + editors |> emplace <| [[EditorDesc prefix=prefix, tags <- tagHashes, fn=new ContextEditorFn(fn, ctx)]] return true diff --git a/prog/daNetGameLibs/imgui_daeditor/imgui/ecs_anim_graph.das b/prog/daNetGameLibs/imgui_daeditor/imgui/ecs_anim_graph.das index e1217cf63..02241801b 100644 --- a/prog/daNetGameLibs/imgui_daeditor/imgui/ecs_anim_graph.das +++ b/prog/daNetGameLibs/imgui_daeditor/imgui/ecs_anim_graph.das @@ -26,7 +26,7 @@ def ecs_anim_graph2() var graph = animchar.animGraph if graph != null var resetState = false - render_anim_graph2(*graph, *animchar.animState, resetState, *paramsFilter) + render_anim_graph2(animchar, *graph, *animchar.animState, resetState, *paramsFilter) if resetState eid |> addSubTemplate("animchar_lock_anim_state_change") if animchar__animState != null diff --git a/prog/daNetGameLibs/local_tone_mapping/render/local_tone_mapping.das b/prog/daNetGameLibs/local_tone_mapping/render/local_tone_mapping.das index f1f7bb23e..af77c1268 100644 --- a/prog/daNetGameLibs/local_tone_mapping/render/local_tone_mapping.das +++ b/prog/daNetGameLibs/local_tone_mapping/render/local_tone_mapping.das @@ -117,7 +117,7 @@ def register_downsample_nodes(var local_tone_mapping__downsample_nodes : NodeHan var exposureHndl = registry |> create(format("exposures_%d", index), History No) |> texture(nextLayerInfo) |> atStage(Stage COMPUTE) |> useAs(Usage SHADER_RESOURCE) |> handle() var weightHndl = registry |> create(format("weights_%d", index), History No) |> texture(nextLayerInfo) |> atStage(Stage COMPUTE) |> useAs(Usage SHADER_RESOURCE) |> handle() var postfxResolution = registry |> getResolution`2("post_fx") - return <- @ <| [[ <- postfxResolution, <- exposureHndl, <- weightHndl, <- displayMip, <- resolutionDivider, <- highQuality ]] + return <- @ <| [[ <- postfxResolution, <- exposureHndl, <- weightHndl, <- displayMip, <- resolutionDivider, <- highQuality]] set_int(source_mipVarId, index == 0 ? 0 : MIPS_FOR_ONE_PASS - 1) set_int(mips_cntVarId, int(mipsCnt)) set_int(display_mipVarId, int(displayMip)) @@ -188,7 +188,7 @@ def register_upsample_nodes(var local_tone_mapping__upsample_nodes : NodeHandleV var exposureHndl = registry |> create(firstNode ? "exposure_multiplier_tex" : format("exposure_multiplier_%d", inversedIndex), History No) |> texture(nextLayerInfo) |> atStage(Stage COMPUTE) |> useAs(Usage SHADER_RESOURCE) |> handle() var postfxResolution = registry |> getResolution`2("post_fx"); - return <- @ <| [[ <- postfxResolution, <- exposureHndl, <- weightHndls, <- displayMip, <- upsampleMode, <- resolutionDivider ]] + return <- @ <| [[ <- postfxResolution, <- exposureHndl, <- weightHndls, <- displayMip, <- upsampleMode, <- resolutionDivider]] set_int(upsample_modeVarId, upsampleMode) set_int(mips_cntVarId, mipsCnt) set_int(base_mipVarId, displayMip) diff --git a/prog/daNetGameLibs/local_tone_mapping/shaders/apply.dshl b/prog/daNetGameLibs/local_tone_mapping/shaders/apply.dshl index 4c180e210..d7d4ab0b8 100644 --- a/prog/daNetGameLibs/local_tone_mapping/shaders/apply.dshl +++ b/prog/daNetGameLibs/local_tone_mapping/shaders/apply.dshl @@ -11,7 +11,7 @@ hlsl(code) { float get_local_exposure(float3 frame, float2 tc) { - float exposure = getPrevExposureRatio(); + float exposure = getExposureScale(); #define exposure_tex_samplerstate full_tonemap_lut_samplerstate // Workaround until we don't completely support custom samplers return tex2D(exposure_tex, tc).x * exposure; } diff --git a/prog/daNetGameLibs/local_tone_mapping/shaders/downsample.dshl b/prog/daNetGameLibs/local_tone_mapping/shaders/downsample.dshl index 352ff5881..3bc30a048 100644 --- a/prog/daNetGameLibs/local_tone_mapping/shaders/downsample.dshl +++ b/prog/daNetGameLibs/local_tone_mapping/shaders/downsample.dshl @@ -57,14 +57,14 @@ shader local_tone_mapping_downsample static const uint GROUP_SIZE = 1u << GROUP_SIZE_POW; RWTexture2D output[WINDOW_SIZE_POW + 1] : register(u0); RWTexture2D weights_tex[WINDOW_SIZE_POW + 1] : register(u4); - groupshared float3 cachedMem[GROUP_SIZE][GROUP_SIZE]; - groupshared float3 cachedWeights[GROUP_SIZE][GROUP_SIZE]; + ##if apply_per_tile_blur == yes static const float gaussian_weights[3][3] = { { 0.077847, 0.123317, 0.077847 }, { 0.123317, 0.195346, 0.123317 }, { 0.077847, 0.123317, 0.077847 } }; + ##endif float3 compute_weights(float3 exposures) { @@ -83,31 +83,39 @@ shader local_tone_mapping_downsample return float3(highlights, midtones, shadows); } + ##if apply_per_tile_blur == yes || mips_cnt > one + + // grouping as linear block of float4 instead of float3 is 4 times faster on vk/dx12 + // probably dx11 does that internally, while DXC does not + groupshared float4 cachedMem[GROUP_SIZE*GROUP_SIZE]; + groupshared float4 cachedWeights[GROUP_SIZE*GROUP_SIZE]; + float3 get_cached_exposure(uint2 localId) { ##assert(all(localId < GROUP_SIZE), "localId (%f, %f) is out of bounds on exposure reading", localId.x, localId.y); - return cachedMem[localId.x][localId.y]; + return cachedMem[localId.x+GROUP_SIZE*localId.y].xyz; } float3 get_cached_weight(uint2 localId) { ##assert(all(localId < GROUP_SIZE), "localId (%f, %f) is out of bounds on weights reading", localId.x, localId.y); - return cachedWeights[localId.x][localId.y]; + return cachedWeights[localId.x+GROUP_SIZE*localId.y].xyz; } void store_cached_exposure(uint2 localId, float3 exposure) { ##assert(all(localId < GROUP_SIZE), "localId (%f, %f) is out of bounds on exposure writing", localId.x, localId.y); - cachedMem[localId.x][localId.y] = exposure; + cachedMem[localId.x+GROUP_SIZE*localId.y] = float4(exposure,0); } void store_cached_weight(uint2 localId, float3 weight) { ##assert(all(localId < GROUP_SIZE), "localId (%f, %f) is out of bounds on weights writing", localId.x, localId.y); - cachedWeights[localId.x][localId.y] = weight; + cachedWeights[localId.x+GROUP_SIZE*localId.y] = float4(weight,0); } void process_mip(uint divisor_pow, uint2 algoBasedLocalId, uint2 algoBasedGroupId, uint2 groupDataOffset, uint2 localId, inout float3 exposure, inout float3 w) { GroupMemoryBarrierWithGroupSync(); - if (all(algoBasedLocalId < (WINDOW_SIZE >> divisor_pow))) + bool algoLocalIdInWindow = all(algoBasedLocalId < (WINDOW_SIZE >> divisor_pow)); + if (algoLocalIdInWindow) { exposure = 0; w = 0; @@ -119,14 +127,8 @@ shader local_tone_mapping_downsample exposure += get_cached_exposure(algoBasedLocalId * 2 + int2(i, j) + groupDataOffset); w += get_cached_weight(algoBasedLocalId * 2 + int2(i, j) + groupDataOffset); } - } - GroupMemoryBarrierWithGroupSync(); - if (all(algoBasedLocalId < (WINDOW_SIZE >> divisor_pow))) - { exposure /= 4; w /= 4; - store_cached_exposure(algoBasedLocalId + groupDataOffset, exposure); - store_cached_weight(algoBasedLocalId + groupDataOffset, w); BRANCH if (display_mip <= divisor_pow) { @@ -140,6 +142,12 @@ shader local_tone_mapping_downsample } } } + GroupMemoryBarrierWithGroupSync(); + if (algoLocalIdInWindow) + { + store_cached_exposure(algoBasedLocalId + groupDataOffset, exposure); + store_cached_weight(algoBasedLocalId + groupDataOffset, w); + } ##if apply_per_tile_blur == yes GroupMemoryBarrierWithGroupSync(); exposure = 0; @@ -160,6 +168,7 @@ shader local_tone_mapping_downsample store_cached_weight(localId, w); ##endif } + ##endif [numthreads(GROUP_SIZE, GROUP_SIZE, 1)] void local_tone_mapping_downsample_cs(uint2 dtId : SV_DispatchThreadID, uint2 localId : SV_GroupThreadID, uint2 groupId : SV_GroupID) @@ -169,14 +178,14 @@ shader local_tone_mapping_downsample uint2 algoBasedGroupId = (groupId << (GROUP_SIZE_POW - WINDOW_SIZE_POW)) | (localId >> WINDOW_SIZE_POW); float3 exposure = 0; float3 w = 0; + uint2 mipSize; + uint level; + src_tex.GetDimensions(source_mip, mipSize.x, mipSize.y, level); UNROLL for (int i = 0; i < 2; ++i) UNROLL for (int j = 0; j < 2; ++j) { - uint2 mipSize; - uint level; - src_tex.GetDimensions(source_mip, mipSize.x, mipSize.y, level); uint2 threadTc = dtId * 2 + int2(i, j); ##if skip_each_odd_texel == yes if (source_mip == 0) @@ -190,33 +199,43 @@ shader local_tone_mapping_downsample BRANCH if (source_mip == 0) w += compute_weights(currentExp); + ##if src_weight_tex != NULL else w += texelFetch(src_weight_tex, threadTc, source_mip).xyz; + ##endif } exposure /= 4; w /= 4; - store_cached_exposure(algoBasedLocalId + groupDataOffset, exposure); - store_cached_weight(algoBasedLocalId + groupDataOffset, w); + + ##if apply_per_tile_blur == yes || mips_cnt > one + store_cached_exposure(algoBasedLocalId + groupDataOffset, exposure); + store_cached_weight(algoBasedLocalId + groupDataOffset, w); + GroupMemoryBarrierWithGroupSync(); + ##endif + ##if apply_per_tile_blur == yes - GroupMemoryBarrierWithGroupSync(); - exposure = 0; - w = 0; - UNROLL - for (int x = 0; x < 3; ++x) + exposure = 0; + w = 0; UNROLL - for (int y = 0; y < 3; ++y) - { - uint2 clampedId = clamp(int2(localId) + int2(x - 1, y - 1), 0, int(GROUP_SIZE) - 1); - float3 cachedExposure = get_cached_exposure(clampedId); - float3 cachedWeight = get_cached_weight(clampedId); - float gaussianWeight = gaussian_weights[x][y]; // Replace with actual gaussian weights - exposure += cachedExposure * gaussianWeight; - w += cachedWeight * gaussianWeight; - } - store_cached_exposure(localId, exposure); - store_cached_weight(localId, w); + for (int x = 0; x < 3; ++x) + UNROLL + for (int y = 0; y < 3; ++y) + { + uint2 clampedId = clamp(int2(localId) + int2(x - 1, y - 1), 0, int(GROUP_SIZE) - 1); + float3 cachedExposure = get_cached_exposure(clampedId); + float3 cachedWeight = get_cached_weight(clampedId); + float gaussianWeight = gaussian_weights[x][y]; + exposure += cachedExposure * gaussianWeight; + w += cachedWeight * gaussianWeight; + } + ##if mips_cnt > one + store_cached_exposure(localId, exposure); + store_cached_weight(localId, w); + //next process mip has GroupMemoryBarrierWithGroupSync(); internally + ##endif ##endif - GroupMemoryBarrierWithGroupSync(); + + BRANCH if (display_mip == 0) { diff --git a/prog/daNetGameLibs/local_tone_mapping/shaders/upsample.dshl b/prog/daNetGameLibs/local_tone_mapping/shaders/upsample.dshl index bcac51704..70ccd8493 100644 --- a/prog/daNetGameLibs/local_tone_mapping/shaders/upsample.dshl +++ b/prog/daNetGameLibs/local_tone_mapping/shaders/upsample.dshl @@ -43,9 +43,12 @@ shader local_tone_mapping_upsample ##elif mips_cnt == four static const uint WINDOW_SIZE_POW = 3; ##endif + static const uint WINDOW_SIZE = 1u << WINDOW_SIZE_POW; static const uint GROUP_SIZE_POW = 3u; static const uint GROUP_SIZE = 1u << GROUP_SIZE_POW; + + ##if mips_cnt != one groupshared float4 cachedMem[GROUP_SIZE][GROUP_SIZE]; float4 get_cached_exposure(uint2 localId) @@ -58,15 +61,22 @@ shader local_tone_mapping_upsample ##assert(all(localId < GROUP_SIZE), "localId (%f, %f) is out of bounds on exposure writing", localId.x, localId.y); cachedMem[localId.x][localId.y] = exposure; } + ##endif [numthreads(GROUP_SIZE, GROUP_SIZE, 1)] void upsample_cs(uint2 dtId : SV_DispatchThreadID, uint2 localId : SV_GroupThreadID, uint2 groupId : SV_GroupID) { + ##if mips_cnt != one uint2 algoBasedLocalId = localId & ((1u << WINDOW_SIZE_POW) - 1); uint2 groupDataOffset = (localId >> WINDOW_SIZE_POW) << WINDOW_SIZE_POW; uint2 algoBasedGroupId = (groupId << (GROUP_SIZE_POW - WINDOW_SIZE_POW)) | (localId >> WINDOW_SIZE_POW); store_cached_exposure(localId, float4(0, 0, 0, 0)); GroupMemoryBarrierWithGroupSync(); + ##else + uint2 algoBasedLocalId = uint2(0,0); + uint2 groupDataOffset = localId; + uint2 algoBasedGroupId = (groupId << (GROUP_SIZE_POW - WINDOW_SIZE_POW)) | (localId >> WINDOW_SIZE_POW); + ##endif float accumulated = 0; float3 prev_exposure = 0; @@ -82,6 +92,8 @@ shader local_tone_mapping_upsample allowBoostContrast = boostLocalContrast > 0; } ##endif + + ##if mips_cnt != one for (int i = WINDOW_SIZE_POW; i >= 0; --i) { if (all(algoBasedLocalId < (WINDOW_SIZE >> i))) @@ -110,6 +122,19 @@ shader local_tone_mapping_upsample GroupMemoryBarrierWithGroupSync(); } } + ##else + uint2 mipSize; + uint level; + exposures_tex.GetDimensions(base_mip, mipSize.x, mipSize.y, level); + uint2 threadTc = clamp(algoBasedGroupId * WINDOW_SIZE + algoBasedLocalId, 0u, mipSize - 1u); + float3 exposure = texelFetch(exposures_tex, threadTc, base_mip).xyz; + float3 laplacians = exposure - prev_exposure; + float3 weights = texelFetch(weights_tex, threadTc, base_mip).xyz * (allowBoostContrast ? abs(laplacians) + 0.00001 : 1.0); + weights /= dot(weights, float3(1, 1, 1)) + 0.00001; + float laplac = dot(laplacians * weights, float3(1, 1, 1)); + accumulated += laplac; + allowBoostContrast = allowBoostContrast || (boostLocalContrast > 0); + ##endif if (all(dtId < tex_size.xy)) { ##if needFinalization diff --git a/prog/daNetGameLibs/motion_matching/animation/load_animation_data_base.cpp b/prog/daNetGameLibs/motion_matching/animation/load_animation_data_base.cpp index 758a7387f..d1c0794dc 100644 --- a/prog/daNetGameLibs/motion_matching/animation/load_animation_data_base.cpp +++ b/prog/daNetGameLibs/motion_matching/animation/load_animation_data_base.cpp @@ -504,9 +504,13 @@ static void load_animations( const DataBlock *clipsBlock = source.getBlockByName("clips"); if (!clipsBlock) { - logerr("no clips block in %s", path.c_str()); + logerr("MM: no clips block in %s", path.c_str()); return; } + else if (source.blockCount() > 1 || source.paramCount() > 0) + { + logerr("MM: only single 'clips' block is supported (%s)", path.c_str()); + } const char *defaultMaskName = clipsBlock->getStr("default_animation_mask", nullptr); const char *defaultTags = clipsBlock->getStr("default_tags", nullptr); auto &clips = dataBase.clips; diff --git a/prog/daNetGameLibs/node_collapser/render/node_collapser_common.das b/prog/daNetGameLibs/node_collapser/render/node_collapser_common.das index 8d3afd342..b5e5b38a9 100644 --- a/prog/daNetGameLibs/node_collapser/render/node_collapser_common.das +++ b/prog/daNetGameLibs/node_collapser/render/node_collapser_common.das @@ -29,6 +29,8 @@ def collapser(position : float3; return assume scene = animchar_render.sceneInstance + + *scene |> scene_instance_clearNodeCollapser() var zeroTm = float3x4(); var from = 0 for node in animchar_node_collapser @@ -48,5 +50,6 @@ def collapser(position : float3; rootPos) for childIdx in range(from, from + node.animchar_node_collapser__childrenCount) let child = uint(animchar_node_collapser__children[childIdx]) - *scene |> scene_instance_setNodeWtm(child, zeroTm) + *scene |> scene_instance_markNodeCollapserNode(child) + from += node.animchar_node_collapser__childrenCount diff --git a/prog/daNetGameLibs/puddles_manager/shaders/puddles.dshl b/prog/daNetGameLibs/puddles_manager/shaders/puddles.dshl index 86784440e..a76be3afa 100644 --- a/prog/daNetGameLibs/puddles_manager/shaders/puddles.dshl +++ b/prog/daNetGameLibs/puddles_manager/shaders/puddles.dshl @@ -59,11 +59,14 @@ macro USE_PUDDLE(stage) ##endif ##endif - void getPuddleData(float tc_world_pos_w, float3 worldPos, float hmapH, out float puddle, out float worldPosYPuddleOffset, out float puddleHeight) + void getPuddleData_impl( + float tc_world_pos_w, float3 worldPos, float hmapH, out float puddle, out float worldPosYPuddleOffset, inout float puddleHeight, + bool calculatePuddleHeight /*compile time const*/) { puddle = 0; worldPosYPuddleOffset = 0; - puddleHeight = 0; + if (calculatePuddleHeight) + puddleHeight = 0; ##if in_editor_assume != yes BRANCH if (world_to_puddles_ofs.x > 0) @@ -72,7 +75,8 @@ macro USE_PUDDLE(stage) float2 vignette = saturate( abs(puddleBaseTc*2-1) * PUDDLE_VIGNETTE_MUL - PUDDLE_VIGNETTE_OFS ); float vignetteEffect = saturate( 1.0 - dot( vignette, vignette ) ); float2 puddleTc = puddleBaseTc-world_to_puddles_tex_ofs.xy; - puddleHeight = getPuddleHeight(hmapH, puddleTc); + if (calculatePuddleHeight) + puddleHeight = getPuddleHeight(hmapH, puddleTc); puddle = saturate(1-(tc_world_pos_w-puddleHeight)*puddle_hardness); float waterLevel = puddle_water_level; float underWaterEffect = saturate((tc_world_pos_w-waterLevel)*10); @@ -81,7 +85,11 @@ macro USE_PUDDLE(stage) } ##endif } - void getPuddleData(float tc_world_pos_w, float3 worldPos, out float puddle, out float worldPosYPuddleOffset, out float puddleHeight) + void getPuddleData(float tc_world_pos_w, float3 worldPos, float hmapH, out float puddle, out float worldPosYPuddleOffset, inout float puddleHeight) + { + getPuddleData_impl(tc_world_pos_w, worldPos, hmapH, puddle, worldPosYPuddleOffset, puddleHeight, true); + } + void getPuddleData(float tc_world_pos_w, float3 worldPos, out float puddle, out float worldPosYPuddleOffset, inout float puddleHeight) { puddle = 0; worldPosYPuddleOffset = 0; @@ -113,10 +121,10 @@ macro USE_AND_CALCULATE_PUDDLES() INIT_PUDDLE(ps) USE_PUDDLE(ps) hlsl (ps) { - half addPuddles(inout UnpackedGbuffer result, float3 worldPos, half tc_world_pos_w, float2 htTc, half porosity, float heightForPuddle) + half addPuddles_impl(inout UnpackedGbuffer result, float3 worldPos, half tc_world_pos_w, float2 htTc, half porosity, float heightForPuddle, float puddleHeight, bool calcPuddleData) { - float puddle, worldPosYPuddleOffset, puddleHeight; - getPuddleData(tc_world_pos_w, worldPos, heightForPuddle, puddle, worldPosYPuddleOffset, puddleHeight); + float puddle, worldPosYPuddleOffset; + getPuddleData_impl(tc_world_pos_w, worldPos, heightForPuddle, puddle, worldPosYPuddleOffset, puddleHeight, calcPuddleData); //todo: combine wetness from puddles with wetness from water float waterBorder; @@ -142,5 +150,16 @@ macro USE_AND_CALCULATE_PUDDLES() } return puddle; } + + half addPuddles(inout UnpackedGbuffer result, float3 worldPos, half tc_world_pos_w, float2 htTc, half porosity, float heightForPuddle) + { + float puddleHeight = 0; + return addPuddles_impl(result, worldPos, tc_world_pos_w, htTc, porosity, heightForPuddle, puddleHeight, true); + } + + half addPuddlesWithConstHeight(inout UnpackedGbuffer result, float3 worldPos, half tc_world_pos_w, float2 htTc, half porosity, float puddleHeight) + { + return addPuddles_impl(result, worldPos, tc_world_pos_w, htTc, porosity, tc_world_pos_w, puddleHeight, false); + } } endmacro diff --git a/prog/daNetGameLibs/renderer/templates/blood.template.blk b/prog/daNetGameLibs/renderer/templates/blood.template.blk index 0d4539226..453f8b058 100644 --- a/prog/daNetGameLibs/renderer/templates/blood.template.blk +++ b/prog/daNetGameLibs/renderer/templates/blood.template.blk @@ -9,6 +9,9 @@ blood_settings{ _tracked:t="blood_puddle_reflectance_value" _tracked:t="blood_puddle_smoothness_value" _tracked:t="blood_puddle_smoothness_edge_value" + _tracked:t="blood_puddle_landscape_reflectance_value" + _tracked:t="blood_puddle_landscape_smoothness_edge_value" + _tracked:t="blood_puddle_landscape_albedo_darkening_value" "blood_begin_color:ShaderVar"{} blood_begin_color_value:p4=0.157, 0.012, 0.000, 1.000 @@ -28,4 +31,11 @@ blood_settings{ blood_puddle_smoothness_value:r=1.0 "blood_puddle_smoothness_edge:ShaderVar"{} blood_puddle_smoothness_edge_value:r=0.9 + + "blood_puddle_landscape_reflectance:ShaderVar"{} + blood_puddle_landscape_reflectance_value:r=0.21 + "blood_puddle_landscape_smoothness_edge:ShaderVar"{} + blood_puddle_landscape_smoothness_edge_value:r=0.4 + "blood_puddle_landscape_albedo_darkening:ShaderVar"{} + blood_puddle_landscape_albedo_darkening_value:r=0.5 } \ No newline at end of file diff --git a/prog/daNetGameLibs/renderer/templates/bvh.template.blk b/prog/daNetGameLibs/renderer/templates/bvh.template.blk index 0ab084f8f..48e8c2968 100644 --- a/prog/daNetGameLibs/renderer/templates/bvh.template.blk +++ b/prog/daNetGameLibs/renderer/templates/bvh.template.blk @@ -6,5 +6,6 @@ bvh{ "denoiser_prepare_node:dabfg::NodeHandle"{} "rtsm_node:dabfg::NodeHandle"{} "rtr_node:dabfg::NodeHandle"{} + "rtao_node:dabfg::NodeHandle"{} "bvh__rendinst_visibility:RiGenVisibilityECS"{} } diff --git a/prog/daNetGameLibs/renderer/templates/render_settings.template.blk b/prog/daNetGameLibs/renderer/templates/render_settings.template.blk index 5ea6c7c59..bcfeb554c 100644 --- a/prog/daNetGameLibs/renderer/templates/render_settings.template.blk +++ b/prog/daNetGameLibs/renderer/templates/render_settings.template.blk @@ -23,6 +23,7 @@ render_settings { render_settings__motionBlur:b=false // graphics render_settings__dropletsOnScreen:b=true // graphics render_settings__snowflakesOnScreen:b=false // graphics + render_settings__mudOnScreen:b=false // graphics render_settings__forwardRendering:b=true // render feature render_settings__upscaleSamplingTex:b=true // render feature diff --git a/prog/daNetGameLibs/scope/render/aimDofNode.cpp b/prog/daNetGameLibs/scope/render/aimDofNode.cpp index 7ec91ac80..7e2ad4fb2 100644 --- a/prog/daNetGameLibs/scope/render/aimDofNode.cpp +++ b/prog/daNetGameLibs/scope/render/aimDofNode.cpp @@ -21,7 +21,6 @@ dabfg::NodeHandle makeAimDofPrepareNode() // TODO: This is a very ugly hack to fix dof being stuck when taking a screenshot static AimDofSettings firstIterationAimData; return dabfg::register_node("aim_dof_prepare_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { - registry.orderMeAfter("render_lens_optics_node"); registry.orderMeBefore("prepare_post_fx_node"); auto lensDofDepthHndl = registry diff --git a/prog/daNetGameLibs/scope/render/scopeAimRenderES.cpp.inl b/prog/daNetGameLibs/scope/render/scopeAimRenderES.cpp.inl index 19bd01966..13d79e52d 100644 --- a/prog/daNetGameLibs/scope/render/scopeAimRenderES.cpp.inl +++ b/prog/daNetGameLibs/scope/render/scopeAimRenderES.cpp.inl @@ -420,6 +420,7 @@ void render_lens_optics( if (!renderer_has_feature(FeatureRenderFlags::BLOOM)) // todo: fix dof render implementation dependencies on bloom fadingRenderer.render(); + ShaderGlobal::set_int(lens_detail_levelVarId, LENS_DETAIL_FULL); ShaderGlobal::set_int(lens_render_modeVarId, LENS_RENDER_OPTICS); Point3 params = ECS_GET_OR(scopeAimData.entityWithScopeLensEid, gunmod__distortionParams, Point3(0.8f, 0.7f, 0.07f)); ShaderGlobal::set_color4(lens_distortion_paramsVarId, Color4(params.x, params.y, params.z, 0.0f)); diff --git a/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.gen.es.cpp b/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.gen.es.cpp index bd9401554..d8c5a89c3 100644 --- a/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.gen.es.cpp +++ b/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.gen.es.cpp @@ -4,13 +4,14 @@ ECS_DEF_PULL_VAR(scopeFullDeferred); #include static constexpr ecs::ComponentDesc init_full_deferred_scope_rendering_es_event_handler_comps[] = { -//start of 12 rw components at [0] +//start of 13 rw components at [0] {ECS_HASH("scope__full_deferred__opaque_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__prepass_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__lens_mask_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__vrs_mask_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__cut_depth_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__crosshair_node"), ecs::ComponentTypeInfo()}, + {ECS_HASH("scope__full_deferred__render_lens_optics_prepass"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__render_lens_frame_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__render_lens_optics_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("aim_dof_prepare_node"), ecs::ComponentTypeInfo()}, @@ -28,6 +29,7 @@ static void init_full_deferred_scope_rendering_es_event_handler_all_events(const , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__vrs_mask_node", dabfg::NodeHandle) , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__cut_depth_node", dabfg::NodeHandle) , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__crosshair_node", dabfg::NodeHandle) + , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__render_lens_optics_prepass", dabfg::NodeHandle) , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__render_lens_frame_node", dabfg::NodeHandle) , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "scope__full_deferred__render_lens_optics_node", dabfg::NodeHandle) , ECS_RW_COMP(init_full_deferred_scope_rendering_es_event_handler_comps, "aim_dof_prepare_node", dabfg::NodeHandle) @@ -42,7 +44,7 @@ static ecs::EntitySystemDesc init_full_deferred_scope_rendering_es_event_handler "init_full_deferred_scope_rendering_es", "prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl", ecs::EntitySystemOps(nullptr, init_full_deferred_scope_rendering_es_event_handler_all_events), - make_span(init_full_deferred_scope_rendering_es_event_handler_comps+0, 12)/*rw*/, + make_span(init_full_deferred_scope_rendering_es_event_handler_comps+0, 13)/*rw*/, empty_span(), empty_span(), empty_span(), @@ -51,12 +53,13 @@ static ecs::EntitySystemDesc init_full_deferred_scope_rendering_es_event_handler ,"render"); static constexpr ecs::ComponentDesc full_deferred_scope_render_features_changed_es_event_handler_comps[] = { -//start of 12 rw components at [0] +//start of 13 rw components at [0] {ECS_HASH("scope__full_deferred__opaque_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__prepass_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__lens_mask_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__vrs_mask_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__cut_depth_node"), ecs::ComponentTypeInfo()}, + {ECS_HASH("scope__full_deferred__render_lens_optics_prepass"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__render_lens_frame_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__render_lens_optics_node"), ecs::ComponentTypeInfo()}, {ECS_HASH("scope__full_deferred__crosshair_node"), ecs::ComponentTypeInfo()}, @@ -74,6 +77,7 @@ static void full_deferred_scope_render_features_changed_es_event_handler_all_eve , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__lens_mask_node", dabfg::NodeHandle) , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__vrs_mask_node", dabfg::NodeHandle) , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__cut_depth_node", dabfg::NodeHandle) + , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__render_lens_optics_prepass", dabfg::NodeHandle) , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__render_lens_frame_node", dabfg::NodeHandle) , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__render_lens_optics_node", dabfg::NodeHandle) , ECS_RW_COMP(full_deferred_scope_render_features_changed_es_event_handler_comps, "scope__full_deferred__crosshair_node", dabfg::NodeHandle) @@ -89,7 +93,7 @@ static ecs::EntitySystemDesc full_deferred_scope_render_features_changed_es_even "full_deferred_scope_render_features_changed_es", "prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl", ecs::EntitySystemOps(nullptr, full_deferred_scope_render_features_changed_es_event_handler_all_events), - make_span(full_deferred_scope_render_features_changed_es_event_handler_comps+0, 12)/*rw*/, + make_span(full_deferred_scope_render_features_changed_es_event_handler_comps+0, 13)/*rw*/, empty_span(), empty_span(), empty_span(), diff --git a/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl b/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl index 9dcc617f1..2b076db62 100644 --- a/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl +++ b/prog/daNetGameLibs/scope/render/scopeFullDeferredES.cpp.inl @@ -16,6 +16,7 @@ static void make_full_deferred_scope_nodes(dabfg::NodeHandle &scopeFullDeferredO dabfg::NodeHandle &scopeFullDeferredLensMaskNode, dabfg::NodeHandle &scopeFullDeferredVrsMaskNode, dabfg::NodeHandle &scopeFullDeferredCutDepthNode, + dabfg::NodeHandle &scopeFullDeferredRenderLensOpticsPrepass, dabfg::NodeHandle &scopeFullDeferredRenderLensFrameNode, dabfg::NodeHandle &scopeFullDeferredRenderLensOpticsNode, dabfg::NodeHandle &scopeFullDeferredRenderCrossharNode, @@ -29,6 +30,7 @@ static void make_full_deferred_scope_nodes(dabfg::NodeHandle &scopeFullDeferredO scopeFullDeferredLensMaskNode = makeScopeLensMaskNode(); scopeFullDeferredVrsMaskNode = makeScopeVrsMaskNode(); scopeFullDeferredCutDepthNode = makeScopeCutDepthNode(); + scopeFullDeferredRenderLensOpticsPrepass = makeRenderOpticsPrepassNode(); scopeFullDeferredRenderLensFrameNode = makeRenderLensFrameNode(); scopeFullDeferredRenderLensOpticsNode = makeRenderLensOpticsNode(); scopeFullDeferredRenderCrossharNode = makeRenderCrosshairNode(); @@ -47,6 +49,7 @@ static void init_full_deferred_scope_rendering_es_event_handler(const ecs::Event dabfg::NodeHandle &scope__full_deferred__vrs_mask_node, dabfg::NodeHandle &scope__full_deferred__cut_depth_node, dabfg::NodeHandle &scope__full_deferred__crosshair_node, + dabfg::NodeHandle &scope__full_deferred__render_lens_optics_prepass, dabfg::NodeHandle &scope__full_deferred__render_lens_frame_node, dabfg::NodeHandle &scope__full_deferred__render_lens_optics_node, dabfg::NodeHandle &aim_dof_prepare_node, @@ -59,8 +62,9 @@ static void init_full_deferred_scope_rendering_es_event_handler(const ecs::Event make_full_deferred_scope_nodes(scope__full_deferred__opaque_node, scope__full_deferred__prepass_node, scope__full_deferred__lens_mask_node, scope__full_deferred__vrs_mask_node, scope__full_deferred__cut_depth_node, - scope__full_deferred__crosshair_node, scope__full_deferred__render_lens_frame_node, scope__full_deferred__render_lens_optics_node, - aim_dof_prepare_node, aim_dof_restore_node, setup_scope_aim_rendering_data_node, setup_aim_rendering_data_node); + scope__full_deferred__crosshair_node, scope__full_deferred__render_lens_optics_prepass, + scope__full_deferred__render_lens_frame_node, scope__full_deferred__render_lens_optics_node, aim_dof_prepare_node, + aim_dof_restore_node, setup_scope_aim_rendering_data_node, setup_aim_rendering_data_node); } ECS_TAG(render) @@ -71,6 +75,7 @@ static void full_deferred_scope_render_features_changed_es_event_handler(const e dabfg::NodeHandle &scope__full_deferred__lens_mask_node, dabfg::NodeHandle &scope__full_deferred__vrs_mask_node, dabfg::NodeHandle &scope__full_deferred__cut_depth_node, + dabfg::NodeHandle &scope__full_deferred__render_lens_optics_prepass, dabfg::NodeHandle &scope__full_deferred__render_lens_frame_node, dabfg::NodeHandle &scope__full_deferred__render_lens_optics_node, dabfg::NodeHandle &scope__full_deferred__crosshair_node, @@ -90,6 +95,7 @@ static void full_deferred_scope_render_features_changed_es_event_handler(const e scope__full_deferred__lens_mask_node = {}; scope__full_deferred__vrs_mask_node = {}; scope__full_deferred__cut_depth_node = {}; + scope__full_deferred__render_lens_optics_prepass = {}; scope__full_deferred__render_lens_frame_node = {}; scope__full_deferred__render_lens_optics_node = {}; scope__full_deferred__crosshair_node = {}; @@ -102,6 +108,7 @@ static void full_deferred_scope_render_features_changed_es_event_handler(const e make_full_deferred_scope_nodes(scope__full_deferred__opaque_node, scope__full_deferred__prepass_node, scope__full_deferred__lens_mask_node, scope__full_deferred__vrs_mask_node, scope__full_deferred__cut_depth_node, - scope__full_deferred__render_lens_frame_node, scope__full_deferred__render_lens_optics_node, scope__full_deferred__crosshair_node, - aim_dof_prepare_node, aim_dof_restore_node, setup_scope_aim_rendering_data_node, setup_aim_rendering_data_node); + scope__full_deferred__render_lens_optics_prepass, scope__full_deferred__render_lens_frame_node, + scope__full_deferred__render_lens_optics_node, scope__full_deferred__crosshair_node, aim_dof_prepare_node, aim_dof_restore_node, + setup_scope_aim_rendering_data_node, setup_aim_rendering_data_node); } diff --git a/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.cpp b/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.cpp index e28790c3f..52e3f5c15 100644 --- a/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.cpp +++ b/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.cpp @@ -16,6 +16,7 @@ extern ConVarT vrs_dof; +#define SCOPE_LENS_VARS VAR(screen_pos_to_texcoord) #define SCOPE_VRS_MASK_VARS \ VAR(scope_vrs_mask_rate) \ @@ -24,15 +25,15 @@ extern ConVarT vrs_dof; #define VAR(a) static ShaderVariableInfo a##VarId(#a, true); SCOPE_VRS_MASK_VARS +SCOPE_LENS_VARS #undef VAR dabfg::NodeHandle makeScopePrepassNode() { auto ns = dabfg::root() / "opaque" / "closeups"; - return ns.registerNode("scope_prepass_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { + return ns.registerNode("scope_prepass_opaque_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.requestState().setFrameBlock("global_frame"); - render_to_gbuffer_prepass(registry); auto aimRenderDataHndl = registry.readBlob("aim_render_data").handle(); @@ -197,13 +198,12 @@ dabfg::NodeHandle makeRenderLensFrameNode() return dabfg::register_node("render_lens_frame_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.requestState().allowWireframe().setFrameBlock("global_frame"); registry.requestRenderPass().color({registry.createTexture2d("lens_frame_target", dabfg::History::No, - {get_frame_render_target_format() | TEXCF_RTARGET, registry.getResolution<2>("main_view")})}); + {get_frame_render_target_format() | TEXCF_RTARGET, registry.getResolution<2>("post_fx")})}); - registry.readTexture("depth_for_transparency").atStage(dabfg::Stage::PS).bindToShaderVar("depth_gbuf"); registry.readBlob("current_camera").bindAsView<&CameraParams::viewRotTm>().bindAsProj<&CameraParams::jitterProjTm>(); auto frameHndl = - registry.readTexture("target_for_transparency").atStage(dabfg::Stage::PS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + registry.readTexture("frame_after_distortion").atStage(dabfg::Stage::PS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); auto lensSourceHndl = registry.readTexture("lens_source_target").atStage(dabfg::Stage::PS).useAs(dabfg::Usage::SHADER_RESOURCE).optional().handle(); @@ -211,27 +211,77 @@ dabfg::NodeHandle makeRenderLensFrameNode() auto scopeAimRenderDataHndl = registry.readBlob("scope_aim_render_data").handle(); auto strmCtxHndl = registry.readBlob("tex_ctx").handle(); - return [aimRenderDataHndl, scopeAimRenderDataHndl, frameHndl, lensSourceHndl, strmCtxHndl]() { + auto postfxResolution = registry.getResolution<2>("post_fx"); + + return [postfxResolution, aimRenderDataHndl, scopeAimRenderDataHndl, frameHndl, lensSourceHndl, strmCtxHndl]() { const ScopeAimRenderingData &scopeAimRenderData = scopeAimRenderDataHndl.ref(); if (!aimRenderDataHndl.ref().lensRenderEnabled) return; - if (scopeAimRenderData.nightVision) - d3d::set_depth(nullptr, DepthAccess::RW); + const auto &res = postfxResolution.get(); + ShaderGlobal::set_color4(screen_pos_to_texcoordVarId, 1.0f / res.x, 1.0f / res.y, 0, 0); render_lens_frame(scopeAimRenderData, frameHndl.d3dResId(), lensSourceHndl.d3dResId(), strmCtxHndl.ref()); }; }); } +dabfg::NodeHandle makeRenderOpticsPrepassNode() +{ + return dabfg::register_node("scope_prepass_optics_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { + registry.requestState().setFrameBlock("global_frame"); + + dabfg::Texture2dCreateInfo cInfo; + cInfo.creationFlags = get_gbuffer_depth_format() | TEXCF_RTARGET; + cInfo.resolution = registry.getResolution<2>("post_fx"); + auto depthForOptics = registry.createTexture2d("aim_scope_optics_depth", dabfg::History::No, cInfo); + registry.requestRenderPass().depthRw(depthForOptics).clear(depthForOptics, make_clear_value(0.0f, 0.0f)); + + auto aimRenderDataHndl = registry.readBlob("aim_render_data").handle(); + auto scopeAimRenderDataHndl = registry.readBlob("scope_aim_render_data").handle(); + auto strmCtxHndl = registry.readBlob("tex_ctx").handle(); + + registry.read("current_camera") + .blob() + .bindAsProj<&CameraParams::jitterProjTm>() + .bindAsView<&CameraParams::viewRotTm>(); + + auto hasOpticsPrepass = registry.createBlob("has_aim_scope_optics_prepass", dabfg::History::No).handle(); + auto mainViewRes = registry.getResolution<2>("main_view"); + auto postfxRes = registry.getResolution<2>("post_fx"); + + return [hasOpticsPrepass, mainViewRes, postfxRes, aimRenderDataHndl, scopeAimRenderDataHndl, strmCtxHndl]() { + if (!aimRenderDataHndl.ref().lensRenderEnabled) + return; + + if (mainViewRes.get() == postfxRes.get()) + { + hasOpticsPrepass.ref() = false; + return; + } + + render_scope_lens_prepass(scopeAimRenderDataHndl.ref(), strmCtxHndl.ref()); + hasOpticsPrepass.ref() = true; + }; + }); +} + dabfg::NodeHandle makeRenderLensOpticsNode() { return dabfg::register_node("render_lens_optics_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.requestState().allowWireframe().setFrameBlock("global_frame"); - registry.requestRenderPass() - .color({"target_before_motion_blur"}) - .depthRoAndBindToShaderVars("depth_for_transparency", {"depth_gbuf"}); - registry.read("gbuf_sampler").blob().bindToShaderVar("depth_gbuf_samplerstate"); + + auto hasOpticsPrepass = registry.readBlob("has_aim_scope_optics_prepass").handle(); + auto opticsPrepassDepthHndl = registry.modifyTexture("aim_scope_optics_depth") + .atStage(dabfg::Stage::PRE_RASTER) + .useAs(dabfg::Usage::DEPTH_ATTACHMENT) + .handle(); + auto depthAfterTransparentsHndl = registry.readTexture("depth_after_transparency") + .atStage(dabfg::Stage::PRE_RASTER) + .useAs(dabfg::Usage::DEPTH_ATTACHMENT) + .handle(); + auto frameHndl = + registry.modifyTexture("frame_for_postfx").atStage(dabfg::Stage::POST_RASTER).useAs(dabfg::Usage::COLOR_ATTACHMENT).handle(); registry.readTexture("lens_frame_target").atStage(dabfg::Stage::PS).bindToShaderVar("lens_frame_tex"); registry.readBlob("current_camera").bindAsView<&CameraParams::viewRotTm>().bindAsProj<&CameraParams::jitterProjTm>(); @@ -240,14 +290,18 @@ dabfg::NodeHandle makeRenderLensOpticsNode() auto scopeAimRenderDataHndl = registry.readBlob("scope_aim_render_data").handle(); auto strmCtxHndl = registry.readBlob("tex_ctx").handle(); - return [aimRenderDataHndl, scopeAimRenderDataHndl, strmCtxHndl, fadingRenderer = PostFxRenderer("solid_color_shader")]() { + return [hasOpticsPrepass, opticsPrepassDepthHndl, depthAfterTransparentsHndl, frameHndl, aimRenderDataHndl, scopeAimRenderDataHndl, + strmCtxHndl, fadingRenderer = PostFxRenderer("solid_color_shader")]() { if (!aimRenderDataHndl.ref().lensRenderEnabled) return; - const ScopeAimRenderingData &scopeAimRenderData = scopeAimRenderDataHndl.ref(); - if (scopeAimRenderData.nightVision) - d3d::set_depth(nullptr, DepthAccess::RW); + d3d::set_render_target(frameHndl.get(), 0); + if (hasOpticsPrepass.ref()) + d3d::set_depth(opticsPrepassDepthHndl.view().getTex2D(), DepthAccess::RW); + else + d3d::set_depth(depthAfterTransparentsHndl.view().getTex2D(), DepthAccess::SampledRO); + const ScopeAimRenderingData &scopeAimRenderData = scopeAimRenderDataHndl.ref(); render_lens_optics(scopeAimRenderData, strmCtxHndl.ref(), fadingRenderer); }; }); @@ -255,18 +309,14 @@ dabfg::NodeHandle makeRenderLensOpticsNode() dabfg::NodeHandle makeRenderCrosshairNode() { - auto ns = dabfg::root() / "before_ui"; - return ns.registerNode("render_scope_crosshair_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { + return dabfg::register_node("render_scope_crosshair_node", DABFG_PP_NODE_SRC, [](dabfg::Registry registry) { registry.requestState().allowWireframe().setFrameBlock("global_frame"); - registry.requestRenderPass().color({"frame"}); + registry.requestRenderPass().color({"lens_frame_target"}); auto aimRenderDataHndl = registry.readBlob("aim_render_data").handle(); auto scopeAimRenderDataHndl = registry.readBlob("scope_aim_render_data").handle(); auto strmCtxHndl = registry.readBlob("tex_ctx").handle(); - auto closeupsNs = registry.root() / "opaque" / "closeups"; - closeupsNs.readTexture("scope_lens_mask").atStage(dabfg::Stage::POST_RASTER).bindToShaderVar("scope_lens_mask").optional(); - registry.readBlob("current_camera") .bindAsView<&CameraParams::viewRotTm>() .bindAsProj<&CameraParams::noJitterProjTm>(); diff --git a/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.h b/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.h index 9a0474092..557471743 100644 --- a/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.h +++ b/prog/daNetGameLibs/scope/render/scopeFullDeferredNodes.h @@ -10,6 +10,7 @@ dabfg::NodeHandle makeScopeVrsMaskNode(); dabfg::NodeHandle makeScopeCutDepthNode(); dabfg::NodeHandle makeScopeTargetRenameNode(); +dabfg::NodeHandle makeRenderOpticsPrepassNode(); dabfg::NodeHandle makeRenderLensFrameNode(); dabfg::NodeHandle makeRenderLensOpticsNode(); dabfg::NodeHandle makeRenderCrosshairNode(); diff --git a/prog/daNetGameLibs/scope/shaders/scope_lens.dshl b/prog/daNetGameLibs/scope/shaders/scope_lens.dshl index 3776d53e4..6ce467d66 100644 --- a/prog/daNetGameLibs/scope/shaders/scope_lens.dshl +++ b/prog/daNetGameLibs/scope/shaders/scope_lens.dshl @@ -23,6 +23,8 @@ float4 scope_lens_local_x = (1, 0, 0, 0); float4 scope_lens_local_y = (0, 1, 0, 0); float4 scope_lens_local_z = (0, 0, 1, 0); +float lens_zoom_factor = 1.0; +interval lens_zoom_factor:has_zoom <1.0, no_zoom; texture lens_frame_tex; texture scope_lens_mask; @@ -252,10 +254,12 @@ shader scope_lens, dynamic_crosshair SET_DRAW_CALL_ID(GET_DRAW_ID(input) & MATERIAL_OFFSET_MASK); #endif + ##if mobile_render != off float4 screenPos = GET_SCREEN_POS(input.pos); float maskValue = tex2D(scope_lens_mask, screenPos.xy * screen_pos_to_texcoord).r; if (maskValue == 0.0) discard; + ##endif half4 diffuseColor = tex2DBindless(get_diffuse_tex(), input.texcoord); diffuseColor.a *= get_transparency_mul(); @@ -332,10 +336,22 @@ shader scope_lens, dynamic_crosshair else if (lens_render_mode == render_frame) { (ps) { - screen_pos_to_texcoord@f2 = (screen_pos_to_texcoord.x, screen_pos_to_texcoord.y, 0, 0); + lens_zoom_factor@f1 = lens_zoom_factor; + screen_size@f2 = (1.0 / screen_pos_to_texcoord.x, 1.0 / screen_pos_to_texcoord.y) + inv_screen_size@f2 = (screen_pos_to_texcoord.x, screen_pos_to_texcoord.y) frame_tex@smp2d = lens_frame_tex; } hlsl(ps) { + #include "tex2DCatmullRom.hlsl" + + float2 apply_zoom(float2 uv) + { + uv = uv * 2.0 - 1.0; + uv *= lens_zoom_factor; + uv = uv * 0.5 + 0.5; + return uv; + } + float4 scope_lens_ps(VsOutput input HW_USE_SCREEN_POS INPUT_VFACE) : SV_Target0 { #if SET_UP_MULTIDRAW @@ -344,7 +360,16 @@ shader scope_lens, dynamic_crosshair #endif float4 screenPos = GET_SCREEN_POS(input.pos); - half3 frameColor = tex2D(frame_tex, screenPos.xy * screen_pos_to_texcoord).rgb; + float2 uv = screenPos.xy * inv_screen_size; + + float3 frameColor; + ##if lens_zoom_factor == has_zoom + uv = apply_zoom(uv); + frameColor = sample_texture_catmull_rom(frame_tex, frame_tex_samplerstate, uv, screen_size, inv_screen_size).rgb; + ##else + frameColor = tex2D(frame_tex, uv).rgb; + ##endif + return float4(frameColor, 1); } } @@ -582,7 +607,6 @@ shader scope_reticle (ps) { scope_reticle_tex@smp2d = scope_reticle_tex; - scope_lens_mask@smp2d = scope_lens_mask; } hlsl { @@ -623,11 +647,6 @@ shader scope_reticle { float4 scope_reticle_ps(VsOutput input HW_USE_SCREEN_POS) : SV_Target0 { - float2 tc = GET_SCREEN_POS(input.pos).xy; - float maskValue = texelFetch(scope_lens_mask, tc, 0).r; - if (maskValue == 0.0) - discard; - float alpha = tex2D(scope_reticle_tex, input.texcoord).a; return float4(0, 0, 0, alpha); } diff --git a/prog/daNetGameLibs/scope/templates/scope_renderer.template.blk b/prog/daNetGameLibs/scope/templates/scope_renderer.template.blk index d0f47a248..1921ac9b8 100644 --- a/prog/daNetGameLibs/scope/templates/scope_renderer.template.blk +++ b/prog/daNetGameLibs/scope/templates/scope_renderer.template.blk @@ -9,6 +9,7 @@ scope_full_deferred_renderer{ "scope__full_deferred__cut_depth_node:dabfg::NodeHandle"{} "scope__full_deferred__crosshair_node:dabfg::NodeHandle"{} + "scope__full_deferred__render_lens_optics_prepass:dabfg::NodeHandle"{} "scope__full_deferred__render_lens_frame_node:dabfg::NodeHandle"{} "scope__full_deferred__render_lens_optics_node:dabfg::NodeHandle"{} diff --git a/prog/daNetGameLibs/sound/environment_sounds/es/sound_field_debug.das b/prog/daNetGameLibs/sound/environment_sounds/es/sound_field_debug.das index bef47eec3..74b5cad32 100644 --- a/prog/daNetGameLibs/sound/environment_sounds/es/sound_field_debug.das +++ b/prog/daNetGameLibs/sound/environment_sounds/es/sound_field_debug.das @@ -11,7 +11,7 @@ require environment_sounds.modules.sound_field_common let MAX_RANGE = 500. -let BIOME_COLORS = [[ uint[] 0x00ffff00; 0x000000ff; 0x00ff0040; 0x0040ffff ]] +let BIOME_COLORS = [[uint[] 0x00ffff00; 0x000000ff; 0x00ff0040; 0x0040ffff]] def biome_color(idx : uint) diff --git a/prog/daNetGameLibs/sound/sound_utils/es/managed_sound_control.das b/prog/daNetGameLibs/sound/sound_utils/es/managed_sound_control.das index ac9dbf3ae..d9108c1fa 100644 --- a/prog/daNetGameLibs/sound/sound_utils/es/managed_sound_control.das +++ b/prog/daNetGameLibs/sound/sound_utils/es/managed_sound_control.das @@ -6,7 +6,6 @@ require sound_utils.modules.managed_sound_control_common [es(tag=sound, on_event=ParallelUpdateFrameDelayed, REQUIRE=vehicleManageSoundControl, after=(animchar_before_render_es, sound_begin_update_es, sound_control_update), before=sound_end_update_es)] def vehicle_managed_sound_control(evt : Event; - managed_sound_control__groupMask : uint; managed_sound_control__maxInstances : int; managed_sound_control__cooldown : float; var managed_sound_control__entities : EidList&; @@ -17,11 +16,10 @@ def vehicle_managed_sound_control(evt : Event; query() <| $ [es(REQUIRE=vehicleManageSoundControl)] (eid : EntityId; sound_control__inRange : bool; - var sound_control__enabledGroups : uint&; + var sound_control__allowSound : bool&; managed_sound__nextTimeToAllow : float; transform : float3x4) managed_sound_control_impl(sound_control__inRange, - managed_sound_control__groupMask, managed_sound_control__maxInstances, managed_sound_control__cooldown, managed_sound_control__entities, @@ -29,7 +27,7 @@ def vehicle_managed_sound_control(evt : Event; listener, curTime, eid, - sound_control__enabledGroups, + sound_control__allowSound, managed_sound__nextTimeToAllow, transform) @@ -37,7 +35,6 @@ def vehicle_managed_sound_control(evt : Event; [es(tag=sound, on_event=ParallelUpdateFrameDelayed, REQUIRE=sfxManageSoundControl, after=(animchar_before_render_es, sound_begin_update_es, sound_control_update), before=sound_end_update_es)] def sfx_managed_sound_control(evt : Event; - managed_sound_control__groupMask : uint; managed_sound_control__maxInstances : int; managed_sound_control__cooldown : float; var managed_sound_control__entities : EidList&; @@ -48,11 +45,10 @@ def sfx_managed_sound_control(evt : Event; query() <| $ [es(REQUIRE=sfxManageSoundControl)] (eid : EntityId; sound_control__inRange : bool; - var sound_control__enabledGroups : uint&; + var sound_control__allowSound : bool&; managed_sound__nextTimeToAllow : float; transform : float3x4) managed_sound_control_impl(sound_control__inRange, - managed_sound_control__groupMask, managed_sound_control__maxInstances, managed_sound_control__cooldown, managed_sound_control__entities, @@ -60,7 +56,7 @@ def sfx_managed_sound_control(evt : Event; listener, curTime, eid, - sound_control__enabledGroups, + sound_control__allowSound, managed_sound__nextTimeToAllow, transform) diff --git a/prog/daNetGameLibs/sound/sound_utils/es/sound_control.das b/prog/daNetGameLibs/sound/sound_utils/es/sound_control.das index d87247027..1fd32d903 100644 --- a/prog/daNetGameLibs/sound/sound_utils/es/sound_control.das +++ b/prog/daNetGameLibs/sound/sound_utils/es/sound_control.das @@ -29,11 +29,7 @@ def sound_control_update(evt : Event) query() <| $ [es(REQUIRE_NOT=disableSoundControl)] (eid : EntityId; sound_banks_state__isPresetLoaded : bool; - sound_control__allowSound : bool; - sound_control__enabledGroups : uint; - sound_control__needGroupsMask : uint; - sound_control__range : float; sound_control__subtemplate : string; var sound_control__inRange : bool&; @@ -44,7 +40,7 @@ def sound_control_update(evt : Event) sound_control__inRange = is_watched_sound || (sound_control__inRange ? (distance_sq(listener, transform[3]) < square(sound_control__range)) : (distance_sq(listener, transform[3]) < square(sound_control__range * 0.9))) - sound_enable(sound_control__inRange && sound_banks_state__isPresetLoaded && sound_control__allowSound && ((sound_control__enabledGroups & sound_control__needGroupsMask) == sound_control__needGroupsMask), + sound_enable(sound_control__inRange && sound_banks_state__isPresetLoaded && sound_control__allowSound, sound_control__soundEnabled, sound_control__subtemplate, eid) diff --git a/prog/daNetGameLibs/sound/sound_utils/modules/managed_sound_control_common.das b/prog/daNetGameLibs/sound/sound_utils/modules/managed_sound_control_common.das index 985f57091..b4d72fb78 100644 --- a/prog/daNetGameLibs/sound/sound_utils/modules/managed_sound_control_common.das +++ b/prog/daNetGameLibs/sound/sound_utils/modules/managed_sound_control_common.das @@ -5,7 +5,6 @@ require ecs.common def managed_sound_control_impl(is_in_range : bool; - managed_sound_control__groupMask : uint; managed_sound_control__maxInstances : int; managed_sound_control__cooldown : float; var managed_sound_control__entities : EidList&; @@ -15,18 +14,18 @@ def managed_sound_control_impl(is_in_range : bool; curTime : float; eid : EntityId; - var sound_control__enabledGroups : uint&; + var sound_control__allowSound : bool&; managed_sound__nextTimeToAllow : float; transform : float3x4) if !is_in_range - sound_control__enabledGroups &= ~managed_sound_control__groupMask + sound_control__allowSound = false return let pos = transform[3] let idx = find_index(managed_sound_control__entities, eid) if idx >= 0 - sound_control__enabledGroups |= managed_sound_control__groupMask + sound_control__allowSound = true managed_sound_control__positions[idx] = pos return @@ -34,7 +33,7 @@ def managed_sound_control_impl(is_in_range : bool; return if length(managed_sound_control__entities) < managed_sound_control__maxInstances - sound_control__enabledGroups |= managed_sound_control__groupMask + sound_control__allowSound = true managed_sound_control__entities |> push(eid) managed_sound_control__positions |> push(pos) return @@ -54,16 +53,16 @@ def managed_sound_control_impl(is_in_range : bool; furthestIdx = i if furthestIdx >= 0 - query(managed_sound_control__entities[furthestIdx]) <| $ [es] (var sound_control__enabledGroups : uint&; + query(managed_sound_control__entities[furthestIdx]) <| $ [es] (var sound_control__allowSound : bool&; var managed_sound__nextTimeToAllow : float&) - sound_control__enabledGroups &= ~managed_sound_control__groupMask + sound_control__allowSound = false managed_sound__nextTimeToAllow = curTime + managed_sound_control__cooldown - sound_control__enabledGroups |= managed_sound_control__groupMask + sound_control__allowSound = true managed_sound_control__entities[furthestIdx] = eid managed_sound_control__positions[furthestIdx] = pos else - sound_control__enabledGroups &= ~managed_sound_control__groupMask + sound_control__allowSound = false def remove_managed_sound(eid : EntityId) diff --git a/prog/daNetGameLibs/sound/sound_utils/templates/sound_utils.template.blk b/prog/daNetGameLibs/sound/sound_utils/templates/sound_utils.template.blk index ab0e1e6b0..b39175f42 100644 --- a/prog/daNetGameLibs/sound/sound_utils/templates/sound_utils.template.blk +++ b/prog/daNetGameLibs/sound/sound_utils/templates/sound_utils.template.blk @@ -49,7 +49,6 @@ watched_by_player_sound{ sound_control{ _use:t="sound_banks_state" _tracked:t="sound_control__soundEnabled" - _tracked:t="sound_control__enabledGroups" _group{ _tags:t="sound" @@ -58,8 +57,6 @@ sound_control{ sound_control__soundEnabled:b=no // setup sound_control__allowSound:b=yes - "sound_control__enabledGroups:u32" { value:i=1; } - "sound_control__needGroupsMask:u32" { value:i=1; } sound_control__subtemplate:t="" } } @@ -102,7 +99,6 @@ base_managed_sound_control{ _tags:t="sound" "managed_sound_control__entities:list"{} "managed_sound_control__positions:list"{} - "managed_sound_control__groupMask:u32" { value:i=1; } } // setup managed_sound_control__maxInstances:i=3 @@ -116,7 +112,7 @@ base_managed_sound{ } _group{ _tags:t="sound" - "sound_control__enabledGroups:u32" { value:i=0; } // disabled on appeared + sound_control__allowSound:b=no // disabled on appeared "managedSound:tag"{} } } diff --git a/prog/dagorInclude/3d/dag_amdFsr.h b/prog/dagorInclude/3d/dag_amdFsr.h index 4ba72f584..19c1b2916 100644 --- a/prog/dagorInclude/3d/dag_amdFsr.h +++ b/prog/dagorInclude/3d/dag_amdFsr.h @@ -118,6 +118,8 @@ struct FSR // To be called by the dagor drivers virtual bool doApplyUpscaling(const UpscalingPlatformArgs &args, void *command_list) const = 0; + + virtual String getVersionString() const { return String(8, "Unknown"); } }; FSR *createFSR(); diff --git a/prog/dagorInclude/3d/dag_multidrawContext.h b/prog/dagorInclude/3d/dag_multidrawContext.h index c41898fd1..8f9155c39 100644 --- a/prog/dagorInclude/3d/dag_multidrawContext.h +++ b/prog/dagorInclude/3d/dag_multidrawContext.h @@ -12,6 +12,7 @@ #include <3d/dag_resPtr.h> #include <3d/dag_ringDynBuf.h> #include +#include <3d/dag_multidrawInfo.h> // This is workaround for OOM on xbox https://youtrack.gaijin.team/issue/EEX-4827 @@ -58,42 +59,6 @@ class MultidrawContext */ uint32_t actualStart = 0; - /** - * @brief Extended draw call arguments structure. - * - * This structure is used for platforms that pass draw call id/per draw parameters using per draw root constants. - * Currently it is used only for DX12. - */ - struct ExtendedDrawIndexedIndirectArgs - { - uint32_t drawcallId; - DrawIndexedIndirectArgs args; - }; - - /** - * @brief Checks if extended draw call arguments structure is used. - */ -#if _TARGET_PC_WIN -#define CONSTEXPR_EXT_MULTIDRAW - static inline uint8_t bytesCountPerDrawcall = 0; - static bool usesExtendedMultiDrawStruct() - { - if (DAGOR_UNLIKELY(!bytesCountPerDrawcall)) - bytesCountPerDrawcall = - d3d::get_driver_code().is(d3d::dx12) ? sizeof(ExtendedDrawIndexedIndirectArgs) : sizeof(DrawIndexedIndirectArgs); - static_assert(sizeof(ExtendedDrawIndexedIndirectArgs) != sizeof(DrawIndexedIndirectArgs)); - return bytesCountPerDrawcall == sizeof(ExtendedDrawIndexedIndirectArgs); - } -#elif _TARGET_XBOX -#define CONSTEXPR_EXT_MULTIDRAW constexpr - static constexpr uint8_t bytesCountPerDrawcall = sizeof(ExtendedDrawIndexedIndirectArgs); - static constexpr bool usesExtendedMultiDrawStruct() { return true; } // DX12 -#else -#define CONSTEXPR_EXT_MULTIDRAW constexpr - static constexpr uint8_t bytesCountPerDrawcall = sizeof(DrawIndexedIndirectArgs); - static constexpr bool usesExtendedMultiDrawStruct() { return false; } -#endif - /** * @brief Returns name for per draw parameters buffer. */ @@ -176,10 +141,10 @@ class MultidrawContext return; #if USE_STAGING_MULTIDRAW_BUF d3d::multi_draw_indexed_indirect(primitive_type, context->multidrawArguments.getBuf(), drawcalls_count, - context->bytesCountPerDrawcall, first_drawcall * context->bytesCountPerDrawcall); + MultiDrawInfo::bytesCountPerDrawcall, first_drawcall * MultiDrawInfo::bytesCountPerDrawcall); #else d3d::multi_draw_indexed_indirect(primitive_type, context->multidrawArguments.getRenderBuf(), drawcalls_count, - context->bytesCountPerDrawcall, (first_drawcall + context->actualStart) * context->bytesCountPerDrawcall); + MultiDrawInfo::bytesCountPerDrawcall, (first_drawcall + context->actualStart) * MultiDrawInfo::bytesCountPerDrawcall); #endif } }; @@ -196,7 +161,7 @@ class MultidrawContext template MultidrawRenderExecutor fillBuffers(uint32_t drawcalls_count, const T &set_cb) { - CONSTEXPR_EXT_MULTIDRAW bool extMultiDraw = usesExtendedMultiDrawStruct(); + CONSTEXPR_EXT_MULTIDRAW bool extMultiDraw = MultiDrawInfo::usesExtendedMultiDrawStruct(); #if USE_STAGING_MULTIDRAW_BUF RingDynamicSB &multidrawArgsBuf = multidrawArgsStagingBuffer; @@ -209,15 +174,15 @@ class MultidrawContext allocatedDrawcallsInBuffer = (drawcalls_count + CHUNK_SIZE - 1) / CHUNK_SIZE * CHUNK_SIZE; #if USE_STAGING_MULTIDRAW_BUF multidrawArguments.close(); - multidrawArguments = dag::create_sbuffer(sizeof(uint32_t), bytesCountPerDrawcall * allocatedDrawcallsInBuffer / sizeof(uint32_t), - SBCF_INDIRECT, 0, name.c_str()); + multidrawArguments = dag::create_sbuffer(sizeof(uint32_t), + MultiDrawInfo::bytesCountPerDrawcall * allocatedDrawcallsInBuffer / sizeof(uint32_t), SBCF_INDIRECT, 0, name.c_str()); multidrawArgsStagingBuffer.close(); - multidrawArgsStagingBuffer.init(allocatedDrawcallsInBuffer, bytesCountPerDrawcall, sizeof(uint32_t), SBCF_DYNAMIC, 0, - getMultidrawStagingBufferName().c_str()); + multidrawArgsStagingBuffer.init(allocatedDrawcallsInBuffer, MultiDrawInfo::bytesCountPerDrawcall, sizeof(uint32_t), SBCF_DYNAMIC, + 0, getMultidrawStagingBufferName().c_str()); #else multidrawArguments.close(); - multidrawArguments.init(allocatedDrawcallsInBuffer, bytesCountPerDrawcall, sizeof(uint32_t), SBCF_INDIRECT | SBCF_DYNAMIC, 0, - name.c_str()); + multidrawArguments.init(allocatedDrawcallsInBuffer, MultiDrawInfo::bytesCountPerDrawcall, sizeof(uint32_t), + SBCF_INDIRECT | SBCF_DYNAMIC, 0, name.c_str()); #endif if (needPerDrawParamsBuffer()) { @@ -269,8 +234,8 @@ class MultidrawContext #if USE_STAGING_MULTIDRAW_BUF extMultiDraw ? eastl::get<2>(multidrawArgs).close() : eastl::get<1>(multidrawArgs).close(); - multidrawArgsStagingBuffer.getRenderBuf()->copyTo(multidrawArguments.getBuf(), 0, actualStart * bytesCountPerDrawcall, - drawcalls_count * bytesCountPerDrawcall); + multidrawArgsStagingBuffer.getRenderBuf()->copyTo(multidrawArguments.getBuf(), 0, + actualStart * MultiDrawInfo::bytesCountPerDrawcall, drawcalls_count * MultiDrawInfo::bytesCountPerDrawcall); #endif return MultidrawRenderExecutor(this); diff --git a/prog/dagorInclude/3d/dag_multidrawInfo.h b/prog/dagorInclude/3d/dag_multidrawInfo.h new file mode 100644 index 000000000..7dda8f172 --- /dev/null +++ b/prog/dagorInclude/3d/dag_multidrawInfo.h @@ -0,0 +1,46 @@ +// +// Dagor Engine 6.5 +// Copyright (C) Gaijin Games KFT. All rights reserved. +// +#pragma once + +#include + +/** + * @brief Extended draw call arguments structure. + * + * This structure is used for platforms that pass draw call id/per draw parameters using per draw root constants. + * Currently it is used only for DX12. + */ +struct ExtendedDrawIndexedIndirectArgs +{ + uint32_t drawcallId; + DrawIndexedIndirectArgs args; +}; + +struct MultiDrawInfo +{ +/** + * @brief Checks if extended draw call arguments structure is used. + */ +#if _TARGET_PC_WIN +#define CONSTEXPR_EXT_MULTIDRAW + static inline uint8_t bytesCountPerDrawcall = 0; + static bool usesExtendedMultiDrawStruct() + { + if (DAGOR_UNLIKELY(!bytesCountPerDrawcall)) + bytesCountPerDrawcall = + d3d::get_driver_code().is(d3d::dx12) ? sizeof(ExtendedDrawIndexedIndirectArgs) : sizeof(DrawIndexedIndirectArgs); + static_assert(sizeof(ExtendedDrawIndexedIndirectArgs) != sizeof(DrawIndexedIndirectArgs)); + return bytesCountPerDrawcall == sizeof(ExtendedDrawIndexedIndirectArgs); + } +#elif _TARGET_XBOX +#define CONSTEXPR_EXT_MULTIDRAW constexpr + static constexpr uint8_t bytesCountPerDrawcall = sizeof(ExtendedDrawIndexedIndirectArgs); + static constexpr bool usesExtendedMultiDrawStruct() { return true; } // DX12 +#else +#define CONSTEXPR_EXT_MULTIDRAW constexpr + static constexpr uint8_t bytesCountPerDrawcall = sizeof(DrawIndexedIndirectArgs); + static constexpr bool usesExtendedMultiDrawStruct() { return false; } +#endif +}; diff --git a/prog/dagorInclude/3d/dag_nvFeatures.h b/prog/dagorInclude/3d/dag_nvFeatures.h index d83a60b75..c54f506e4 100644 --- a/prog/dagorInclude/3d/dag_nvFeatures.h +++ b/prog/dagorInclude/3d/dag_nvFeatures.h @@ -8,8 +8,10 @@ #include #include <3d/dag_latencyTypes.h> #include +#include #include +#include namespace nv { @@ -147,6 +149,7 @@ struct DLSS virtual bool isFrameGenerationEnabled() const = 0; virtual unsigned getActualFramesPresented() const = 0; virtual void setDlssGSuppressed(bool supressed) = 0; + virtual dag::Expected getDlssVersion() const = 0; }; struct Reflex diff --git a/prog/dagorInclude/3d/dag_render.h b/prog/dagorInclude/3d/dag_render.h index 02930f54b..d38022306 100644 --- a/prog/dagorInclude/3d/dag_render.h +++ b/prog/dagorInclude/3d/dag_render.h @@ -10,7 +10,6 @@ extern bool grs_draw_wire; // compute and set gamma correction -void set_gamma(float p); void set_gamma_shadervar(float p); // returns current gamma diff --git a/prog/dagorInclude/anim/dag_animStateHolder.h b/prog/dagorInclude/anim/dag_animStateHolder.h index 661c6a195..87f185ca0 100644 --- a/prog/dagorInclude/anim/dag_animStateHolder.h +++ b/prog/dagorInclude/anim/dag_animStateHolder.h @@ -96,7 +96,7 @@ class AnimCommonStateHolder return &val[id].scalarInt; } const void *getInlinePtr(int id) const { return const_cast(this)->getInlinePtr(id); } - unsigned getInlinePtrMaxSz(int id) { return getInlinePtrWords(paramTypes, id) * elem_size(val); } + unsigned getInlinePtrMaxSz(int id) const { return getInlinePtrWords(paramTypes, id) * elem_size(val); } float *getParamScalarPtr(int id); const float *getParamScalarPtr(int id) const { return const_cast(this)->getParamScalarPtr(id); } diff --git a/prog/dagorInclude/animChar/dag_animCharacter2.h b/prog/dagorInclude/animChar/dag_animCharacter2.h index fa813e0e9..9430e8f7e 100644 --- a/prog/dagorInclude/animChar/dag_animCharacter2.h +++ b/prog/dagorInclude/animChar/dag_animCharacter2.h @@ -231,6 +231,10 @@ class AnimcharBaseComponent int idx = slot_id >= 0 ? find_value_idx(attachmentSlotId, slot_id) : -1; return idx < 0 ? 0 : attachment[idx].uid; } + //! returns amount of named attach slots + int getAttachmentSlotId(int char_slot_idx) const; + //! returns amount of named attach slots + int getAttachmentSlotsCount() const; //! returns animchar attached to named slot AnimcharBaseComponent *getAttachedChar(int slot_id) const; //! returns skeleton effectively attached to named slot @@ -648,6 +652,7 @@ void prepareFrustum(bool is_main_camera, const Frustum &culling_frustum, const P int getSlotId(const char *slot_name); int addSlotId(const char *slot_name); +const char *getSlotName(const int slot_id); struct alignas(16) LegsIkRay { diff --git a/prog/dagorInclude/drv/3d/dag_commands.h b/prog/dagorInclude/drv/3d/dag_commands.h index b47b661d4..a77cddb46 100644 --- a/prog/dagorInclude/drv/3d/dag_commands.h +++ b/prog/dagorInclude/drv/3d/dag_commands.h @@ -190,6 +190,11 @@ enum class Drv3dCommand // par2: int *height GET_XESS_RESOLUTION, + // Returns current XESS version as a string. + // par1: char *version + // par2: size_t versionSize + GET_XESS_VERSION, + // Executes DLSS // par1: DlssParams * // par2: int *view_index @@ -335,8 +340,6 @@ enum class Drv3dCommand // return 1 when pending ops performed, 0 otherwise PROCESS_PENDING_RESOURCE_UPDATED, - GET_PS5_HFR_STATUS, - GET_PS5_HFR_SUPPORTED, GET_PS5_PSSR_STATUS, SET_FREQ_LEVEL, @@ -387,7 +390,11 @@ enum class Drv3dCommand // Gets if the console is running at 120Hz // returns true if running on a console and the display is running at 120Hz - GET_CONSOLE_120_HZ_STATUS, + GET_CONSOLE_HFR_STATUS, + + // Gets if the console is capable to run at 120Hz + // returns true if running on a console and the display supports 120Hz + GET_CONSOLE_HFR_SUPPORTED, // Collects a dump of all gpu resources currently in memory to a vector of ResourceDumpInfo structs // (It works similarly to GET_TEXTURE_STATISTICS, however instead of it dumping a bunch of text diff --git a/prog/dagorInclude/drv/3d/dag_decl.h b/prog/dagorInclude/drv/3d/dag_decl.h index ecdca0123..e2f223bc0 100644 --- a/prog/dagorInclude/drv/3d/dag_decl.h +++ b/prog/dagorInclude/drv/3d/dag_decl.h @@ -290,6 +290,7 @@ struct XessParams BaseTexture *inColor; BaseTexture *inDepth; BaseTexture *inMotionVectors; + BaseTexture *inExposure; float inJitterOffsetX; float inJitterOffsetY; float inInputWidth; diff --git a/prog/dagorInclude/drv/shadersMetaData/dxil/compiled_shader_header.h b/prog/dagorInclude/drv/shadersMetaData/dxil/compiled_shader_header.h index ac0f4437c..937ef5055 100644 --- a/prog/dagorInclude/drv/shadersMetaData/dxil/compiled_shader_header.h +++ b/prog/dagorInclude/drv/shadersMetaData/dxil/compiled_shader_header.h @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include #include // some headers define DOMAIN as macro which collides with enum names @@ -375,4 +378,25 @@ BINDUMP_BEGIN_LAYOUT(ShaderLibraryContainer) ShaderHashValue binaryHash; BINDUMP_END_LAYOUT() +struct LibraryShaderPropertiesCompileResult +{ + eastl::vector properties; + eastl::vector names; + LibraryResourceInformation libInfo{}; + bool isOk = true; + eastl::string logMessage; +}; + +struct FunctionExtraInfo +{ + uint32_t recursionDepth = 0; + uint32_t maxPayLoadSizeInBytes = 0; + uint32_t maxAttributeSizeInBytes = 0; +}; + +using FunctionExtraDataQuery = eastl::function(ShaderStage, const eastl::string &)>; + +LibraryShaderPropertiesCompileResult compileLibraryShaderPropertiesFromReflectionData(uint32_t default_playload_size_in_bytes, + const FunctionExtraDataQuery &function_extra_data_query, eastl::span reflection, void *dxc_lib_handle); + } // namespace dxil diff --git a/prog/dagorInclude/generic/dag_expected.h b/prog/dagorInclude/generic/dag_expected.h index 18830f563..8933dba1c 100644 --- a/prog/dagorInclude/generic/dag_expected.h +++ b/prog/dagorInclude/generic/dag_expected.h @@ -55,7 +55,7 @@ class Unexpected constexpr const E &error() const & { return m_error; } constexpr E &error() & { return m_error; } - constexpr const E &&error() const && { return m_error; } + constexpr const E &&error() const && { return std::move(m_error); } constexpr E &&error() && { return eastl::move(m_error); } template , bool> = true> @@ -131,17 +131,20 @@ class Expected constexpr Expected &operator=(U &&val) { m_var = eastl::move(val); + return *this; } template , bool> = true> constexpr Expected &operator=(const Unexpected &unexpected) { m_var = unexpected.error(); + return *this; } template , bool> = true> constexpr Expected &operator=(Unexpected &&unexpected) { m_var = eastl::move(unexpected.error()); + return *this; } constexpr const T *operator->() const { return eastl::get_if(&m_var); } @@ -169,6 +172,7 @@ class Expected constexpr T &emplace(TArgs &&...args) { m_var = T{eastl::forward(args)...}; + return eastl::get(m_var); } template diff --git a/prog/dagorInclude/gui/dag_imgui.h b/prog/dagorInclude/gui/dag_imgui.h index 16effc8a9..1bbdff90a 100644 --- a/prog/dagorInclude/gui/dag_imgui.h +++ b/prog/dagorInclude/gui/dag_imgui.h @@ -57,6 +57,7 @@ void imgui_set_ini_path(const char *path); void imgui_set_log_path(const char *path); enum ImGuiKey : int; eastl::optional map_dagor_key_to_imgui(int humap_key); +int map_imgui_key_to_dagor(int imgui_key); typedef eastl::function ImGuiFuncPtr; diff --git a/prog/dagorInclude/gui/dag_stdGuiRender.h b/prog/dagorInclude/gui/dag_stdGuiRender.h index 6fc28da3c..73987a6bc 100644 --- a/prog/dagorInclude/gui/dag_stdGuiRender.h +++ b/prog/dagorInclude/gui/dag_stdGuiRender.h @@ -383,7 +383,7 @@ struct GuiState struct ExtState // aliased to specific structure { - uint8_t data[64]; + uint8_t data[72]; }; struct CallBackState @@ -441,6 +441,7 @@ struct StdGuiShader : GuiShader Color4 fontTex2ofs; Color4 fontTex2rotCCSmS; Color4 user[2]; + uint8_t padding[8]; void setFontTex2Ofs(GuiVertexTransform &xform, float su, float sv, float x0, float y0); // void setFontFx(FontFxType type, E3DCOLOR col, int factor_x32); @@ -456,6 +457,7 @@ struct StdGuiShader : GuiShader void resetRotation() { fontTex2rotCCSmS.set(1, 1, 0, 0); } }; + static_assert(sizeof(ExtState) == sizeof(ExtStateLocal), "ExtState size mismatch"); virtual void channels(const CompiledShaderChannelId *&channels, int &num_chans); virtual void link(); diff --git a/prog/dagorInclude/shaders/dag_dynSceneRes.h b/prog/dagorInclude/shaders/dag_dynSceneRes.h index fc73cabab..773567bf1 100644 --- a/prog/dagorInclude/shaders/dag_dynSceneRes.h +++ b/prog/dagorInclude/shaders/dag_dynSceneRes.h @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -472,6 +473,8 @@ class DynamicRenderableSceneInstance public: DAG_DECLARE_NEW(midmem) + using NodeCollapserBits = eastl::array; + static float lodDistanceScale; DynamicRenderableSceneInstance(DynamicRenderableSceneLodsResource *res, bool activate_instance = true); @@ -508,6 +511,18 @@ class DynamicRenderableSceneInstance void showSkinnedNodesConnectedToBone(int bone_id, bool need_show); + void clearNodeCollapser() { nodeCollapserBits.fill(0); } + + void markNodeCollapserNode(uint32_t node_index) + { + int boneId = getBoneForNode(node_index); + G_ASSERT_RETURN(boneId < 256, ); + if (boneId >= 0) + nodeCollapserBits[boneId / 32] |= 1 << (boneId % 32); + } + + const NodeCollapserBits &getNodeCollapserBits() const { return nodeCollapserBits; } + void setNodeWtm(uint32_t n_id, const TMatrix &wtm) { if (n_id < getNodeCount()) @@ -701,6 +716,8 @@ class DynamicRenderableSceneInstance uint32_t uniqueId; + NodeCollapserBits nodeCollapserBits; + enum Offsets { CUR_WTM = 0, diff --git a/prog/dagorInclude/shaders/dag_shaders.h b/prog/dagorInclude/shaders/dag_shaders.h index 8638fb05b..f3ba3ba1f 100644 --- a/prog/dagorInclude/shaders/dag_shaders.h +++ b/prog/dagorInclude/shaders/dag_shaders.h @@ -170,6 +170,7 @@ ShaderMaterial *new_shader_material_by_name_optional(const char *shader_name, co bool sec_dump_for_exp = false); ShaderMaterial *new_shader_material_by_name(const char *shader_name, const char *mat_script = NULL, bool sec_dump_for_exp = false); bool shader_exists(const char *shader_name); +const char *get_shader_class_name_by_material_name(const char *mat_name); d3d::shadermodel::Version getMaxFSHVersion(); diff --git a/prog/dagorInclude/startup/dag_winMain.inc.cpp b/prog/dagorInclude/startup/dag_winMain.inc.cpp index 1c27f90a7..e8b0a309c 100644 --- a/prog/dagorInclude/startup/dag_winMain.inc.cpp +++ b/prog/dagorInclude/startup/dag_winMain.inc.cpp @@ -118,6 +118,10 @@ static int dagor_program_exec(int nCmdShow, int debugmode, WinDeferredStartupLog dagor_init_base_path(); dagor_change_root_directory(::dgs_get_argv("rootdir")); +#if _TARGET_GDK + xbox::initialize_runtime(); +#endif + #if defined(__DEBUG_FILEPATH) start_classic_debug_system(__DEBUG_FILEPATH); #elif defined(__DEBUG_MODERN_PREFIX) diff --git a/prog/dagorInclude/util/dag_delayedAction.h b/prog/dagorInclude/util/dag_delayedAction.h index 0a1acc8ea..231fc608d 100644 --- a/prog/dagorInclude/util/dag_delayedAction.h +++ b/prog/dagorInclude/util/dag_delayedAction.h @@ -8,8 +8,9 @@ #include #include +#if DAGOR_DBGLEVEL > 0 || _TARGET_PC #define ACTION_DEBUG_NAMES 1 - +#endif //! delayed action to be performed on next dagor_work_cycle() class DelayedAction @@ -103,7 +104,7 @@ auto make_delayed_func(F func) }; } -#ifdef ACTION_DEBUG_NAMES +#if ACTION_DEBUG_NAMES #define ACTION_DEBUG_NAMES_S1(x) #x #define ACTION_DEBUG_NAMES_S2(x) ACTION_DEBUG_NAMES_S1(x) #define ACTION_DEBUG_NAMES_LOC " @\n\t" __FILE__ "(" ACTION_DEBUG_NAMES_S2(__LINE__) "):" diff --git a/prog/engine/anim/animGraph.cpp b/prog/engine/anim/animGraph.cpp index b1148df95..02f9db90f 100644 --- a/prog/engine/anim/animGraph.cpp +++ b/prog/engine/anim/animGraph.cpp @@ -45,7 +45,7 @@ struct AnimBlender::NodeSamplers }; Entry samplers[MAX_ANIMS_IN_NODE]; - uint8_t totalNum : 8; + uint32_t totalNum : 8; int32_t lastBnl : 24; }; diff --git a/prog/engine/animChar/animCharBase.cpp b/prog/engine/animChar/animCharBase.cpp index 8813b05ce..2c2ad1eae 100644 --- a/prog/engine/animChar/animCharBase.cpp +++ b/prog/engine/animChar/animCharBase.cpp @@ -637,6 +637,11 @@ int AnimcharBaseComponent::setAttachedChar(int slot_id, attachment_uid_t uid, An return idx; } +int AnimcharBaseComponent::getAttachmentSlotsCount() const { return attachment.size(); } +int AnimcharBaseComponent::getAttachmentSlotId(int char_slot_idx) const +{ + return char_slot_idx >= 0 && char_slot_idx < attachmentSlotId.size() ? attachmentSlotId[char_slot_idx] : -1; +} AnimcharBaseComponent *AnimcharBaseComponent::getAttachedChar(int slot_id) const { int idx = slot_id >= 0 ? find_value_idx(attachmentSlotId, slot_id) : -1; diff --git a/prog/engine/animChar/animCharacter2.cpp b/prog/engine/animChar/animCharacter2.cpp index d30fb074f..7fc868a80 100644 --- a/prog/engine/animChar/animCharacter2.cpp +++ b/prog/engine/animChar/animCharacter2.cpp @@ -54,3 +54,8 @@ int AnimCharV20::addSlotId(const char *slot_name) { return get_slot_id(slot_name, [](const char *sn) { return slotNames.addNameId(sn); }); } +const char *AnimCharV20::getSlotName(const int slot_id) +{ + OSSpinlockScopedLock lock(slotNamesMapMutex); + return slotNames.getName(slot_id); +} diff --git a/prog/engine/baseUtil/delayedActions.cpp b/prog/engine/baseUtil/delayedActions.cpp index 79f8998ea..d2682d694 100644 --- a/prog/engine/baseUtil/delayedActions.cpp +++ b/prog/engine/baseUtil/delayedActions.cpp @@ -17,6 +17,7 @@ struct ScopedPerfLag { +#if ACTION_DEBUG_NAMES const char *name; uint64_t ref; ScopedPerfLag(const char *n) : name(n), ref(profile_ref_ticks()) {} @@ -42,6 +43,9 @@ struct ScopedPerfLag dgs_lag_handler(name, (t * 1000) / freq); // time in msec } } +#else + ScopedPerfLag(const char *) {} +#endif }; struct DelayedRecord @@ -49,11 +53,22 @@ struct DelayedRecord DelayedAction *action = nullptr; delayed_callback cb = nullptr; void *cbArg; +#if ACTION_DEBUG_NAMES const char *debugName; +#else + static constexpr inline const char *debugName = nullptr; +#endif DelayedRecord() = default; DelayedRecord(DelayedAction *a, delayed_callback c, void *cb_arg, const char *debug_name) : - action(a), cb(c), cbArg(cb_arg), debugName(debug_name) + action(a), + cb(c), + cbArg(cb_arg) +#if ACTION_DEBUG_NAMES + , + debugName(debug_name) +#endif { + G_UNUSED(debug_name); G_ASSERT(a || c); } void run() @@ -170,8 +185,8 @@ static struct DelayedActionsContext logwarn("stop perform_delayed_actions() after %d actions performed for %d usec; quota is %d usec;" " actions left in list: %d normal and %d buffered", cnt, get_time_usec_qpc(t_start), quotaUsec, actionsLeft, delayed_actions_buffered.size()); - if (!is_debugger_present()) - break; + // Note: we _want_ to break here regadless of debugger presense to avoid altering program behaviour + break; } WinAutoLock lock(delayedCrit); action = getNextAction(); diff --git a/prog/engine/drv/drv3d_DX11/drvmain.cpp b/prog/engine/drv/drv3d_DX11/drvmain.cpp index f6f623709..b49de3e53 100644 --- a/prog/engine/drv/drv3d_DX11/drvmain.cpp +++ b/prog/engine/drv/drv3d_DX11/drvmain.cpp @@ -1061,49 +1061,6 @@ bool d3d::update_screen(bool app_active) if (::dgs_on_swap_callback) ::dgs_on_swap_callback(); - // Restore fullscreen state in case it was lost independently of app focus. - - if (dgs_get_window_mode() == WindowMode::FULLSCREEN_EXCLUSIVE && ::dgs_app_active && SUCCEEDED(presentHr)) - { - static bool logErrors = true; - BOOL currentFullscreen = true; - - HRESULT hr; - { - ContextAutoLock contextLock; - hr = swap_chain->GetFullscreenState(¤tFullscreen, NULL); - } - - if (SUCCEEDED(hr) && !currentFullscreen) - { - HRESULT hrSet = drv3d_dx11::set_fullscreen_state(true); - - HRESULT hrGet; - { - ContextAutoLock contextLock; - hrGet = swap_chain->GetFullscreenState(¤tFullscreen, NULL); - } - - if (SUCCEEDED(hrGet) && currentFullscreen) - { - logErrors = true; - debug("DX11 Present: SetFullscreenState(1)"); - } - else if (logErrors) - { - logErrors = false; - if (hrSet == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) // It is OK, probably caused by slow monitor mode switching when screen - // parameters differ. Will retry on the next frame. - debug("DX11 Present: SetFullscreenState(1), state=%d, hrSet=0x%08X, hrGet=0x%08X", (int)currentFullscreen, hrSet, hrGet); - else - D3D_ERROR("DX11 Present: SetFullscreenState(1), state=%d, hrSet=0x%08X, hrGet=0x%08X", (int)currentFullscreen, hrSet, hrGet); - } - } - else - logErrors = true; - } - - static bool useFrameStatistics = use_gpu_dt; static int failCount = 0; gpu_frame_time = -1.f; diff --git a/prog/engine/drv/drv3d_DX11/init.cpp b/prog/engine/drv/drv3d_DX11/init.cpp index c260ea924..426bd0775 100644 --- a/prog/engine/drv/drv3d_DX11/init.cpp +++ b/prog/engine/drv/drv3d_DX11/init.cpp @@ -1913,32 +1913,8 @@ bool init_device(Driver3dInitCallback *cb, HWND window_hwnd, int screen_wdt, int g_driver_state.createSurfaces(screen_wdt, screen_hgt); - DXGI_FORMAT msaaFormats[] = { - DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_D32_FLOAT_S8X24_UINT, - DXGI_FORMAT_R24G8_TYPELESS // MSAA support should be the same as for the DXGI_FORMAT_D24_UNORM_S8_UINT - }; - nvlowlatency::init(); - /* - d3d::setview(0, 0, screen_wdt, screen_hgt, 0.0, 1.0); - d3d::setpersp(1.3, 1.3*screen_wdt/screen_hgt, 0.1, 100.0); - bool hasAtoC = ((dir3d->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, - D3DRTYPE_SURFACE, (D3DFORMAT)MAKEFOURCC('A', 'T', 'O', 'C'))) == S_OK); - bool hasSsaa = ((dir3d->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, - D3DRTYPE_SURFACE, (D3DFORMAT)MAKEFOURCC('S', 'S', 'A', 'A'))) == S_OK); - if (hasAtoC) - { - debug("has atoc"); - d3dd->SetRenderState(D3DRS_ADAPTIVETESS_Y, (D3DFORMAT)MAKEFOURCC('A', 'T', 'O', 'C')); - } - if (hasSsaa) - { - debug("has ssaa"); - //d3dd->SetRenderState(D3DRS_ADAPTIVETESS_Y, (D3DFORMAT)MAKEFOURCC('S', 'S', 'A', 'A')); - } - */ - _in_win_started = inWin; return SUCCEEDED(last_hres); diff --git a/prog/engine/drv/drv3d_DX12/amdFsrD3D12_windows.cpp b/prog/engine/drv/drv3d_DX12/amdFsrD3D12_windows.cpp index 4407c2247..effff4663 100644 --- a/prog/engine/drv/drv3d_DX12/amdFsrD3D12_windows.cpp +++ b/prog/engine/drv/drv3d_DX12/amdFsrD3D12_windows.cpp @@ -1,18 +1,18 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "amdFsr.h" +#include +#include +#include #include #include -#include -#include -#include #include -#include +#include +#include #include +#include -#include "amdFsr3Helpers.h" namespace amd { @@ -48,7 +48,31 @@ class FSRD3D12Win : public FSR if (isLoaded()) { - logdbg("[AMDFSR] FSRD3D12Win created."); + uint64_t versionCount = 0; + ffx::QueryDescGetVersions versionsDesc{}; + versionsDesc.createDescType = FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE; + versionsDesc.device = d3d::get_device(); + versionsDesc.outputCount = &versionCount; + if (query(nullptr, &versionsDesc.header) == FFX_API_RETURN_OK) + { + dag::Vector versionIds; + dag::Vector versionNames; + versionIds.resize(versionCount); + versionNames.resize(versionCount); + versionsDesc.versionIds = versionIds.data(); + versionsDesc.versionNames = versionNames.data(); + + if (versionCount > 0 && query(nullptr, &versionsDesc.header) == FFX_API_RETURN_OK) + { + for (int verIx = 0; verIx < versionCount; ++verIx) + logdbg("[AMDFSR] provider %llu - %s", versionIds[verIx], versionNames[verIx]); + + // The first returned provider is FSR3 upscaling + upscalingVersionString = versionNames.front(); + } + } + + logdbg("[AMDFSR] FSRD3D12Win created. Upscaling use %s.", getVersionString().data()); } else { @@ -119,6 +143,8 @@ class FSRD3D12Win : public FSR bool isFrameGenerationSupported() const override { return false; } + String getVersionString() const override { return upscalingVersionString; } + private: eastl::unique_ptr fsrModule; @@ -133,6 +159,8 @@ class FSRD3D12Win : public FSR UpscalingMode upscalingMode = UpscalingMode::Off; uint32_t jitterIndex = 0; + + String upscalingVersionString = String(8, ""); }; FSR *createD3D12Win() { return new FSRD3D12Win; } diff --git a/prog/engine/drv/drv3d_DX12/bindless.cpp b/prog/engine/drv/drv3d_DX12/bindless.cpp index 4fbea4975..778709506 100644 --- a/prog/engine/drv/drv3d_DX12/bindless.cpp +++ b/prog/engine/drv/drv3d_DX12/bindless.cpp @@ -1,8 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "bindless.h" #include "device.h" +#include "device_context.h" #include "frontend_state.h" + using namespace drv3d_dx12; #if DX12_REPORT_BINDLESS_HEAP_ACTIVITY diff --git a/prog/engine/drv/drv3d_DX12/bindless.h b/prog/engine/drv/drv3d_DX12/bindless.h index 09b819f1d..bd56c63b2 100644 --- a/prog/engine/drv/drv3d_DX12/bindless.h +++ b/prog/engine/drv/drv3d_DX12/bindless.h @@ -1,14 +1,15 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "image_view_state.h" +#include "sampler_state.h" + +#include #include -#include +#include #include +#include #include -#include - -#include "image_view_state.h" -#include "sampler_state.h" namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/bitfield.h b/prog/engine/drv/drv3d_DX12/bitfield.h index 13347dafb..87c5440d7 100644 --- a/prog/engine/drv/drv3d_DX12/bitfield.h +++ b/prog/engine/drv/drv3d_DX12/bitfield.h @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include diff --git a/prog/engine/drv/drv3d_DX12/buffer.h b/prog/engine/drv/drv3d_DX12/buffer.h index e30d15b58..13b83010b 100644 --- a/prog/engine/drv/drv3d_DX12/buffer.h +++ b/prog/engine/drv/drv3d_DX12/buffer.h @@ -1,13 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - +#include "constants.h" #include "device_memory_class.h" #include "format_store.h" -#include "constants.h" #include "pipeline.h" +#include + namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/byte_units.h b/prog/engine/drv/drv3d_DX12/byte_units.h index eb75c2c5a..3e7b27443 100644 --- a/prog/engine/drv/drv3d_DX12/byte_units.h +++ b/prog/engine/drv/drv3d_DX12/byte_units.h @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include diff --git a/prog/engine/drv/drv3d_DX12/command_list.h b/prog/engine/drv/drv3d_DX12/command_list.h index 10d2bff42..a74ebf716 100644 --- a/prog/engine/drv/drv3d_DX12/command_list.h +++ b/prog/engine/drv/drv3d_DX12/command_list.h @@ -1,33 +1,42 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include - #include "driver.h" #include "extents.h" +#include "debug/command_list_logger.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #if _TARGET_XBOX #include "command_list_xbox.h" #endif + namespace drv3d_dx12 { -#define DX12_BEGIN_VALIATION() bool hadError = false -#define DX12_FINALIZE_VALIDATAION() \ - if (hadError) \ - { \ - return; \ +#define DX12_BEGIN_VALIDATION() bool hadError = false +#define DX12_FINALIZE_VALIDATION() \ + if (hadError) \ + { \ + return; \ } #define DX12_RETURN_VALIDATION_RESULT() \ { \ return hadError; \ } -#define DX12_UPDATE_VALIATION_STATE(result) hadError = (result) -#define DX12_ON_VALIDATION_ERROR(...) \ - { \ - D3D_ERROR("DX12: " DX12_VALIDATAION_CONTEXT ": " __VA_ARGS__); \ - DX12_UPDATE_VALIATION_STATE(true); \ +#define DX12_UPDATE_VALIDATION_STATE(result) hadError = (result) +#define DX12_ON_VALIDATION_ERROR(...) \ + { \ + D3D_ERROR("DX12: " DX12_VALIDATION_CONTEXT ": " __VA_ARGS__); \ + DX12_UPDATE_VALIDATION_STATE(true); \ } #define DX12_VALIDATE_CONDITION(cond, ...) \ if (!(cond)) \ @@ -35,7 +44,7 @@ namespace drv3d_dx12 DX12_ON_VALIDATION_ERROR(__VA_ARGS__); \ } -#define DX12_VALIDATAION_CONTEXT "ResourceBarrier" +#define DX12_VALIDATION_CONTEXT "ResourceBarrier" // Barrier validator, behavior is controlled with the policy type P. template @@ -171,7 +180,7 @@ class BarrierValidator static bool validateTransitionBarrier(D3D12_RESOURCE_BARRIER_FLAGS flags, const D3D12_RESOURCE_TRANSITION_BARRIER &transition) { - DX12_BEGIN_VALIATION(); + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(flags == (P::VALID_TRANSITION_FLAGS & flags), "Invalid barrier flags (0x%08X) for transition barrier", (uint32_t)flags); DX12_VALIDATE_CONDITION(transition.pResource != nullptr, "transition barrier resource was null"); @@ -203,7 +212,7 @@ class BarrierValidator } static bool validateAliasingBarrier(D3D12_RESOURCE_BARRIER_FLAGS flags, const D3D12_RESOURCE_ALIASING_BARRIER &alias) { - DX12_BEGIN_VALIATION(); + DX12_BEGIN_VALIDATION(); G_UNUSED(alias); // We can not validate any of the aliases as they can be null (which means all possible memory), or we can't query // any data that can be used to determine of they overlap or not. @@ -212,7 +221,7 @@ class BarrierValidator } static bool validateUAVBarrier(D3D12_RESOURCE_BARRIER_FLAGS flags, const D3D12_RESOURCE_UAV_BARRIER &uav) { - DX12_BEGIN_VALIATION(); + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 == uint32_t(flags), "Invalid barrier flags (0x%08X) for UAV barrier", (uint32_t)flags); // Null is valid here! if (uav.pResource) @@ -226,18 +235,18 @@ class BarrierValidator } static bool validateBarrier(const D3D12_RESOURCE_BARRIER &barrier) { - DX12_BEGIN_VALIATION(); + DX12_BEGIN_VALIDATION(); if (P::ALLOW_TRANSITION && D3D12_RESOURCE_BARRIER_TYPE_TRANSITION == barrier.Type) { - DX12_UPDATE_VALIATION_STATE(validateTransitionBarrier(barrier.Flags, barrier.Transition)); + DX12_UPDATE_VALIDATION_STATE(validateTransitionBarrier(barrier.Flags, barrier.Transition)); } else if (P::ALLOW_UAV && D3D12_RESOURCE_BARRIER_TYPE_UAV == barrier.Type) { - DX12_UPDATE_VALIATION_STATE(validateUAVBarrier(barrier.Flags, barrier.UAV)); + DX12_UPDATE_VALIDATION_STATE(validateUAVBarrier(barrier.Flags, barrier.UAV)); } else if (P::ALLOW_ALIASING && D3D12_RESOURCE_BARRIER_TYPE_ALIASING == barrier.Type) { - DX12_UPDATE_VALIATION_STATE(validateAliasingBarrier(barrier.Flags, barrier.Aliasing)); + DX12_UPDATE_VALIDATION_STATE(validateAliasingBarrier(barrier.Flags, barrier.Aliasing)); } else { @@ -355,659 +364,8 @@ struct ExtendedGraphicsCommandListBarrierValidationPolicy }; #endif -#undef DX12_VALIDATAION_CONTEXT - -enum class DX12_COMMAND_LOG_ITEM_TYPE : uint32_t -{ -#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) TYPE, -#include "command_list_cmd.inc.h" -#undef DX12_HARDWARE_COMMAND -}; - -template -struct IsSpan : eastl::false_type -{}; - -template -struct IsSpan> : eastl::true_type -{ - using ElementType = T; -}; - -template -uint32_t full_log_item_size(ARGS... args); - -template -class CommandLogItem -{ -public: - CommandLogItem(ARGS... args) : args{args...} {} - - eastl::string toString() const - { - return eastl::apply([](ARGS... args) { return make_command_string({to_string(args)...}); }, args); - } - - constexpr static uint32_t static_command_size() { return (static_argument_size() + ... + sizeof(DX12_COMMAND_LOG_ITEM_TYPE)); } - - uint32_t command_size() const - { - return eastl::apply([](ARGS... args) { return full_log_item_size(args...); }, args); - } - -private: - template - constexpr static uint32_t static_argument_size() - { - return IsSpan::value ? 0 : sizeof(ARG_TYPE); - } - - static eastl::string make_command_string(std::initializer_list args) - { - eastl::string result{to_string(command_type)}; - result += "("; - for (auto it = args.begin(); it != args.end(); it++) - { - if (it != args.begin()) - result += ", "; - result.append(it->data(), it->size()); - } - result += ")"; - return result; - } - - template - static eastl::string to_string(T arg) - { - return eastl::to_string(arg); - } - - template - static eastl::string to_string(const eastl::optional &optional_arg) - { - if (!optional_arg) - return "nullptr"; - return to_string(*optional_arg); - } - - template - static eastl::string to_string(const eastl::span &args) - { - eastl::string result{"{"}; - for (auto it = args.cbegin(); it != args.cend(); ++it) - { - if (it != args.cbegin()) - result += ", "; - result += to_string(*it); - } - result += "}"; - return result; - } - - static eastl::string to_string(const eastl::string &arg) { return arg; } - - static eastl::string to_string(D3D12_CPU_DESCRIPTOR_HANDLE arg) - { - eastl::string result; - result.sprintf("0x%x", arg.ptr); - return result; - } - - static eastl::string to_string(D3D12_GPU_DESCRIPTOR_HANDLE arg) - { - eastl::string result; - result.sprintf("0x%x", arg.ptr); - return result; - } - - static eastl::string to_string(const void *arg) - { - eastl::string result; - result.sprintf("0x%p", arg); - return result; - } - - static const char *to_string(DX12_COMMAND_LOG_ITEM_TYPE cmd_type) - { - switch (cmd_type) - { -#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) \ - case DX12_COMMAND_LOG_ITEM_TYPE::TYPE: \ - return COMMAND_NAME; -#include "command_list_cmd.inc.h" -#undef DX12_HARDWARE_COMMAND - default: D3D_ERROR("Unknown command type %d", (int)cmd_type); return "Unknown"; - } - } - - static eastl::string to_string(ID3D12Resource *arg) { return to_string(static_cast(arg)); } - static eastl::string to_string(ID3D12RootSignature *arg) { return to_string(static_cast(arg)); } - static eastl::string to_string(ID3D12PipelineState *arg) { return to_string(static_cast(arg)); } - static eastl::string to_string(ID3D12CommandSignature *arg) { return to_string(static_cast(arg)); } - static eastl::string to_string(ID3D12QueryHeap *arg) { return to_string(static_cast(arg)); } - static eastl::string to_string(ID3D12DescriptorHeap *arg) { return to_string(static_cast(arg)); } -#if D3D_HAS_RAY_TRACING - static eastl::string to_string(ID3D12StateObject *arg) { return to_string(static_cast(arg)); } -#endif - - static eastl::string to_string(const D3D12_SUBRESOURCE_FOOTPRINT &footprint) - { - eastl::string result; - result.sprintf("{%u, %u, %u, %u, %u}", footprint.Format, footprint.Width, footprint.Height, footprint.Depth, footprint.RowPitch); - return result; - } - - static eastl::string to_string(const D3D12_PLACED_SUBRESOURCE_FOOTPRINT &footprint) - { - eastl::string result; - result.sprintf("{0x%" PRIX64, footprint.Offset); - result.append(to_string(footprint.Footprint)); - result.append("}"); - return result; - } - - static eastl::string to_string(const D3D12_TEXTURE_COPY_LOCATION &location) - { - eastl::string result; - result.sprintf("{0x%p, %u, ", location.pResource, location.Type); - if (location.Type == D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT) - result.append(to_string(location.PlacedFootprint)); - else - result.append_sprintf("%u", location.SubresourceIndex); - result.append("}"); - return result; - } - - static eastl::string to_string(const D3D12_BOX &box) - { - eastl::string result; - result.sprintf("{%u, %u, %u, %u, %u, %u}", box.left, box.top, box.front, box.right, box.bottom, box.back); - return result; - } - - static eastl::string to_string(const D3D12_INDEX_BUFFER_VIEW &index_buffer_view) - { - eastl::string result; - result.sprintf("{0x%" PRIX64 ", %u, %u}", index_buffer_view.BufferLocation, index_buffer_view.SizeInBytes, - index_buffer_view.Format); - return result; - } +#undef DX12_VALIDATION_CONTEXT - static eastl::string to_string(const D3D12_GPU_VIRTUAL_ADDRESS_RANGE &gpu_virtual_address_range) - { - eastl::string result; - result.sprintf("{0x%" PRIX64 ", %u}", gpu_virtual_address_range.StartAddress, gpu_virtual_address_range.SizeInBytes); - return result; - } - - static eastl::string to_string(const D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE &gpu_virtual_address_range_and_stride) - { - eastl::string result; - result.sprintf("{0x%" PRIX64 ", %u, %u}", gpu_virtual_address_range_and_stride.StartAddress, - gpu_virtual_address_range_and_stride.SizeInBytes, gpu_virtual_address_range_and_stride.StrideInBytes); - return result; - } - -#if D3D_HAS_RAY_TRACING - static eastl::string to_string(const D3D12_DISPATCH_RAYS_DESC &dispatch_rays_desc) - { - eastl::string result; - result.sprintf("{"); - result.append_sprintf("%s, ", to_string(dispatch_rays_desc.RayGenerationShaderRecord).c_str()); - result.append_sprintf("%s, ", to_string(dispatch_rays_desc.MissShaderTable).c_str()); - result.append_sprintf("%s, ", to_string(dispatch_rays_desc.HitGroupTable).c_str()); - result.append_sprintf("%s, ", to_string(dispatch_rays_desc.CallableShaderTable).c_str()); - result.append_sprintf("{%u, %u, %u}", dispatch_rays_desc.Width, dispatch_rays_desc.Height, dispatch_rays_desc.Depth); - return result; - } - - static eastl::string to_string(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS &inputs) - { - eastl::string result; - result.sprintf("{"); - result.append_sprintf("%s, ", to_string(inputs.Type).c_str()); - result.append_sprintf("%s, ", to_string(inputs.Flags).c_str()); - result.append_sprintf("%s, ", to_string(inputs.NumDescs).c_str()); - result.append_sprintf("%s, ", to_string(inputs.DescsLayout).c_str()); - result.append("{...}}"); /// TODO - return result; - } - - static eastl::string to_string(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC &desc) - { - eastl::string result; - result.sprintf("{"); - result.append_sprintf("%s, ", to_string(desc.DestAccelerationStructureData).c_str()); - result.append_sprintf("%s, ", to_string(desc.Inputs).c_str()); - result.append_sprintf("%s, ", to_string(desc.SourceAccelerationStructureData).c_str()); - result.append_sprintf("%s", to_string(desc.ScratchAccelerationStructureData).c_str()); - result.sprintf("}"); - return result; - } -#endif - - static eastl::string to_string(const D3D12_DISCARD_REGION &discard_region) - { - eastl::string result; - result.sprintf("{%u, {...}, %u, %u}", discard_region.NumRects /*, discard_region.pRects*/, discard_region.FirstSubresource, - discard_region.NumSubresources); /// TODO - return result; - } - - eastl::tuple args; -}; - -template -inline uint32_t full_log_item_size(ARGS... args) -{ - constexpr uint32_t staticCommandSize = CommandLogItem::static_command_size(); - auto getDynamicArgSize = [](auto arg) { - if constexpr (IsSpan::value) - return arg.size_bytes() + sizeof(uint32_t); - else - return 0; - }; - const uint32_t dynamicCommandSize = (getDynamicArgSize(args) + ... + 0); - return staticCommandSize + dynamicCommandSize; -} - -using AnyCommandItemType = eastl::variant -#include "command_list_cmd.inc.h" -#undef DX12_HARDWARE_COMMAND - >; - -class CommandLogDecoder -{ -public: - static void dump_commands_to_log(eastl::optional> commands_logs) - { - if (!commands_logs) - { - logdbg("Commands log is disabled"); - return; - } - - logdbg("Hardware command list log begin"); - uint32_t offset = 0; - while (offset < commands_logs->size()) - { - auto cmdVariant = decode_command(commands_logs->data() + offset); - logdbg("%s", eastl::visit(CommandToStringVisitor{}, cmdVariant)); - offset += eastl::visit(CommandToSizeVisitor{}, cmdVariant); - } - logdbg("Hardware command list log end"); - } - -private: - struct CommandToStringVisitor - { - template - eastl::string operator()(const COMMAND &cmd) const - { - return cmd.toString(); - } - eastl::string operator()(const eastl::monostate &) const { return "Unknown command"; } - }; - - struct CommandToSizeVisitor - { - template - uint32_t operator()(const COMMAND &cmd) const - { - return cmd.command_size(); - } - uint32_t operator()(const eastl::monostate &) const { return sizeof(DX12_COMMAND_LOG_ITEM_TYPE); } - }; - - template - static ARG_TYPE decode_argument(const unsigned char *&args) - { - if constexpr (IsSpan::value) - { - const uint32_t size = *reinterpret_cast(args); - args += sizeof(uint32_t); - const auto begin = reinterpret_cast::ElementType *>(args); - args += size * sizeof(typename IsSpan::ElementType); - return {begin, size}; - } - else - { - const auto result = *reinterpret_cast(args); - args += sizeof(ARG_TYPE); - return result; - } - } - - template - static AnyCommandItemType decode_command(const unsigned char *args) - { - return CommandLogItem(decode_argument(args)...); - } - - static AnyCommandItemType decode_command(const unsigned char *ptr) - { - const DX12_COMMAND_LOG_ITEM_TYPE cmdType = *reinterpret_cast(ptr); - const auto args = ptr + sizeof(DX12_COMMAND_LOG_ITEM_TYPE); - switch (cmdType) - { -#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) \ - case DX12_COMMAND_LOG_ITEM_TYPE::TYPE: \ - return decode_command(args); -#include "command_list_cmd.inc.h" -#undef DX12_HARDWARE_COMMAND - default: - D3D_ERROR("Unknown command type %d", static_cast>(cmdType)); - return eastl::monostate{}; - } - } -}; - -class CommandLogEnabledStorage -{ -public: - eastl::optional> getCommands() const - { - return eastl::span{commandsLogs.begin(), commandsLogs.end()}; - } - -protected: - template - auto logCommand(ARG_TYPE... args) - -> decltype(AnyCommandItemType{eastl::declval>()}, void()) - { - const uint32_t commandSize = full_log_item_size(args...); - uint32_t offset = commandsLogs.size(); - commandsLogs.resize(offset + commandSize); - writeToByteStream(command_type, offset); - (writeToByteStream(args, offset), ...); - } - - void reset() { commandsLogs.clear(); } - -private: - template - void writeToByteStream(eastl::span args, uint32_t &offset) - { - writeToByteStream((uint32_t)args.size(), offset); - for (const auto &arg : args) - writeToByteStream(arg, offset); - } - - template - void writeToByteStream(ARG_TYPE arg, uint32_t &offset) - { - constexpr uint32_t size = sizeof(ARG_TYPE); - memcpy(&commandsLogs[offset], &arg, size); - offset += size; - } - - dag::Vector commandsLogs; -}; - -class CommandLogDisabledStorage -{ -public: - eastl::optional> getCommands() const { return {}; } - -protected: - template - void logCommand(ARG_TYPE...) - {} - void reset() {} -}; - -using CommandLogStorage = eastl::type_select_t; - -class CommandListLogger : public CommandLogStorage -{ -public: - void copyTextureRegion(const D3D12_TEXTURE_COPY_LOCATION *dst, UINT x, UINT y, UINT z, const D3D12_TEXTURE_COPY_LOCATION *src, - const D3D12_BOX *src_box) - { - logCommand(*dst, x, y, z, *src, - src_box ? eastl::optional{*src_box} : eastl::nullopt); - } - - void copyBufferRegion(ID3D12Resource *dst, UINT64 dst_offset, ID3D12Resource *src, UINT64 src_offset, UINT64 num_bytes) - { - logCommand(dst, dst_offset, src, src_offset, num_bytes); - } - - void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER * /*barriers*/) - { - logCommand(num_barriers /*, barriers*/); - } - - void copyResource(ID3D12Resource *dst, ID3D12Resource *src) { logCommand(dst, src); } - - void endQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) - { - logCommand(query_heap, type, index); - } - - void resolveQueryData(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT start_index, UINT num_queries, - ID3D12Resource *destination_buffer, UINT64 aligned_destination_buffer_offset) - { - logCommand(query_heap, type, start_index, num_queries, destination_buffer, - aligned_destination_buffer_offset); - } - - void setDescriptorHeaps(UINT num_descriptor_heaps, ID3D12DescriptorHeap *const *descriptor_heaps) - { - auto heaps = eastl::span(descriptor_heaps, num_descriptor_heaps); - logCommand(num_descriptor_heaps, heaps); - } - - void clearUnorderedAccessViewFloat(D3D12_GPU_DESCRIPTOR_HANDLE view_GPU_handle_in_current_heap, - D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const FLOAT /*values*/[4], UINT num_rects, - const D3D12_RECT * /*rects*/) - { - logCommand(view_GPU_handle_in_current_heap, view_CPU_handle, - resource, - /*values, */ num_rects /*, rects*/); - } - - void clearUnorderedAccessViewUint(D3D12_GPU_DESCRIPTOR_HANDLE view_gpu_handle_in_current_heap, - D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const UINT /*values*/[4], UINT num_rects, - const D3D12_RECT * /*rects*/) - { - logCommand(view_gpu_handle_in_current_heap, view_CPU_handle, - resource /*, values*/, num_rects /*, rects*/); - } - - void setComputeRootSignature(ID3D12RootSignature *root_signature) - { - logCommand(root_signature); - } - - void setPipelineState(ID3D12PipelineState *pipeline_state) - { - logCommand(pipeline_state); - } - - void dispatch(UINT thread_group_count_x, UINT thread_group_count_y, UINT thread_group_count_z) - { - logCommand(thread_group_count_x, thread_group_count_y, thread_group_count_z); - } - - void executeIndirect(ID3D12CommandSignature *command_signature, UINT max_command_count, ID3D12Resource *argument_buffer, - UINT64 argument_buffer_offset, ID3D12Resource *count_buffer, UINT64 count_buffer_offset) - { - logCommand(command_signature, max_command_count, argument_buffer, - argument_buffer_offset, count_buffer, count_buffer_offset); - } - - void setComputeRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) - { - logCommand(root_parameter_index, buffer_location); - } - - void setComputeRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) - { - logCommand(root_parameter_index, base_descriptor); - } - - void setComputeRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, - UINT dest_offset_in_32bit_values) - { - logCommand(root_parameter_index, num_32bit_values_to_set, src_data, - dest_offset_in_32bit_values); // exact values don't matter - } - - - void discardResource(ID3D12Resource *resource, const D3D12_DISCARD_REGION *region) - { - logCommand(resource, region ? eastl::optional{*region} : eastl::nullopt); - } - - void setPredication(ID3D12Resource *buffer, UINT64 aligned_buffer_offset, D3D12_PREDICATION_OP operation) - { - logCommand(buffer, aligned_buffer_offset, operation); - } - - - void clearRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE render_target_view, const FLOAT /*color_rgba*/[4], UINT num_rects, - const D3D12_RECT * /*rects*/) - { - logCommand(render_target_view, /*color_rgba, */ num_rects /*, rects*/); - } - - void resolveSubresource(ID3D12Resource *dst_resource, UINT dst_subresource, ID3D12Resource *src_resource, UINT src_subresource, - DXGI_FORMAT format) - { - logCommand(dst_resource, dst_subresource, src_resource, src_subresource, format); - } - - void clearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view, D3D12_CLEAR_FLAGS clear_flags, FLOAT depth, UINT8 stencil, - UINT num_rects, const D3D12_RECT * /*rects*/) - { - logCommand(depth_stencil_view, clear_flags, depth, stencil, - num_rects /*, rects*/); - } - - void beginQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) - { - logCommand(query_heap, type, index); - } - - void writeBufferImmediate(UINT count, const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER * /*params*/, - const D3D12_WRITEBUFFERIMMEDIATE_MODE * /*modes*/) - { - logCommand(count /*, params, modes*/); - } - - void omSetRenderTargets(UINT num_render_target_descriptors, const D3D12_CPU_DESCRIPTOR_HANDLE * /*render_target_descriptors*/, - BOOL rts_single_handle_to_descriptor_range, const D3D12_CPU_DESCRIPTOR_HANDLE * /*depth_stencil_descriptor*/) - { - logCommand(num_render_target_descriptors /*, render_target_descriptors*/, - rts_single_handle_to_descriptor_range /*, depth_stencil_descriptor*/); - } - - void setGraphicsRootSignature(ID3D12RootSignature *root_signature) - { - logCommand(root_signature); - } - void iaSetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY primitive_topology) - { - logCommand(primitive_topology); - } - void omSetDepthBounds(FLOAT min_value, FLOAT max_value) - { - logCommand(min_value, max_value); - } - void omSetBlendFactor(const FLOAT /*blend_factor*/[4]) - { - logCommand(/*, blend_factor*/); - } - void rsSetScissorRects(UINT num_rects, const D3D12_RECT * /*rects*/) - { - logCommand(num_rects /*, rects*/); - } - void rsSetViewports(UINT num_viewports, const D3D12_VIEWPORT * /*viewports*/) - { - logCommand(num_viewports /*, viewports*/); - } - void omSetStencilRef(UINT stencil_ref) { logCommand(stencil_ref); } - void drawInstanced(UINT vertex_count_per_instance, UINT instance_count, UINT start_vertex_location, UINT start_instance_location) - { - logCommand(vertex_count_per_instance, instance_count, start_vertex_location, - start_instance_location); - } - void drawIndexedInstanced(UINT index_count_per_instance, UINT instance_count, UINT start_index_location, INT base_vertex_location, - UINT start_instance_location) - { - logCommand(index_count_per_instance, instance_count, start_index_location, - base_vertex_location, start_instance_location); - } - void setGraphicsRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, - UINT dest_offset_in_32bit_values) - { - logCommand(root_parameter_index, num_32bit_values_to_set, src_data, - dest_offset_in_32bit_values); // exact values don't matter - } - void setGraphicsRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) - { - logCommand(root_parameter_index, base_descriptor); - } - - void setGraphicsRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) - { - logCommand(root_parameter_index, buffer_location); - } - - void iaSetVertexBuffers(UINT start_slot, UINT num_views, const D3D12_VERTEX_BUFFER_VIEW * /*views*/) - { - logCommand(start_slot, num_views /*, views*/); - } - - void iaSetIndexBuffer(const D3D12_INDEX_BUFFER_VIEW *view) - { - logCommand(view ? eastl::optional{*view} : eastl::nullopt); - } - -#if !_TARGET_XBOXONE - void rsSetShadingRate(D3D12_SHADING_RATE base_shading_rate, const D3D12_SHADING_RATE_COMBINER * /*combiners*/) - { - logCommand(base_shading_rate /*, combiners*/); - } - void rsSetShadingRateImage(ID3D12Resource *shading_rate_image) - { - logCommand(shading_rate_image); - } - - void dispatchMesh(UINT thread_group_count_x, UINT thread_group_count_y, UINT thread_group_count_z) - { - logCommand(thread_group_count_x, thread_group_count_y, thread_group_count_z); - } -#endif - -#if D3D_HAS_RAY_TRACING - void buildRaytracingAccelerationStructure(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *dst, - UINT num_postbuild_info_descs, const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC * /*postbuild_info_descs*/) - { - logCommand(*dst, - num_postbuild_info_descs /*, postbuild_info_descs*/); - } - -#if _TARGET_XBOX - COMMAND_LIST_LOGGERS_XBOX() -#endif - - void copyRaytracingAccelerationStructure(D3D12_GPU_VIRTUAL_ADDRESS dst, D3D12_GPU_VIRTUAL_ADDRESS src, - D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) - { - logCommand(dst, src, mode); - } - - void setPipelineState1(ID3D12StateObject *state_object) - { - logCommand(state_object); - } - - void dispatchRays(const D3D12_DISPATCH_RAYS_DESC *desc) { logCommand(*desc); } -#endif -}; // Command list type has to be a template, as those types may be different for different use cases. // Graphics and compute list types are layered on top of this list type and use different @@ -1015,8 +373,10 @@ class CommandListLogger : public CommandLogStorage // T has to expose a VersionedPtr or VersionedComPtr for which Is... is a list of // any of the ID3D12GraphicsCommandList versions. template // -class CopyCommandListImplementation : public CommandListLogger +class CopyCommandListImplementation : public debug::CommandListLogger { + using BaseType = debug::CommandListLogger; + protected: T list; @@ -1107,7 +467,7 @@ class CopyCommandListImplementation : public CommandListLogger }; template // -class CopyCommandListParameterValidataion : public CopyCommandListImplementation +class CopyCommandListParameterValidation : public CopyCommandListImplementation { using BaseType = CopyCommandListImplementation; @@ -1392,8 +752,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation void copyTextureRegion(const D3D12_TEXTURE_COPY_LOCATION *dst, UINT x, UINT y, UINT z, const D3D12_TEXTURE_COPY_LOCATION *src, const D3D12_BOX *src_box) { -#define DX12_VALIDATAION_CONTEXT "CopyTextureRegion" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "CopyTextureRegion" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(dst, "dst can not be null"); DX12_VALIDATE_CONDITION(src, "src can not be null"); @@ -1634,8 +994,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation (uint32_t)srcFormat, (uint32_t)dstFormat); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::copyTextureRegion(dst, x, y, z, src, src_box); } @@ -1648,8 +1008,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation // - src_offset + num_bytes is within the size of src void copyBufferRegion(ID3D12Resource *dst, UINT64 dst_offset, ID3D12Resource *src, UINT64 src_offset, UINT64 num_bytes) { -#define DX12_VALIDATAION_CONTEXT "CopyBufferRegion" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "CopyBufferRegion" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(dst, "dst can not be null"); DX12_VALIDATE_CONDITION(src, "src can not be null"); @@ -1676,8 +1036,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation src_offset + num_bytes, src_offset + num_bytes, size); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::copyBufferRegion(dst, dst_offset, src, src_offset, num_bytes); } @@ -1685,16 +1045,16 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation // NOTE: right now it will drop all barriers if one is wrong! void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER *barriers) { -#define DX12_VALIDATAION_CONTEXT "resourceBarrier" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resourceBarrier" + DX12_BEGIN_VALIDATION(); for (UINT b = 0; b < num_barriers; ++b) { - DX12_UPDATE_VALIATION_STATE(BarrierValidator::validateBarrier(barriers[b])); + DX12_UPDATE_VALIDATION_STATE(BarrierValidator::validateBarrier(barriers[b])); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resourceBarrier(num_barriers, barriers); } @@ -1704,8 +1064,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation // - If the type is D3D12_QUERY_TYPE_TIMESTAMP void endQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) { -#define DX12_VALIDATAION_CONTEXT "endQuery" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "endQuery" + DX12_BEGIN_VALIDATION(); auto device = getDevice(); D3D12_FEATURE_DATA_D3D12_OPTIONS3 level3Options{}; device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &level3Options, sizeof(level3Options)); @@ -1714,8 +1074,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); DX12_VALIDATE_CONDITION(D3D12_QUERY_TYPE_TIMESTAMP == type, "query type (%u) can only be D3D12_QUERY_TYPE_TIMESTAMP", uint32_t(type)); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::endQuery(query_heap, type, index); } @@ -1731,8 +1091,8 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation void resolveQueryData(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT start_index, UINT num_queries, ID3D12Resource *destination_buffer, UINT64 aligned_destination_buffer_offset) { -#define DX12_VALIDATAION_CONTEXT "resolveQueryData" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resolveQueryData" + DX12_BEGIN_VALIDATION(); auto device = getDevice(); D3D12_FEATURE_DATA_D3D12_OPTIONS3 level3Options{}; device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &level3Options, sizeof(level3Options)); @@ -1757,15 +1117,15 @@ class CopyCommandListParameterValidataion : public CopyCommandListImplementation "destination offset plus memory needed to store all query results (%u) (%u) is out of the buffer bounds (%u)", num_queries, aligned_destination_buffer_offset + num_queries * queryResultSize, bufferSize); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resolveQueryData(query_heap, type, start_index, num_queries, destination_buffer, aligned_destination_buffer_offset); } }; #if DX12_VALIDATA_COPY_COMMAND_LIST template // -using CopyCommandList = CopyCommandListParameterValidataion; +using CopyCommandList = CopyCommandListParameterValidation; #else template using CopyCommandList = CopyCommandListImplementation; @@ -1775,6 +1135,7 @@ template class ComputeCommandListImplementation : public CopyCommandList { using BaseType = CopyCommandList; + using CommandListLogger = debug::CommandListLogger; public: using BaseType::BaseType; @@ -1887,7 +1248,7 @@ class ComputeCommandListImplementation : public CopyCommandList }; template -class ComputeCommandListParameterValidataion : public ComputeCommandListImplementation +class ComputeCommandListParameterValidation : public ComputeCommandListImplementation { using BaseType = ComputeCommandListImplementation; @@ -1901,16 +1262,16 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER *barriers) { -#define DX12_VALIDATAION_CONTEXT "resourceBarrier" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resourceBarrier" + DX12_BEGIN_VALIDATION(); for (UINT b = 0; b < num_barriers; ++b) { - DX12_UPDATE_VALIATION_STATE(BarrierValidator::validateBarrier(barriers[b])); + DX12_UPDATE_VALIDATION_STATE(BarrierValidator::validateBarrier(barriers[b])); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resourceBarrier(num_barriers, barriers); } @@ -1921,8 +1282,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If each entry of descriptor_heaps is not null void setDescriptorHeaps(UINT num_descriptor_heaps, ID3D12DescriptorHeap *const *descriptor_heaps) { -#define DX12_VALIDATAION_CONTEXT "clearUnorderedAccessViewFloat" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "clearUnorderedAccessViewFloat" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != num_descriptor_heaps, "num of descriptor heaps can not be 0"); DX12_VALIDATE_CONDITION(2 >= num_descriptor_heaps, "num of descriptor heaps %u must be less or equal than 2", @@ -1936,8 +1297,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen } } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setDescriptorHeaps(num_descriptor_heaps, descriptor_heaps); } @@ -1950,8 +1311,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const FLOAT values[4], UINT num_rects, const D3D12_RECT *rects) { -#define DX12_VALIDATAION_CONTEXT "clearUnorderedAccessViewFloat" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "clearUnorderedAccessViewFloat" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != view_GPU_handle_in_current_heap.ptr, "GPU descriptor can not be 0"); DX12_VALIDATE_CONDITION(0 != view_CPU_handle.ptr, "CPU descriptor can not be 0"); @@ -1961,8 +1322,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen DX12_VALIDATE_CONDITION(nullptr != rects, "rects can not be null when num rects (%u) is not 0", num_rects); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::clearUnorderedAccessViewFloat(view_GPU_handle_in_current_heap, view_CPU_handle, resource, values, num_rects, rects); } @@ -1975,8 +1336,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const UINT values[4], UINT num_rects, const D3D12_RECT *rects) { -#define DX12_VALIDATAION_CONTEXT "clearUnorderedAccessViewUint" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "clearUnorderedAccessViewUint" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != view_GPU_handle_in_current_heap.ptr, "GPU descriptor can not be 0"); DX12_VALIDATE_CONDITION(0 != view_CPU_handle.ptr, "CPU descriptor can not be 0"); @@ -1986,8 +1347,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen DX12_VALIDATE_CONDITION(nullptr != rects, "rects can not be null when num rects (%u) is not 0", num_rects); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::clearUnorderedAccessViewUint(view_GPU_handle_in_current_heap, view_CPU_handle, resource, values, num_rects, rects); } @@ -1995,13 +1356,13 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If root_signature is not null void setComputeRootSignature(ID3D12RootSignature *root_signature) { -#define DX12_VALIDATAION_CONTEXT "setComputeRootSignature" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setComputeRootSignature" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != root_signature, "Root signature can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setComputeRootSignature(root_signature); } @@ -2009,13 +1370,13 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If pipeline_state is not null void setPipelineState(ID3D12PipelineState *pipeline_state) { -#define DX12_VALIDATAION_CONTEXT "setPipelineState" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setPipelineState" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != pipeline_state, "Pipeline state can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setPipelineState(pipeline_state); } @@ -2036,8 +1397,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen void executeIndirect(ID3D12CommandSignature *command_signature, UINT max_command_count, ID3D12Resource *argument_buffer, UINT64 argument_buffer_offset, ID3D12Resource *count_buffer, UINT64 count_buffer_offset) { -#define DX12_VALIDATAION_CONTEXT "executeIndirect" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "executeIndirect" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != command_signature, "Command signature can not be null"); DX12_VALIDATE_CONDITION(nullptr != argument_buffer, "Argument buffer can not be null"); @@ -2057,8 +1418,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen DX12_VALIDATE_CONDITION(0 < size, "Count buffer resource has be a buffer"); DX12_VALIDATE_CONDITION(count_buffer_offset < size, "Count buffer offset %u is out of bounds %u", count_buffer_offset, size); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::executeIndirect(command_signature, max_command_count, argument_buffer, argument_buffer_offset, count_buffer, count_buffer_offset); } @@ -2067,13 +1428,13 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If buffer_location is not 0 void setComputeRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) { -#define DX12_VALIDATAION_CONTEXT "setComputeRootConstantBufferView" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setComputeRootConstantBufferView" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != buffer_location, "Buffer address can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setComputeRootConstantBufferView(root_parameter_index, buffer_location); } @@ -2081,13 +1442,13 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If base_descriptor is not 0 void setComputeRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) { -#define DX12_VALIDATAION_CONTEXT "setComputeRootDescriptorTable" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setComputeRootDescriptorTable" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != base_descriptor.ptr, "Base descriptor can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setComputeRootDescriptorTable(root_parameter_index, base_descriptor); } @@ -2097,14 +1458,14 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen void setComputeRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, UINT dest_offset_in_32bit_values) { -#define DX12_VALIDATAION_CONTEXT "setComputeRoot32BitConstants" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setComputeRoot32BitConstants" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != num_32bit_values_to_set, "Can not set 0 constants"); DX12_VALIDATE_CONDITION(nullptr != src_data, "Source data can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setComputeRoot32BitConstants(root_parameter_index, num_32bit_values_to_set, src_data, dest_offset_in_32bit_values); } @@ -2114,13 +1475,13 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - If the type is D3D12_QUERY_TYPE_TIMESTAMP void endQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) { -#define DX12_VALIDATAION_CONTEXT "endQuery" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "endQuery" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); DX12_VALIDATE_CONDITION(D3D12_QUERY_TYPE_TIMESTAMP == type, "query type (%u) can only be D3D12_QUERY_TYPE_TIMESTAMP", uint32_t(type)); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::endQuery(query_heap, type, index); } @@ -2135,8 +1496,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen void resolveQueryData(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT start_index, UINT num_queries, ID3D12Resource *destination_buffer, UINT64 aligned_destination_buffer_offset) { -#define DX12_VALIDATAION_CONTEXT "resolveQueryData" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resolveQueryData" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); DX12_VALIDATE_CONDITION(nullptr != destination_buffer, "destination buffer can not be null"); DX12_VALIDATE_CONDITION(D3D12_QUERY_TYPE_TIMESTAMP == type, "query type (%u) can only be D3D12_QUERY_TYPE_TIMESTAMP", @@ -2156,8 +1517,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen "destination offset plus memory needed to store all query results (%u) (%u) is out of the buffer bounds (%u)", num_queries, aligned_destination_buffer_offset + num_queries * queryResultSize, bufferSize); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resolveQueryData(query_heap, type, start_index, num_queries, destination_buffer, aligned_destination_buffer_offset); } @@ -2169,8 +1530,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // resource void discardResource(ID3D12Resource *resource, const D3D12_DISCARD_REGION *region) { -#define DX12_VALIDATAION_CONTEXT "discardResource" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "discardResource" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != resource, "resource can not be null"); if (resource) @@ -2191,8 +1552,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen } } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::discardResource(resource, region); } @@ -2202,8 +1563,8 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen // - When buffer is not null then aligned_buffer_offset + 8 is withing the size of buffer void setPredication(ID3D12Resource *buffer, UINT64 aligned_buffer_offset, D3D12_PREDICATION_OP operation) { -#define DX12_VALIDATAION_CONTEXT "setPredication" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setPredication" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 == (aligned_buffer_offset % 8), "buffer offset %u has to be multiples of 8", aligned_buffer_offset); if (buffer) { @@ -2211,15 +1572,15 @@ class ComputeCommandListParameterValidataion : public ComputeCommandListImplemen DX12_VALIDATE_CONDITION(size > 0, "resource has to be a buffer"); DX12_VALIDATE_CONDITION(size >= aligned_buffer_offset + 8, "buffer offset %u is out of bounds %u", aligned_buffer_offset, size); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setPredication(buffer, aligned_buffer_offset, operation); } }; #if DX12_VALIDATE_COMPUTE_COMMAND_LIST template // -using ComputeCommandList = ComputeCommandListParameterValidataion; +using ComputeCommandList = ComputeCommandListParameterValidation; #else template using ComputeCommandList = ComputeCommandListImplementation; @@ -2230,6 +1591,7 @@ template class RaytraceCommandListImplementation : public ComputeCommandList { using BaseType = ComputeCommandList; + using CommandListLogger = debug::CommandListLogger; public: using BaseType::BaseType; @@ -2268,7 +1630,7 @@ class RaytraceCommandListImplementation : public ComputeCommandList }; template -class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplementation +class RaytraceCommandListParameterValidation : public RaytraceCommandListImplementation { using BaseType = RaytraceCommandListImplementation; @@ -2298,8 +1660,8 @@ class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplem void buildRaytracingAccelerationStructure(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *dst, UINT num_postbuild_info_descs, const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *postbuild_info_descs) { -#define DX12_VALIDATAION_CONTEXT "buildRaytracingAccelerationStructure" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "buildRaytracingAccelerationStructure" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != dst, "dst can not be null"); if (dst) { @@ -2350,26 +1712,26 @@ class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplem DX12_VALIDATE_CONDITION(nullptr != postbuild_info_descs, "postbuild info descs can not be null when num postbuild info descs is not 0"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::buildRaytracingAccelerationStructure(dst, num_postbuild_info_descs, postbuild_info_descs); } #if _TARGET_XBOX -#define DX12_VALIDATAION_CONTEXT "buildRaytracing*" +#define DX12_VALIDATION_CONTEXT "buildRaytracing*" RAYTRACE_COMMAND_LIST_VALIDATORS_XBOX() -#undef DX12_VALIDATAION_CONTEXT +#undef DX12_VALIDATION_CONTEXT #endif void copyRaytracingAccelerationStructure(D3D12_GPU_VIRTUAL_ADDRESS dst, D3D12_GPU_VIRTUAL_ADDRESS src, D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) { -#define DX12_VALIDATAION_CONTEXT "buildRaytracingAccelerationStructure" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "buildRaytracingAccelerationStructure" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(dst, "dst can not be null"); DX12_VALIDATE_CONDITION(src, "src can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::copyRaytracingAccelerationStructure(dst, src, mode); } @@ -2377,11 +1739,11 @@ class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplem // - If state_object not null void setPipelineState1(ID3D12StateObject *state_object) { -#define DX12_VALIDATAION_CONTEXT "setPipelineState1" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setPipelineState1" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != state_object, "state object can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setPipelineState1(state_object); } @@ -2402,8 +1764,8 @@ class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplem // - If descs Width times Height times Depth is less than 2 to the power of 30 void dispatchRays(const D3D12_DISPATCH_RAYS_DESC *desc) { -#define DX12_VALIDATAION_CONTEXT "dispatchRays" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "dispatchRays" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != desc, "desc can not be null"); if (desc) { @@ -2446,15 +1808,15 @@ class RaytraceCommandListParameterValidataion : public RaytraceCommandListImplem DX12_VALIDATE_CONDITION(desc->Width * uint64_t(desc->Height) * desc->Depth < (uint64_t(1) << 30), "desc.Width * desc.Height * desc.Depth exceeds 2^30 limit"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::dispatchRays(desc); } }; #if DX12_VALIDATE_RAYTRACE_COMMAND_LIST template // -using RaytraceCommandList = RaytraceCommandListParameterValidataion; +using RaytraceCommandList = RaytraceCommandListParameterValidation; #else template using RaytraceCommandList = RaytraceCommandListImplementation; @@ -2469,6 +1831,7 @@ template class BasicGraphicsCommandListImplementation : public RaytraceCommandList { using BaseType = RaytraceCommandList; + using CommandListLogger = debug::CommandListLogger; public: using BaseType::BaseType; @@ -2627,9 +1990,10 @@ class BasicGraphicsCommandListImplementation : public RaytraceCommandList }; template -class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommandListImplementation +class BasicGraphicsCommandListParameterValidation : public BasicGraphicsCommandListImplementation { using BaseType = BasicGraphicsCommandListImplementation; + using CommandListLogger = debug::CommandListLogger; protected: using BaseType::getBufferSize; @@ -2641,16 +2005,16 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER *barriers) { -#define DX12_VALIDATAION_CONTEXT "resourceBarrier" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resourceBarrier" + DX12_BEGIN_VALIDATION(); for (UINT b = 0; b < num_barriers; ++b) { - DX12_UPDATE_VALIATION_STATE(BarrierValidator::validateBarrier(barriers[b])); + DX12_UPDATE_VALIDATION_STATE(BarrierValidator::validateBarrier(barriers[b])); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resourceBarrier(num_barriers, barriers); } @@ -2660,15 +2024,15 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void clearRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE render_target_view, const FLOAT color_rgba[4], UINT num_rects, const D3D12_RECT *rects) { -#define DX12_VALIDATAION_CONTEXT "clearRenderTargetView" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "clearRenderTargetView" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != render_target_view.ptr, "depth stencil view descriptor can not be 0"); if (num_rects > 0) { DX12_VALIDATE_CONDITION(nullptr != rects, "rects can not be null when num rects (%u) is not 0", num_rects); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::clearRenderTargetView(render_target_view, color_rgba, num_rects, rects); } @@ -2677,12 +2041,12 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void resolveSubresource(ID3D12Resource *dst_resource, UINT dst_subresource, ID3D12Resource *src_resource, UINT src_subresource, DXGI_FORMAT format) { -#define DX12_VALIDATAION_CONTEXT "resolveSubresource" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resolveSubresource" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(dst_resource != nullptr, "dst resource can not be 0"); DX12_VALIDATE_CONDITION(src_resource != nullptr, "src resource can not be 0"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT this->list->ResolveSubresource(dst_resource, dst_subresource, src_resource, src_subresource, format); CommandListLogger::resolveSubresource(dst_resource, dst_subresource, src_resource, src_subresource, format); } @@ -2693,15 +2057,15 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void clearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view, D3D12_CLEAR_FLAGS clear_flags, FLOAT depth, UINT8 stencil, UINT num_rects, const D3D12_RECT *rects) { -#define DX12_VALIDATAION_CONTEXT "clearDepthStencilView" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "clearDepthStencilView" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != depth_stencil_view.ptr, "depth stencil view descriptor can not be 0"); if (num_rects > 0) { DX12_VALIDATE_CONDITION(nullptr != rects, "rects can not be null when num rects (%u) is not 0", num_rects); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::clearDepthStencilView(depth_stencil_view, clear_flags, depth, stencil, num_rects, rects); } @@ -2710,12 +2074,12 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If type is not D3D12_QUERY_TYPE_TIMESTAMP void beginQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) { -#define DX12_VALIDATAION_CONTEXT "beginQuery" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "beginQuery" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); DX12_VALIDATE_CONDITION(D3D12_QUERY_TYPE_TIMESTAMP != type, "D3D12_QUERY_TYPE_TIMESTAMP is a invalid type"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::beginQuery(query_heap, type, index); } @@ -2723,11 +2087,11 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If query_heap is not null void endQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) { -#define DX12_VALIDATAION_CONTEXT "endQuery" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "endQuery" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::endQuery(query_heap, type, index); } @@ -2741,8 +2105,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void resolveQueryData(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT start_index, UINT num_queries, ID3D12Resource *destination_buffer, UINT64 aligned_destination_buffer_offset) { -#define DX12_VALIDATAION_CONTEXT "resolveQueryData" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resolveQueryData" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != query_heap, "query heap can not be null"); DX12_VALIDATE_CONDITION(nullptr != destination_buffer, "destination buffer can not be null"); if (destination_buffer) @@ -2779,8 +2143,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand "destination offset plus memory needed to store all query results (%u) (%u) is out of the buffer bounds (%u)", num_queries, aligned_destination_buffer_offset + num_queries * queryResultSize, bufferSize); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resolveQueryData(query_heap, type, start_index, num_queries, destination_buffer, aligned_destination_buffer_offset); } @@ -2790,12 +2154,12 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void writeBufferImmediate(UINT count, const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER *params, const D3D12_WRITEBUFFERIMMEDIATE_MODE *modes) { -#define DX12_VALIDATAION_CONTEXT "writeBufferImmediate" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "writeBufferImmediate" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != count, "count can not be 0"); DX12_VALIDATE_CONDITION(nullptr != params, "params can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::writeBufferImmediate(count, params, modes); } @@ -2809,8 +2173,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void omSetRenderTargets(UINT num_render_target_descriptors, const D3D12_CPU_DESCRIPTOR_HANDLE *render_target_descriptors, BOOL rts_single_handle_to_descriptor_range, const D3D12_CPU_DESCRIPTOR_HANDLE *depth_stencil_descriptor) { -#define DX12_VALIDATAION_CONTEXT "omSetRenderTargets" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "omSetRenderTargets" + DX12_BEGIN_VALIDATION(); if (num_render_target_descriptors > 0) { DX12_VALIDATE_CONDITION(nullptr != render_target_descriptors, @@ -2834,8 +2198,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand { DX12_VALIDATE_CONDITION(0 != depth_stencil_descriptor->ptr, "depth stencil target descriptor can not be 0"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::omSetRenderTargets(num_render_target_descriptors, render_target_descriptors, rts_single_handle_to_descriptor_range, depth_stencil_descriptor); } @@ -2846,8 +2210,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If device supports depth bounds void omSetDepthBounds(FLOAT min_value, FLOAT max_value) { -#define DX12_VALIDATAION_CONTEXT "omSetDepthBounds" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "omSetDepthBounds" + DX12_BEGIN_VALIDATION(); auto device = this->getDevice(); if (device) { @@ -2861,8 +2225,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // not a validation error when we were not able to retrieve the device from a command list D3D_ERROR("DX12: ID3D12GraphicsCommandList::GetDevice returned null as a device"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::omSetDepthBounds(min_value, max_value); } void omSetBlendFactor(const FLOAT blend_factor[4]) { BaseType::omSetBlendFactor(blend_factor); } @@ -2871,12 +2235,12 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If rects is not null void rsSetScissorRects(UINT num_rects, const D3D12_RECT *rects) { -#define DX12_VALIDATAION_CONTEXT "rsSetScissorRects" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "rsSetScissorRects" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != num_rects, "num of rects can not be 0"); DX12_VALIDATE_CONDITION(nullptr != rects, "rects can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::rsSetScissorRects(num_rects, rects); } // It validates the following properties of the inputs: @@ -2884,12 +2248,12 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If viewports is not null void rsSetViewports(UINT num_viewports, const D3D12_VIEWPORT *viewports) { -#define DX12_VALIDATAION_CONTEXT "rsSetViewports" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "rsSetViewports" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != num_viewports, "num of viewports can not be 0"); DX12_VALIDATE_CONDITION(nullptr != viewports, "viewports can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::rsSetViewports(num_viewports, viewports); } void omSetStencilRef(UINT stencil_ref) { BaseType::omSetStencilRef(stencil_ref); } @@ -2909,27 +2273,27 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand void setGraphicsRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, UINT dest_offset_in_32bit_values) { -#define DX12_VALIDATAION_CONTEXT "setGraphicsRoot32BitConstants" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setGraphicsRoot32BitConstants" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != num_32bit_values_to_set, "Can not set 0 constants"); DX12_VALIDATE_CONDITION(nullptr != src_data, "Source data can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setGraphicsRoot32BitConstants(root_parameter_index, num_32bit_values_to_set, src_data, dest_offset_in_32bit_values); } // It validates the following properties of the inputs: // - If base_descriptor is not 0 void setGraphicsRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) { -#define DX12_VALIDATAION_CONTEXT "setGraphicsRootDescriptorTable" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setGraphicsRootDescriptorTable" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != base_descriptor.ptr, "Base descriptor can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setGraphicsRootDescriptorTable(root_parameter_index, base_descriptor); } @@ -2937,13 +2301,13 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // - If buffer_location is not 0 void setGraphicsRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) { -#define DX12_VALIDATAION_CONTEXT "setGraphicsRootConstantBufferView" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "setGraphicsRootConstantBufferView" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(0 != buffer_location, "Buffer address can not be null"); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::setGraphicsRootConstantBufferView(root_parameter_index, buffer_location); } @@ -2962,8 +2326,8 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand // range of resource void discardResource(ID3D12Resource *resource, const D3D12_DISCARD_REGION *region) { -#define DX12_VALIDATAION_CONTEXT "discardResource" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "discardResource" + DX12_BEGIN_VALIDATION(); DX12_VALIDATE_CONDITION(nullptr != resource, "resource can not be null"); if (resource) @@ -2987,15 +2351,15 @@ class BasicGraphicsCommandListParameterValidataion : public BasicGraphicsCommand } } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::discardResource(resource, region); } }; #if DX12_VALIDATE_GRAPHICS_COMMAND_LIST template // -using BasicGraphicsCommandList = BasicGraphicsCommandListParameterValidataion; +using BasicGraphicsCommandList = BasicGraphicsCommandListParameterValidation; #else template using BasicGraphicsCommandList = BasicGraphicsCommandListImplementation; @@ -3011,6 +2375,7 @@ template class ExtendedGraphicsCommandListImplementation : public BasicGraphicsCommandList { using BaseType = BasicGraphicsCommandList; + using CommandListLogger = debug::CommandListLogger; public: using BaseType::BaseType; @@ -3074,16 +2439,16 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo // Adds validation for the new D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE read state void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER *barriers) { -#define DX12_VALIDATAION_CONTEXT "resourceBarrier" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "resourceBarrier" + DX12_BEGIN_VALIDATION(); for (UINT b = 0; b < num_barriers; ++b) { - DX12_UPDATE_VALIATION_STATE(BarrierValidator::validateBarrier(barriers[b])); + DX12_UPDATE_VALIDATION_STATE(BarrierValidator::validateBarrier(barriers[b])); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::resourceBarrier(num_barriers, barriers); } @@ -3093,8 +2458,8 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo // - if the device supports combiners when they are used void rsSetShadingRate(D3D12_SHADING_RATE base_shading_rate, const D3D12_SHADING_RATE_COMBINER *combiners) { -#define DX12_VALIDATAION_CONTEXT "rsSetShadingRate" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "rsSetShadingRate" + DX12_BEGIN_VALIDATION(); auto device = this->getDevice(); if (device) { @@ -3119,8 +2484,8 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo // not a validation error when we were not able to retrieve the device from a command list D3D_ERROR("DX12: ID3D12GraphicsCommandList::GetDevice returned null as a device"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::rsSetShadingRate(base_shading_rate, combiners); } // Validates the following: @@ -3135,8 +2500,8 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo // - the texture has not the simultaneous access flag void rsSetShadingRateImage(ID3D12Resource *shading_rate_image) { -#define DX12_VALIDATAION_CONTEXT "rsSetShadingRateImage" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "rsSetShadingRateImage" + DX12_BEGIN_VALIDATION(); auto device = this->getDevice(); if (device) { @@ -3170,15 +2535,15 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo DX12_VALIDATE_CONDITION(0 == (D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS & desc.Flags), "shading rate texture can not simultaneous access resource"); } - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::rsSetShadingRateImage(shading_rate_image); } void dispatchMesh(UINT thread_group_count_x, UINT thread_group_count_y, UINT thread_group_count_z) { -#define DX12_VALIDATAION_CONTEXT "dispatchMesh" - DX12_BEGIN_VALIATION(); +#define DX12_VALIDATION_CONTEXT "dispatchMesh" + DX12_BEGIN_VALIDATION(); auto device = this->getDevice(); if (device) { @@ -3205,8 +2570,8 @@ class ExtendedGraphicsCommandListParameterValidation : public ExtendedGraphicsCo static const uint64_t total_count_limit = 1u << 22; DX12_VALIDATE_CONDITION(totalCount <= total_count_limit, "Total thread group size is of %u too large, can not exceed %u", totalCount, total_count_limit); - DX12_FINALIZE_VALIDATAION(); -#undef DX12_VALIDATAION_CONTEXT + DX12_FINALIZE_VALIDATION(); +#undef DX12_VALIDATION_CONTEXT BaseType::dispatchMesh(thread_group_count_x, thread_group_count_y, thread_group_count_z); } }; diff --git a/prog/engine/drv/drv3d_DX12/command_stream_set.h b/prog/engine/drv/drv3d_DX12/command_stream_set.h new file mode 100644 index 000000000..bcea4c702 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/command_stream_set.h @@ -0,0 +1,72 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "driver.h" +#include "versioned_com_ptr.h" +#include "d3d12_error_handling.h" + +#include + + +namespace drv3d_dx12 +{ +template +struct GetSmartPointerOfCommandBufferPointer; + +template +struct GetSmartPointerOfCommandBufferPointer> +{ + using Type = VersionedComPtr; +}; + +template ::Type> +struct CommandStreamSet +{ + ComPtr pool; + dag::Vector lists; + uint32_t listsInUse = 0; + + void init(ID3D12Device *device) { DX12_CHECK_RESULT(device->CreateCommandAllocator(CommandListTypeName, COM_ARGS(&pool))); } + CommandListResultType allocateList(ID3D12Device *device) + { + CommandListResultType result = {}; + if (!pool) + { + return result; + } + if (listsInUse < lists.size()) + { + result = lists[listsInUse++]; + result->Reset(pool.Get(), nullptr); + } + else + { + CommandListStoreType newList; + if (newList.autoQuery([=](auto uuid, auto ptr) // + { return DX12_DEBUG_OK(device->CreateCommandList(0, CommandListTypeName, pool.Get(), nullptr, uuid, ptr)); })) + { + lists.push_back(eastl::move(newList)); + result = lists[listsInUse++]; + } + else + { + D3D_ERROR("DX12: Unable to allocate new command list"); + // can only happen when all CreateCommandList failed and this can only happen when the device was reset. + } + } + return result; + } + void frameReset() + { + DX12_CHECK_RESULT(pool->Reset()); + listsInUse = 0; + } + void shutdown() + { + listsInUse = 0; + lists.clear(); + pool.Reset(); + } +}; +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/const_register_type.h b/prog/engine/drv/drv3d_DX12/const_register_type.h index 84b7ba86a..9dc6cde05 100644 --- a/prog/engine/drv/drv3d_DX12/const_register_type.h +++ b/prog/engine/drv/drv3d_DX12/const_register_type.h @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include - #include "constants.h" +#include +#include + namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/constants.h b/prog/engine/drv/drv3d_DX12/constants.h index 0cba4785d..eae89751b 100644 --- a/prog/engine/drv/drv3d_DX12/constants.h +++ b/prog/engine/drv/drv3d_DX12/constants.h @@ -2,7 +2,7 @@ #pragma once #include "drvCommonConsts.h" - +#include namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/d3d12_d3d_translation.h b/prog/engine/drv/drv3d_DX12/d3d12_d3d_translation.h index fc4139673..698fe620e 100644 --- a/prog/engine/drv/drv3d_DX12/d3d12_d3d_translation.h +++ b/prog/engine/drv/drv3d_DX12/d3d12_d3d_translation.h @@ -1,12 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" + #include #include #include -#include "driver.h" - namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/d3d12_debug_names.h b/prog/engine/drv/drv3d_DX12/d3d12_debug_names.h index 16767ee64..1a2d45f97 100644 --- a/prog/engine/drv/drv3d_DX12/d3d12_debug_names.h +++ b/prog/engine/drv/drv3d_DX12/d3d12_debug_names.h @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" + #include #include -#include "driver.h" - namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/d3d12_error_handling.h b/prog/engine/drv/drv3d_DX12/d3d12_error_handling.h index 36bcc6474..8aafa8d3e 100644 --- a/prog/engine/drv/drv3d_DX12/d3d12_error_handling.h +++ b/prog/engine/drv/drv3d_DX12/d3d12_error_handling.h @@ -1,11 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" #include "d3d12_utils.h" -#include "drv_log_defs.h" + +#include +#include +#include namespace drv3d_dx12 @@ -64,6 +65,7 @@ inline const char *dxgi_error_code_to_string(HRESULT ec) bool dx12_is_gpu_crash_code(HRESULT result); void dx12_check_result_for_gpu_crash_and_enter_error_state(HRESULT result); +DAGOR_NOINLINE inline HRESULT dx12_check_result_no_oom_report(HRESULT result, const char *expr, const char *file, int line) { if (SUCCEEDED(result)) @@ -88,6 +90,7 @@ inline HRESULT dx12_check_result_no_oom_report(HRESULT result, const char *expr, inline bool is_oom_error_code(HRESULT result) { return E_OUTOFMEMORY == result; } +DAGOR_NOINLINE inline HRESULT dx12_check_result(HRESULT result, const char *expr, const char *file, int line) { if (SUCCEEDED(result)) @@ -127,6 +130,7 @@ inline bool is_recoverable_error(HRESULT error) } } +DAGOR_NOINLINE inline HRESULT dx12_debug_result(HRESULT result, const char *expr, const char *file, int line) { if (SUCCEEDED(result)) @@ -147,21 +151,6 @@ inline HRESULT dx12_debug_result(HRESULT result, const char *expr, const char *f return result; } -#define DX12_DEBUG_RESULT(r) drv3d_dx12::dx12_debug_result(r, #r, __FILE__, __LINE__) -#define DX12_DEBUG_OK(r) SUCCEEDED(DX12_DEBUG_RESULT(r)) -#define DX12_DEBUG_FAIL(r) FAILED(DX12_DEBUG_RESULT(r)) - -#define DX12_CHECK_RESULT(r) drv3d_dx12::dx12_check_result(r, #r, __FILE__, __LINE__) -#define DX12_CHECK_OK(r) SUCCEEDED(DX12_CHECK_RESULT(r)) -#define DX12_CHECK_FAIL(r) FAILED(DX12_CHECK_RESULT(r)) -#define DX12_EXIT_ON_FAIL(r) \ - if (DX12_CHECK_FAIL(r)) \ - { \ - /* no-op */ \ - } - -#define DX12_CHECK_RESULT_NO_OOM_CHECK(r) drv3d_dx12::dx12_check_result_no_oom_report(r, #r, __FILE__, __LINE__) - inline void report_resource_alloc_info_error(const D3D12_RESOURCE_DESC &desc) { D3D_ERROR("DX12: Error while querying resource allocation info, resource desc: %s, %u, %u x %u x " @@ -171,3 +160,31 @@ inline void report_resource_alloc_info_error(const D3D12_RESOURCE_DESC &desc) } } // namespace drv3d_dx12 + +#define DX12_DEBUG_RESULT(expr) \ + [result = expr] { \ + return DAGOR_LIKELY(SUCCEEDED(result)) ? result : drv3d_dx12::dx12_debug_result(result, #expr, __FILE__, __LINE__); \ + }() +#define DX12_DEBUG_OK(expr) SUCCEEDED(DX12_DEBUG_RESULT(expr)) +#define DX12_DEBUG_FAIL(expr) FAILED(DX12_DEBUG_RESULT(expr)) + +#define DX12_CHECK_RESULT(expr) \ + [result = expr] { \ + return DAGOR_LIKELY(SUCCEEDED(result)) ? result : drv3d_dx12::dx12_check_result(result, #expr, __FILE__, __LINE__); \ + }() +#define DX12_CHECK_RESULTF(expr, name) \ + [result = expr] { \ + return DAGOR_LIKELY(SUCCEEDED(result)) ? result : drv3d_dx12::dx12_check_result(result, name, __FILE__, __LINE__); \ + }() +#define DX12_CHECK_OK(expr) SUCCEEDED(DX12_CHECK_RESULT(expr)) +#define DX12_CHECK_FAIL(expr) FAILED(DX12_CHECK_RESULT(expr)) +#define DX12_EXIT_ON_FAIL(expr) \ + if (DX12_CHECK_FAIL(expr)) \ + { \ + /* no-op */ \ + } + +#define DX12_CHECK_RESULT_NO_OOM_CHECK(expr) \ + [result = expr] { \ + return DAGOR_LIKELY(SUCCEEDED(result)) ? result : drv3d_dx12::dx12_check_result_no_oom_report(result, #expr, __FILE__, __LINE__); \ + }() diff --git a/prog/engine/drv/drv3d_DX12/d3d12_utils.h b/prog/engine/drv/drv3d_DX12/d3d12_utils.h index 6410d3f53..33f211b2b 100644 --- a/prog/engine/drv/drv3d_DX12/d3d12_utils.h +++ b/prog/engine/drv/drv3d_DX12/d3d12_utils.h @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" #include "util.h" +#include + inline bool operator==(D3D12_CPU_DESCRIPTOR_HANDLE l, D3D12_CPU_DESCRIPTOR_HANDLE r) { return l.ptr == r.ptr; } inline bool operator!=(D3D12_CPU_DESCRIPTOR_HANDLE l, D3D12_CPU_DESCRIPTOR_HANDLE r) { return !(l == r); } diff --git a/prog/engine/drv/drv3d_DX12/debug/call_stack.h b/prog/engine/drv/drv3d_DX12/debug/call_stack.h index f853e4877..34cec9b1d 100644 --- a/prog/engine/drv/drv3d_DX12/debug/call_stack.h +++ b/prog/engine/drv/drv3d_DX12/debug/call_stack.h @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include #include "call_stack_null.h" #include "call_stack_return_address.h" #include "call_stack_full_stack.h" #include "call_stack_selectable.h" +#include namespace drv3d_dx12::debug::call_stack diff --git a/prog/engine/drv/drv3d_DX12/debug/call_stack_full_stack.h b/prog/engine/drv/drv3d_DX12/debug/call_stack_full_stack.h index 5f86a8c51..984045048 100644 --- a/prog/engine/drv/drv3d_DX12/debug/call_stack_full_stack.h +++ b/prog/engine/drv/drv3d_DX12/debug/call_stack_full_stack.h @@ -1,12 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include -#include #include +#include +#include #include +#include +#include #include diff --git a/prog/engine/drv/drv3d_DX12/debug/call_stack_return_address.h b/prog/engine/drv/drv3d_DX12/debug/call_stack_return_address.h index 005668b39..91ba74bb0 100644 --- a/prog/engine/drv/drv3d_DX12/debug/call_stack_return_address.h +++ b/prog/engine/drv/drv3d_DX12/debug/call_stack_return_address.h @@ -2,9 +2,8 @@ #pragma once #include -#include #include - +#include class DataBlock; class String; @@ -16,6 +15,7 @@ class String; #include #include + namespace drv3d_dx12::debug::call_stack::return_address { struct CommandData diff --git a/prog/engine/drv/drv3d_DX12/debug/command_list_logger.h b/prog/engine/drv/drv3d_DX12/debug/command_list_logger.h new file mode 100644 index 000000000..fdb8ca138 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/debug/command_list_logger.h @@ -0,0 +1,695 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if _TARGET_XBOX +#include +#endif + + +template +struct IsSpan : eastl::false_type +{}; + +template +struct IsSpan> : eastl::true_type +{ + using ElementType = T; +}; + +namespace drv3d_dx12::debug +{ +enum class DX12_COMMAND_LOG_ITEM_TYPE : uint32_t +{ +#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) TYPE, +#include +#undef DX12_HARDWARE_COMMAND +}; + +namespace core +{ +template +uint32_t full_log_item_size(ARGS... args); + +template +class CommandLogItem +{ +public: + CommandLogItem(ARGS... args) : args{args...} {} + + eastl::string toString() const + { + return eastl::apply([](ARGS... args) { return make_command_string({to_string(args)...}); }, args); + } + + constexpr static uint32_t static_command_size() { return (static_argument_size() + ... + sizeof(DX12_COMMAND_LOG_ITEM_TYPE)); } + + uint32_t command_size() const + { + return eastl::apply([](ARGS... args) { return full_log_item_size(args...); }, args); + } + +private: + template + constexpr static uint32_t static_argument_size() + { + return IsSpan::value ? 0 : sizeof(ARG_TYPE); + } + + static eastl::string make_command_string(std::initializer_list args) + { + eastl::string result{to_string(command_type)}; + result += "("; + for (auto it = args.begin(); it != args.end(); it++) + { + if (it != args.begin()) + result += ", "; + result.append(it->data(), it->size()); + } + result += ")"; + return result; + } + + template + static eastl::string to_string(T arg) + { + return eastl::to_string(arg); + } + + template + static eastl::string to_string(const eastl::optional &optional_arg) + { + if (!optional_arg) + return "nullptr"; + return to_string(*optional_arg); + } + + template + static eastl::string to_string(const eastl::span &args) + { + eastl::string result{"{"}; + for (auto it = args.cbegin(); it != args.cend(); ++it) + { + if (it != args.cbegin()) + result += ", "; + result += to_string(*it); + } + result += "}"; + return result; + } + + static eastl::string to_string(const eastl::string &arg) { return arg; } + + static eastl::string to_string(D3D12_CPU_DESCRIPTOR_HANDLE arg) + { + eastl::string result; + result.sprintf("0x%x", arg.ptr); + return result; + } + + static eastl::string to_string(D3D12_GPU_DESCRIPTOR_HANDLE arg) + { + eastl::string result; + result.sprintf("0x%x", arg.ptr); + return result; + } + + static eastl::string to_string(const void *arg) + { + eastl::string result; + result.sprintf("0x%p", arg); + return result; + } + + static const char *to_string(DX12_COMMAND_LOG_ITEM_TYPE cmd_type) + { + switch (cmd_type) + { +#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) \ + case DX12_COMMAND_LOG_ITEM_TYPE::TYPE: \ + return COMMAND_NAME; +#include +#undef DX12_HARDWARE_COMMAND + default: D3D_ERROR("Unknown command type %d", (int)cmd_type); return "Unknown"; + } + } + + static eastl::string to_string(ID3D12Resource *arg) { return to_string(static_cast(arg)); } + static eastl::string to_string(ID3D12RootSignature *arg) { return to_string(static_cast(arg)); } + static eastl::string to_string(ID3D12PipelineState *arg) { return to_string(static_cast(arg)); } + static eastl::string to_string(ID3D12CommandSignature *arg) { return to_string(static_cast(arg)); } + static eastl::string to_string(ID3D12QueryHeap *arg) { return to_string(static_cast(arg)); } + static eastl::string to_string(ID3D12DescriptorHeap *arg) { return to_string(static_cast(arg)); } +#if D3D_HAS_RAY_TRACING + static eastl::string to_string(ID3D12StateObject *arg) { return to_string(static_cast(arg)); } +#endif + + static eastl::string to_string(const D3D12_SUBRESOURCE_FOOTPRINT &footprint) + { + eastl::string result; + result.sprintf("{%u, %u, %u, %u, %u}", footprint.Format, footprint.Width, footprint.Height, footprint.Depth, footprint.RowPitch); + return result; + } + + static eastl::string to_string(const D3D12_PLACED_SUBRESOURCE_FOOTPRINT &footprint) + { + eastl::string result; + result.sprintf("{0x%" PRIX64, footprint.Offset); + result.append(to_string(footprint.Footprint)); + result.append("}"); + return result; + } + + static eastl::string to_string(const D3D12_TEXTURE_COPY_LOCATION &location) + { + eastl::string result; + result.sprintf("{0x%p, %u, ", location.pResource, location.Type); + if (location.Type == D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT) + result.append(to_string(location.PlacedFootprint)); + else + result.append_sprintf("%u", location.SubresourceIndex); + result.append("}"); + return result; + } + + static eastl::string to_string(const D3D12_BOX &box) + { + eastl::string result; + result.sprintf("{%u, %u, %u, %u, %u, %u}", box.left, box.top, box.front, box.right, box.bottom, box.back); + return result; + } + + static eastl::string to_string(const D3D12_INDEX_BUFFER_VIEW &index_buffer_view) + { + eastl::string result; + result.sprintf("{0x%" PRIX64 ", %u, %u}", index_buffer_view.BufferLocation, index_buffer_view.SizeInBytes, + index_buffer_view.Format); + return result; + } + + static eastl::string to_string(const D3D12_GPU_VIRTUAL_ADDRESS_RANGE &gpu_virtual_address_range) + { + eastl::string result; + result.sprintf("{0x%" PRIX64 ", %u}", gpu_virtual_address_range.StartAddress, gpu_virtual_address_range.SizeInBytes); + return result; + } + + static eastl::string to_string(const D3D12_GPU_VIRTUAL_ADDRESS_RANGE_AND_STRIDE &gpu_virtual_address_range_and_stride) + { + eastl::string result; + result.sprintf("{0x%" PRIX64 ", %u, %u}", gpu_virtual_address_range_and_stride.StartAddress, + gpu_virtual_address_range_and_stride.SizeInBytes, gpu_virtual_address_range_and_stride.StrideInBytes); + return result; + } + +#if D3D_HAS_RAY_TRACING + static eastl::string to_string(const D3D12_DISPATCH_RAYS_DESC &dispatch_rays_desc) + { + eastl::string result; + result.sprintf("{"); + result.append_sprintf("%s, ", to_string(dispatch_rays_desc.RayGenerationShaderRecord).c_str()); + result.append_sprintf("%s, ", to_string(dispatch_rays_desc.MissShaderTable).c_str()); + result.append_sprintf("%s, ", to_string(dispatch_rays_desc.HitGroupTable).c_str()); + result.append_sprintf("%s, ", to_string(dispatch_rays_desc.CallableShaderTable).c_str()); + result.append_sprintf("{%u, %u, %u}", dispatch_rays_desc.Width, dispatch_rays_desc.Height, dispatch_rays_desc.Depth); + return result; + } + + static eastl::string to_string(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS &inputs) + { + eastl::string result; + result.sprintf("{"); + result.append_sprintf("%s, ", to_string(inputs.Type).c_str()); + result.append_sprintf("%s, ", to_string(inputs.Flags).c_str()); + result.append_sprintf("%s, ", to_string(inputs.NumDescs).c_str()); + result.append_sprintf("%s, ", to_string(inputs.DescsLayout).c_str()); + result.append("{...}}"); /// TODO + return result; + } + + static eastl::string to_string(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC &desc) + { + eastl::string result; + result.sprintf("{"); + result.append_sprintf("%s, ", to_string(desc.DestAccelerationStructureData).c_str()); + result.append_sprintf("%s, ", to_string(desc.Inputs).c_str()); + result.append_sprintf("%s, ", to_string(desc.SourceAccelerationStructureData).c_str()); + result.append_sprintf("%s", to_string(desc.ScratchAccelerationStructureData).c_str()); + result.sprintf("}"); + return result; + } +#endif + + static eastl::string to_string(const D3D12_DISCARD_REGION &discard_region) + { + eastl::string result; + result.sprintf("{%u, {...}, %u, %u}", discard_region.NumRects /*, discard_region.pRects*/, discard_region.FirstSubresource, + discard_region.NumSubresources); /// TODO + return result; + } + + eastl::tuple args; +}; + +template +inline uint32_t full_log_item_size(ARGS... args) +{ + constexpr uint32_t staticCommandSize = CommandLogItem::static_command_size(); + auto getDynamicArgSize = [](auto arg) { + if constexpr (IsSpan::value) + return arg.size_bytes() + sizeof(uint32_t); + else + return 0; + }; + const uint32_t dynamicCommandSize = (getDynamicArgSize(args) + ... + 0); + return staticCommandSize + dynamicCommandSize; +} + +using AnyCommandItemType = eastl::variant +#include +#undef DX12_HARDWARE_COMMAND + >; + +class CommandLogDecoder +{ +public: + static void dump_commands_to_log(eastl::optional> commands_logs) + { + if (!commands_logs) + { + logdbg("Commands log is disabled"); + return; + } + + logdbg("Hardware command list log begin"); + uint32_t offset = 0; + while (offset < commands_logs->size()) + { + auto cmdVariant = decode_command(commands_logs->data() + offset); + logdbg("%s", eastl::visit(CommandToStringVisitor{}, cmdVariant)); + offset += eastl::visit(CommandToSizeVisitor{}, cmdVariant); + } + logdbg("Hardware command list log end"); + } + +private: + struct CommandToStringVisitor + { + template + eastl::string operator()(const COMMAND &cmd) const + { + return cmd.toString(); + } + eastl::string operator()(const eastl::monostate &) const { return "Unknown command"; } + }; + + struct CommandToSizeVisitor + { + template + uint32_t operator()(const COMMAND &cmd) const + { + return cmd.command_size(); + } + uint32_t operator()(const eastl::monostate &) const { return sizeof(DX12_COMMAND_LOG_ITEM_TYPE); } + }; + + template + static ARG_TYPE decode_argument(const unsigned char *&args) + { + if constexpr (IsSpan::value) + { + const uint32_t size = *reinterpret_cast(args); + args += sizeof(uint32_t); + const auto begin = reinterpret_cast::ElementType *>(args); + args += size * sizeof(typename IsSpan::ElementType); + return {begin, size}; + } + else + { + const auto result = *reinterpret_cast(args); + args += sizeof(ARG_TYPE); + return result; + } + } + + template + static AnyCommandItemType decode_command(const unsigned char *args) + { + return CommandLogItem(decode_argument(args)...); + } + + static AnyCommandItemType decode_command(const unsigned char *ptr) + { + const DX12_COMMAND_LOG_ITEM_TYPE cmdType = *reinterpret_cast(ptr); + const auto args = ptr + sizeof(DX12_COMMAND_LOG_ITEM_TYPE); + switch (cmdType) + { +#define DX12_HARDWARE_COMMAND(TYPE, COMMAND_NAME, ...) \ + case DX12_COMMAND_LOG_ITEM_TYPE::TYPE: \ + return decode_command(args); +#include +#undef DX12_HARDWARE_COMMAND + default: + D3D_ERROR("Unknown command type %d", static_cast>(cmdType)); + return eastl::monostate{}; + } + } +}; + +class CommandLogStorage +{ +public: + eastl::optional> getCommands() const + { + return eastl::span{commandsLogs.begin(), commandsLogs.end()}; + } + +protected: + template + auto logCommand(ARG_TYPE... args) + -> decltype(AnyCommandItemType{eastl::declval>()}, void()) + { + const uint32_t commandSize = full_log_item_size(args...); + uint32_t offset = commandsLogs.size(); + commandsLogs.resize(offset + commandSize); + writeToByteStream(command_type, offset); + (writeToByteStream(args, offset), ...); + } + + void reset() { commandsLogs.clear(); } + +private: + template + void writeToByteStream(eastl::span args, uint32_t &offset) + { + writeToByteStream((uint32_t)args.size(), offset); + for (const auto &arg : args) + writeToByteStream(arg, offset); + } + + template + void writeToByteStream(ARG_TYPE arg, uint32_t &offset) + { + constexpr uint32_t size = sizeof(ARG_TYPE); + memcpy(&commandsLogs[offset], &arg, size); + offset += size; + } + + dag::Vector commandsLogs; +}; + +} // namespace core + +namespace null +{ +class CommandLogDecoder +{ +public: + static constexpr void dump_commands_to_log(const eastl::optional> &) {} +}; + +class CommandLogStorage +{ +public: + eastl::optional> getCommands() const { return {}; } + +protected: + template + constexpr void logCommand(ARG_TYPE...) + {} + constexpr void reset() {} +}; + +} // namespace null + +#if DX12_ENABLE_COMMAND_LIST_LOGGER +using namespace core; +#else +using namespace null; +#endif + +class CommandListLogger : public CommandLogStorage +{ +public: + void copyTextureRegion(const D3D12_TEXTURE_COPY_LOCATION *dst, UINT x, UINT y, UINT z, const D3D12_TEXTURE_COPY_LOCATION *src, + const D3D12_BOX *src_box) + { + logCommand(*dst, x, y, z, *src, + src_box ? eastl::optional{*src_box} : eastl::nullopt); + } + + void copyBufferRegion(ID3D12Resource *dst, UINT64 dst_offset, ID3D12Resource *src, UINT64 src_offset, UINT64 num_bytes) + { + logCommand(dst, dst_offset, src, src_offset, num_bytes); + } + + void resourceBarrier(UINT num_barriers, const D3D12_RESOURCE_BARRIER * /*barriers*/) + { + logCommand(num_barriers /*, barriers*/); + } + + void copyResource(ID3D12Resource *dst, ID3D12Resource *src) { logCommand(dst, src); } + + void endQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) + { + logCommand(query_heap, type, index); + } + + void resolveQueryData(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT start_index, UINT num_queries, + ID3D12Resource *destination_buffer, UINT64 aligned_destination_buffer_offset) + { + logCommand(query_heap, type, start_index, num_queries, destination_buffer, + aligned_destination_buffer_offset); + } + + void setDescriptorHeaps(UINT num_descriptor_heaps, ID3D12DescriptorHeap *const *descriptor_heaps) + { + auto heaps = eastl::span(descriptor_heaps, num_descriptor_heaps); + logCommand(num_descriptor_heaps, heaps); + } + + void clearUnorderedAccessViewFloat(D3D12_GPU_DESCRIPTOR_HANDLE view_GPU_handle_in_current_heap, + D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const FLOAT /*values*/[4], UINT num_rects, + const D3D12_RECT * /*rects*/) + { + logCommand(view_GPU_handle_in_current_heap, view_CPU_handle, + resource, + /*values, */ num_rects /*, rects*/); + } + + void clearUnorderedAccessViewUint(D3D12_GPU_DESCRIPTOR_HANDLE view_gpu_handle_in_current_heap, + D3D12_CPU_DESCRIPTOR_HANDLE view_CPU_handle, ID3D12Resource *resource, const UINT /*values*/[4], UINT num_rects, + const D3D12_RECT * /*rects*/) + { + logCommand(view_gpu_handle_in_current_heap, view_CPU_handle, + resource /*, values*/, num_rects /*, rects*/); + } + + void setComputeRootSignature(ID3D12RootSignature *root_signature) + { + logCommand(root_signature); + } + + void setPipelineState(ID3D12PipelineState *pipeline_state) + { + logCommand(pipeline_state); + } + + void dispatch(UINT thread_group_count_x, UINT thread_group_count_y, UINT thread_group_count_z) + { + logCommand(thread_group_count_x, thread_group_count_y, thread_group_count_z); + } + + void executeIndirect(ID3D12CommandSignature *command_signature, UINT max_command_count, ID3D12Resource *argument_buffer, + UINT64 argument_buffer_offset, ID3D12Resource *count_buffer, UINT64 count_buffer_offset) + { + logCommand(command_signature, max_command_count, argument_buffer, + argument_buffer_offset, count_buffer, count_buffer_offset); + } + + void setComputeRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) + { + logCommand(root_parameter_index, buffer_location); + } + + void setComputeRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) + { + logCommand(root_parameter_index, base_descriptor); + } + + void setComputeRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, + UINT dest_offset_in_32bit_values) + { + logCommand(root_parameter_index, num_32bit_values_to_set, src_data, + dest_offset_in_32bit_values); // exact values don't matter + } + + + void discardResource(ID3D12Resource *resource, const D3D12_DISCARD_REGION *region) + { + logCommand(resource, region ? eastl::optional{*region} : eastl::nullopt); + } + + void setPredication(ID3D12Resource *buffer, UINT64 aligned_buffer_offset, D3D12_PREDICATION_OP operation) + { + logCommand(buffer, aligned_buffer_offset, operation); + } + + + void clearRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE render_target_view, const FLOAT /*color_rgba*/[4], UINT num_rects, + const D3D12_RECT * /*rects*/) + { + logCommand(render_target_view, /*color_rgba, */ num_rects /*, rects*/); + } + + void resolveSubresource(ID3D12Resource *dst_resource, UINT dst_subresource, ID3D12Resource *src_resource, UINT src_subresource, + DXGI_FORMAT format) + { + logCommand(dst_resource, dst_subresource, src_resource, src_subresource, format); + } + + void clearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view, D3D12_CLEAR_FLAGS clear_flags, FLOAT depth, UINT8 stencil, + UINT num_rects, const D3D12_RECT * /*rects*/) + { + logCommand(depth_stencil_view, clear_flags, depth, stencil, + num_rects /*, rects*/); + } + + void beginQuery(ID3D12QueryHeap *query_heap, D3D12_QUERY_TYPE type, UINT index) + { + logCommand(query_heap, type, index); + } + + void writeBufferImmediate(UINT count, const D3D12_WRITEBUFFERIMMEDIATE_PARAMETER * /*params*/, + const D3D12_WRITEBUFFERIMMEDIATE_MODE * /*modes*/) + { + logCommand(count /*, params, modes*/); + } + + void omSetRenderTargets(UINT num_render_target_descriptors, const D3D12_CPU_DESCRIPTOR_HANDLE * /*render_target_descriptors*/, + BOOL rts_single_handle_to_descriptor_range, const D3D12_CPU_DESCRIPTOR_HANDLE * /*depth_stencil_descriptor*/) + { + logCommand(num_render_target_descriptors /*, render_target_descriptors*/, + rts_single_handle_to_descriptor_range /*, depth_stencil_descriptor*/); + } + + void setGraphicsRootSignature(ID3D12RootSignature *root_signature) + { + logCommand(root_signature); + } + void iaSetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY primitive_topology) + { + logCommand(primitive_topology); + } + void omSetDepthBounds(FLOAT min_value, FLOAT max_value) + { + logCommand(min_value, max_value); + } + void omSetBlendFactor(const FLOAT /*blend_factor*/[4]) + { + logCommand(/*, blend_factor*/); + } + void rsSetScissorRects(UINT num_rects, const D3D12_RECT * /*rects*/) + { + logCommand(num_rects /*, rects*/); + } + void rsSetViewports(UINT num_viewports, const D3D12_VIEWPORT * /*viewports*/) + { + logCommand(num_viewports /*, viewports*/); + } + void omSetStencilRef(UINT stencil_ref) { logCommand(stencil_ref); } + void drawInstanced(UINT vertex_count_per_instance, UINT instance_count, UINT start_vertex_location, UINT start_instance_location) + { + logCommand(vertex_count_per_instance, instance_count, start_vertex_location, + start_instance_location); + } + void drawIndexedInstanced(UINT index_count_per_instance, UINT instance_count, UINT start_index_location, INT base_vertex_location, + UINT start_instance_location) + { + logCommand(index_count_per_instance, instance_count, start_index_location, + base_vertex_location, start_instance_location); + } + void setGraphicsRoot32BitConstants(UINT root_parameter_index, UINT num_32bit_values_to_set, const void *src_data, + UINT dest_offset_in_32bit_values) + { + logCommand(root_parameter_index, num_32bit_values_to_set, src_data, + dest_offset_in_32bit_values); // exact values don't matter + } + void setGraphicsRootDescriptorTable(UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) + { + logCommand(root_parameter_index, base_descriptor); + } + + void setGraphicsRootConstantBufferView(UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) + { + logCommand(root_parameter_index, buffer_location); + } + + void iaSetVertexBuffers(UINT start_slot, UINT num_views, const D3D12_VERTEX_BUFFER_VIEW * /*views*/) + { + logCommand(start_slot, num_views /*, views*/); + } + + void iaSetIndexBuffer(const D3D12_INDEX_BUFFER_VIEW *view) + { + logCommand(view ? eastl::optional{*view} : eastl::nullopt); + } + +#if !_TARGET_XBOXONE + void rsSetShadingRate(D3D12_SHADING_RATE base_shading_rate, const D3D12_SHADING_RATE_COMBINER * /*combiners*/) + { + logCommand(base_shading_rate /*, combiners*/); + } + void rsSetShadingRateImage(ID3D12Resource *shading_rate_image) + { + logCommand(shading_rate_image); + } + + void dispatchMesh(UINT thread_group_count_x, UINT thread_group_count_y, UINT thread_group_count_z) + { + logCommand(thread_group_count_x, thread_group_count_y, thread_group_count_z); + } +#endif + +#if D3D_HAS_RAY_TRACING + void buildRaytracingAccelerationStructure(const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *dst, + UINT num_postbuild_info_descs, const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC * /*postbuild_info_descs*/) + { + logCommand(*dst, + num_postbuild_info_descs /*, postbuild_info_descs*/); + } + +#if _TARGET_XBOX + COMMAND_LIST_LOGGERS_XBOX() +#endif + + void copyRaytracingAccelerationStructure(D3D12_GPU_VIRTUAL_ADDRESS dst, D3D12_GPU_VIRTUAL_ADDRESS src, + D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE mode) + { + logCommand(dst, src, mode); + } + + void setPipelineState1(ID3D12StateObject *state_object) + { + logCommand(state_object); + } + + void dispatchRays(const D3D12_DISPATCH_RAYS_DESC *desc) { logCommand(*desc); } +#endif +}; + +} // namespace drv3d_dx12::debug \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/debug/command_list_storage.h b/prog/engine/drv/drv3d_DX12/debug/command_list_storage.h index 813c288cb..b94403a1b 100644 --- a/prog/engine/drv/drv3d_DX12/debug/command_list_storage.h +++ b/prog/engine/drv/drv3d_DX12/debug/command_list_storage.h @@ -1,9 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include +#include namespace drv3d_dx12::debug diff --git a/prog/engine/drv/drv3d_DX12/debug/command_list_trace.h b/prog/engine/drv/drv3d_DX12/debug/command_list_trace.h index 31ef1879e..4b0ed6c3a 100644 --- a/prog/engine/drv/drv3d_DX12/debug/command_list_trace.h +++ b/prog/engine/drv/drv3d_DX12/debug/command_list_trace.h @@ -1,14 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "call_stack.h" +#include "pipeline_resource_reporter.h" +#include +#include + #include #include -#include "driver.h" -#include "pipeline_resource_reporter.h" -#include "call_stack.h" -#include "pipeline.h" - inline const char *to_string(D3D12_AUTO_BREADCRUMB_OP op) { diff --git a/prog/engine/drv/drv3d_DX12/debug/command_list_trace_recorder.h b/prog/engine/drv/drv3d_DX12/debug/command_list_trace_recorder.h index f45f62636..452d3f0b8 100644 --- a/prog/engine/drv/drv3d_DX12/debug/command_list_trace_recorder.h +++ b/prog/engine/drv/drv3d_DX12/debug/command_list_trace_recorder.h @@ -1,11 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include #include -#include "driver.h" - namespace drv3d_dx12::debug { diff --git a/prog/engine/drv/drv3d_DX12/debug/configuration.h b/prog/engine/drv/drv3d_DX12/debug/configuration.h index 41584a339..a58c0a1d4 100644 --- a/prog/engine/drv/drv3d_DX12/debug/configuration.h +++ b/prog/engine/drv/drv3d_DX12/debug/configuration.h @@ -5,6 +5,7 @@ #include #include + namespace drv3d_dx12::debug { union Configuration @@ -59,7 +60,7 @@ union Configuration loadPIXCapturer = !gfx->getBool("enableBVH", false) && stricmp(gfx->getStr("bvhMode", "off"), "off") == 0; enableAftermath = true; enableAgsTrace = false; - enableDagorGPUTrace = true; + enableDagorGPUTrace = false; trackPageFaults = true; enableShaderErrorReporting = false; enableDRED = true; diff --git a/prog/engine/drv/drv3d_DX12/debug/device_context_state.h b/prog/engine/drv/drv3d_DX12/debug/device_context_state.h index 7e3b01ea5..434c117f1 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_context_state.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_context_state.h @@ -8,6 +8,7 @@ #include "device_context_state_xbox.h" #endif + namespace drv3d_dx12::debug { #if _TARGET_PC_WIN diff --git a/prog/engine/drv/drv3d_DX12/debug/device_context_state_null.h b/prog/engine/drv/drv3d_DX12/debug/device_context_state_null.h index d72190fb1..3bc524c3a 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_context_state_null.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_context_state_null.h @@ -3,63 +3,78 @@ #include "break_point.h" #include "device_state.h" +#include -namespace drv3d_dx12::debug::null +#include +#include + + +namespace drv3d_dx12 +{ +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; +struct PipelineStageStateBase; +namespace debug::null { class DeviceContextState : public break_point::Controller { public: - void debugBeginCommandBuffer(DeviceState &, D3DDevice *, ID3D12GraphicsCommandList *) {} + constexpr void debugBeginCommandBuffer(DeviceState &, D3DDevice *, ID3D12GraphicsCommandList *) {} - void debugEndCommandBuffer(DeviceState &, ID3D12GraphicsCommandList *) {} + constexpr void debugEndCommandBuffer(DeviceState &, ID3D12GraphicsCommandList *) {} - void debugFramePresent(DeviceState &) {} + constexpr void debugFramePresent(DeviceState &) {} - void debugEventBegin(DeviceState &, ID3D12GraphicsCommandList *, eastl::string_view) {} - void debugEventEnd(DeviceState &, ID3D12GraphicsCommandList *) {} - void debugMarkerSet(DeviceState &, ID3D12GraphicsCommandList *, eastl::string_view) {} + constexpr void debugEventBegin(DeviceState &, ID3D12GraphicsCommandList *, eastl::string_view) {} + constexpr void debugEventEnd(DeviceState &, ID3D12GraphicsCommandList *) {} + constexpr void debugMarkerSet(DeviceState &, ID3D12GraphicsCommandList *, eastl::string_view) {} - void debugFrameCaptureBegin(DeviceState &, ID3D12CommandQueue *, uint32_t, eastl::span) {} + constexpr void debugFrameCaptureBegin(DeviceState &, ID3D12CommandQueue *, uint32_t, eastl::span) {} - void debugFrameCaptureEnd(DeviceState &, ID3D12CommandQueue *) {} + constexpr void debugFrameCaptureEnd(DeviceState &, ID3D12CommandQueue *) {} - void debugFrameCaptureQueueNextFrames(DeviceState &, ID3D12CommandQueue *, uint32_t, eastl::span, int) {} + constexpr void debugFrameCaptureQueueNextFrames(DeviceState &, ID3D12CommandQueue *, uint32_t, eastl::span, int) {} - void debugRecordDraw(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, - BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, uint32_t, D3D12_PRIMITIVE_TOPOLOGY) + constexpr void debugRecordDraw(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, uint32_t, + D3D12_PRIMITIVE_TOPOLOGY) {} - void debugRecordDrawIndexed(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, - BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, int32_t, uint32_t, D3D12_PRIMITIVE_TOPOLOGY) + constexpr void debugRecordDrawIndexed(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, int32_t, uint32_t, + D3D12_PRIMITIVE_TOPOLOGY) {} - void debugDrawIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, - BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &) + constexpr void debugDrawIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &) {} - void debugDrawIndexedIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + constexpr void debugDrawIndexedIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &) {} - void debugDispatchIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, ComputePipeline &, + constexpr void debugDispatchIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, ComputePipeline &, const BufferResourceReferenceAndOffset &) {} - void debugDispatch(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, ComputePipeline &, uint32_t, uint32_t, - uint32_t) + constexpr void debugDispatch(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, ComputePipeline &, uint32_t, + uint32_t, uint32_t) {} - void debugDispatchMesh(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, - BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t) + constexpr void debugDispatchMesh(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t) {} - void debugDispatchMeshIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + constexpr void debugDispatchMeshIndirect(DeviceState &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &, const BufferResourceReferenceAndOffset &, uint32_t) {} - void debugBlit(DeviceState &, D3DGraphicsCommandList *) {} + constexpr void debugBlit(DeviceState &, D3DGraphicsCommandList *) {} - void debugOnDeviceRemoved(DeviceState &, D3DDevice *, HRESULT) {} + constexpr void debugOnDeviceRemoved(DeviceState &, D3DDevice *, HRESULT) {} }; -} // namespace drv3d_dx12::debug::null +} // namespace debug::null +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/debug/device_context_state_pc.h b/prog/engine/drv/drv3d_DX12/debug/device_context_state_pc.h index e53202468..961e165d3 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_context_state_pc.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_context_state_pc.h @@ -3,8 +3,20 @@ #include "break_point.h" #include "device_state.h" +#include -namespace drv3d_dx12::debug::pc +#include +#include + + +namespace drv3d_dx12 +{ +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; +struct PipelineStageStateBase; +namespace debug::pc { class DeviceContextState : public break_point::Controller { @@ -83,4 +95,5 @@ class DeviceContextState : public break_point::Controller void debugOnDeviceRemoved(DeviceState &dds, D3DDevice *device, HRESULT remove_reason) { dds.onDeviceRemoved(device, remove_reason); } }; -} // namespace drv3d_dx12::debug::pc +} // namespace debug::pc +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/debug/device_state.h b/prog/engine/drv/drv3d_DX12/debug/device_state.h index 044dc3933..fde27d761 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_state.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_state.h @@ -7,6 +7,7 @@ #include "device_state_null.h" + namespace drv3d_dx12::debug { #if _TARGET_PC_WIN diff --git a/prog/engine/drv/drv3d_DX12/debug/device_state_null.h b/prog/engine/drv/drv3d_DX12/debug/device_state_null.h index 917b5a98d..a62aa605f 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_state_null.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_state_null.h @@ -4,6 +4,7 @@ #include "call_stack.h" #include "event_marker_tracker.h" + namespace drv3d_dx12 { struct Direct3D12Enviroment; diff --git a/prog/engine/drv/drv3d_DX12/debug/device_state_pc.cpp b/prog/engine/drv/drv3d_DX12/debug/device_state_pc.cpp index 325145313..f8d268ca5 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_state_pc.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/device_state_pc.cpp @@ -1,24 +1,23 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "device_state_pc.h" -#include "device.h" +#include "global_state.h" +#include #if USE_PIX #if _TARGET_64BIT // PROFILE_BUILD will enable USE_PIX in pix3.h if architecture is supported #define PROFILE_BUILD #if !defined(__d3d12_h__) #define __d3d12_h__ -#include "WinPixEventRuntime/pix3.h" +#include #undef __d3d12_h__ #else -#include "WinPixEventRuntime/pix3.h" +#include #endif #endif #endif -#include -#include #if COMMAND_BUFFER_DEBUG_INFO_DEFINED diff --git a/prog/engine/drv/drv3d_DX12/debug/device_state_pc.h b/prog/engine/drv/drv3d_DX12/debug/device_state_pc.h index fcac8004b..292249d0e 100644 --- a/prog/engine/drv/drv3d_DX12/debug/device_state_pc.h +++ b/prog/engine/drv/drv3d_DX12/debug/device_state_pc.h @@ -1,11 +1,27 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include "global_state.h" #include "call_stack.h" #include "event_marker_tracker.h" +#include +#include +#include +#include +#include -namespace drv3d_dx12::debug::pc + +namespace drv3d_dx12 +{ +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; +struct Direct3D12Enviroment; +struct PipelineStageStateBase; +namespace debug +{ +class GlobalState; +namespace pc { class DeviceState : public call_stack::Reporter, protected event_marker::Tracker { @@ -65,4 +81,6 @@ class DeviceState : public call_stack::Reporter, protected event_marker::Tracker private: void processDebugLogImpl(); }; -} // namespace drv3d_dx12::debug::pc +} // namespace pc +} // namespace debug +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/debug/event_marker_tracker.h b/prog/engine/drv/drv3d_DX12/debug/event_marker_tracker.h index fb22c2a54..798714be7 100644 --- a/prog/engine/drv/drv3d_DX12/debug/event_marker_tracker.h +++ b/prog/engine/drv/drv3d_DX12/debug/event_marker_tracker.h @@ -1,11 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include - #include #include -#include namespace drv3d_dx12::debug::event_marker diff --git a/prog/engine/drv/drv3d_DX12/device_context_cmd_log.cpp b/prog/engine/drv/drv3d_DX12/debug/frame_command_logger.cpp similarity index 96% rename from prog/engine/drv/drv3d_DX12/device_context_cmd_log.cpp rename to prog/engine/drv/drv3d_DX12/debug/frame_command_logger.cpp index 126ca1a87..c1f97db80 100644 --- a/prog/engine/drv/drv3d_DX12/device_context_cmd_log.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/frame_command_logger.cpp @@ -1,7 +1,28 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#if DAGOR_DBGLEVEL > 0 -#include "device.h" +#include "frame_command_logger.h" + +// Dependencies of commands +#include "device_queue.h" +#include "fsr_args.h" +#include "fsr2_wrapper.h" +#include "info_types.h" +#include "pipeline.h" +#include "query_manager.h" +#include "resource_memory_heap.h" +#include "swapchain.h" +#include "viewport_state.h" +#include "xess_wrapper.h" +#include <3d/dag_amdFsr.h> +#include <3d/dag_nvFeatures.h> +#include +#include +#include +#include + +#include +#include + using namespace drv3d_dx12; @@ -597,7 +618,7 @@ void append_arg(String &target, T const &, const char *type) return result; \ } -#include "device_context_cmd.inc.h" +#include #undef DX12_BEGIN_CONTEXT_COMMAND #undef DX12_BEGIN_CONTEXT_COMMAND_EXT_1 @@ -610,37 +631,14 @@ void append_arg(String &target, T const &, const char *type) } -namespace drv3d_dx12 -{ - -void DeviceContext::initNextFrameLog() -{ - frameId++; - - activeLogId = (activeLogId + 1) % NumFrameCommandLogs; - frameLogs[activeLogId].frameId = frameId; - GetActiveFrameLog().clear(); -} - -void DeviceContext::dumpCommandLog() +namespace drv3d_dx12::debug::core { - for (int32_t i = 0; i < NumFrameCommandLogs; i++) - { - FrameCommandLog &frameCmdLog = frameLogs[(activeLogId + i + 1) % NumFrameCommandLogs]; - dumpFrameCommandLog(frameCmdLog); - } -} - -void DeviceContext::dumpActiveFrameCommandLog() { dumpFrameCommandLog(frameLogs[activeLogId % NumFrameCommandLogs]); } - -void DeviceContext::dumpFrameCommandLog(FrameCommandLog &frame_log) +void FrameCommandLogger::dumpFrameCommandLog(FrameCommandLog &frame_log, call_stack::Reporter &call_stack_reporter) { String buffer; logdbg("Frame %d log begin", frame_log.frameId); logdbg("--------------------"); - frame_log.log.visitAll([&buffer, this](const auto &value) { logdbg(cmdToStr(buffer, back.sharedContextState, value)); }); + frame_log.log.visitAll([&buffer, &call_stack_reporter](const auto &value) { logdbg(cmdToStr(buffer, call_stack_reporter, value)); }); logdbg("Frame %d log end", frame_log.frameId); } - } -#endif diff --git a/prog/engine/drv/drv3d_DX12/debug/frame_command_logger.h b/prog/engine/drv/drv3d_DX12/debug/frame_command_logger.h new file mode 100644 index 000000000..9bf512745 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/debug/frame_command_logger.h @@ -0,0 +1,109 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "call_stack.h" +#include +#include +#include + +#include +#include + + +namespace drv3d_dx12::debug +{ +namespace core +{ +class FrameCommandLogger +{ + static constexpr size_t NumFrameCommandLogs = 5; + + struct FrameCommandLog + { + VariantVectorRingBuffer log; + uint32_t frameId = 0; + }; + + eastl::array frameLogs; + uint32_t activeLogId = 0; + uint64_t frameId = 0; + +public: + VariantVectorRingBuffer &GetActiveFrameLog() { return frameLogs[activeLogId].log; } + + void initNextFrameLog() + { + frameId++; + + activeLogId = (activeLogId + 1) % NumFrameCommandLogs; + frameLogs[activeLogId].frameId = frameId; + GetActiveFrameLog().clear(); + } + + void dumpCommandLog(call_stack::Reporter &call_stack_reporter) + { + for (int32_t i = 0; i < NumFrameCommandLogs; i++) + { + FrameCommandLog &frameCmdLog = frameLogs[(activeLogId + i + 1) % NumFrameCommandLogs]; + dumpFrameCommandLog(frameCmdLog, call_stack_reporter); + } + } + + void dumpActiveFrameCommandLog(call_stack::Reporter &call_stack_reporter) + { + dumpFrameCommandLog(frameLogs[activeLogId % NumFrameCommandLogs], call_stack_reporter); + } + + void dumpFrameCommandLog(FrameCommandLog &frame_log, call_stack::Reporter &call_stack_reporter); + + template + void logCommand(const ExtendedVariant2 ¶ms) + { + GetActiveFrameLog().pushBack(params.cmd, params.p0.size(), [¶ms](auto index, auto first, auto second) { + first(params.p0[index]); + second(params.p1[index]); + }); + } + + template + void logCommand(const ExtendedVariant ¶ms) + { + GetActiveFrameLog().pushBack(params.cmd, params.p0.data(), params.p0.size()); + } + + template + void logCommand(T cmd) + { + GetActiveFrameLog().pushBack(cmd); + } +}; +} // namespace core + +namespace null +{ +class FrameCommandLogger +{ +public: + constexpr void initNextFrameLog() {} + constexpr void dumpCommandLog(call_stack::Reporter &) {} + constexpr void dumpActiveFrameCommandLog(call_stack::Reporter &) {} + + template + constexpr void logCommand(const ExtendedVariant2 &) + {} + + template + constexpr void logCommand(const ExtendedVariant &) + {} + template + constexpr void logCommand(T) + {} +}; +} // namespace null + +#if DX12_ENABLE_FRAME_COMMAND_LOGGER +using FrameCommandLogger = core::FrameCommandLogger; +#else +using FrameCommandLogger = null::FrameCommandLogger; +#endif +} // namespace drv3d_dx12::debug diff --git a/prog/engine/drv/drv3d_DX12/debug/global_state.cpp b/prog/engine/drv/drv3d_DX12/debug/global_state.cpp index 9c2425296..8cac27d30 100644 --- a/prog/engine/drv/drv3d_DX12/debug/global_state.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/global_state.cpp @@ -1,7 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "global_state.h" -#include "device.h" +#include + namespace drv3d_dx12::debug { diff --git a/prog/engine/drv/drv3d_DX12/debug/global_state.h b/prog/engine/drv/drv3d_DX12/debug/global_state.h index 2703bc91a..3864d7695 100644 --- a/prog/engine/drv/drv3d_DX12/debug/global_state.h +++ b/prog/engine/drv/drv3d_DX12/debug/global_state.h @@ -1,10 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "gpu_capture.h" #include "gpu_postmortem.h" +#include + +#include +#include + typedef HRESULT(WINAPI *PFN_DXGI_GET_DEBUG_INTERFACE1)(UINT Flags, REFIID riid, void **ppFactory); diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_capture.cpp b/prog/engine/drv/drv3d_DX12/debug/gpu_capture.cpp index 4cff4d4f0..de8bb4bfd 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_capture.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_capture.cpp @@ -1,22 +1,23 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "gpu_capture.h" -#include "device.h" +#include "global_state.h" +#include + +#include #if USE_PIX // PROFILE_BUILD will enable USE_PIX in pix3.h if architecture is supported #define PROFILE_BUILD #if !defined(__d3d12_h__) #define __d3d12_h__ -#include "WinPixEventRuntime/pix3.h" +#include #undef __d3d12_h__ #else -#include "WinPixEventRuntime/pix3.h" +#include #endif #endif -#include - #if !defined(PIX_EVENT_UNICODE_VERSION) #define PIX_EVENT_UNICODE_VERSION 0 #endif diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_capture.h b/prog/engine/drv/drv3d_DX12/debug/gpu_capture.h index 122d9b254..c0ff6164b 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_capture.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_capture.h @@ -1,13 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include +#include "configuration.h" +#include + #include +#include #include #include -#include "driver.h" -#include "configuration.h" interface DECLSPEC_UUID("9f251514-9d4d-4902-9d60-18988ab7d4b5") DECLSPEC_NOVTABLE IDXGraphicsAnalysis : public IUnknown { @@ -28,13 +29,13 @@ class NoTool { public: void configure() { logdbg("DX12: ...no frame capturing tool is active..."); } - void beginCapture(const wchar_t *) {} - void endCapture() {} - void onPresent() {} - void captureFrames(const wchar_t *, int) {} - void beginEvent(ID3D12GraphicsCommandList *, eastl::span) {} - void endEvent(ID3D12GraphicsCommandList *) {} - void marker(ID3D12GraphicsCommandList *, eastl::span) {} + constexpr void beginCapture(const wchar_t *) {} + constexpr void endCapture() {} + constexpr void onPresent() {} + constexpr void captureFrames(const wchar_t *, int) {} + constexpr void beginEvent(ID3D12GraphicsCommandList *, eastl::span) {} + constexpr void endEvent(ID3D12GraphicsCommandList *) {} + constexpr void marker(ID3D12GraphicsCommandList *, eastl::span) {} }; class RenderDoc diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem.h index 62cf9e84b..02ee18706 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem.h @@ -3,8 +3,8 @@ #include "call_stack.h" -#include #include +#include #if HAS_GF_AFTERMATH #include @@ -22,6 +22,7 @@ #include "gpu_postmortem_ags_trace.h" #endif + namespace drv3d_dx12::debug { namespace detail diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.cpp b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.cpp index ae466deff..6fa428313 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.cpp @@ -2,6 +2,7 @@ #include "gpu_postmortem_ags_trace.h" + namespace drv3d_dx12::debug::gpu_postmortem::ags { AgsTrace::~AgsTrace() diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.h index 09d4ad601..2a1a657b6 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_ags_trace.h @@ -1,18 +1,22 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "call_stack.h" #include "configuration.h" -#include "pipeline.h" +#include #include +#include namespace drv3d_dx12 { +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; struct Direct3D12Enviroment; +struct PipelineStageStateBase; namespace debug { union Configuration; @@ -28,43 +32,43 @@ class AgsTrace ~AgsTrace(); void configure() { logdbg("DX12: ...no GPU postmortem tracer active..."); } - void beginCommandBuffer(ID3D12Device3 *, ID3D12GraphicsCommandList *) {} - void endCommandBuffer(ID3D12GraphicsCommandList *) {} + constexpr void beginCommandBuffer(ID3D12Device3 *, ID3D12GraphicsCommandList *) {} + constexpr void endCommandBuffer(ID3D12GraphicsCommandList *) {} void beginEvent(ID3D12GraphicsCommandList *, eastl::span, const eastl::string &); void endEvent(ID3D12GraphicsCommandList *, const eastl::string &); - void marker(ID3D12GraphicsCommandList *, eastl::span) {} - void draw(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + constexpr void marker(ID3D12GraphicsCommandList *, eastl::span) {} + constexpr void draw(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, uint32_t, D3D12_PRIMITIVE_TOPOLOGY) {} - void drawIndexed(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + constexpr void drawIndexed(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t, int32_t, uint32_t, D3D12_PRIMITIVE_TOPOLOGY) {} - void drawIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + constexpr void drawIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &) {} - void drawIndexedIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + constexpr void drawIndexedIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &) {} - void dispatchIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + constexpr void dispatchIndirect(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, ComputePipeline &, const BufferResourceReferenceAndOffset &) {} - void dispatch(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, ComputePipeline &, - uint32_t, uint32_t, uint32_t) + constexpr void dispatch(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *, const PipelineStageStateBase &, + ComputePipeline &, uint32_t, uint32_t, uint32_t) {} - void dispatchMesh(const call_stack::CommandData &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + constexpr void dispatchMesh(const call_stack::CommandData &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, uint32_t, uint32_t, uint32_t) {} - void dispatchMeshIndirect(const call_stack::CommandData &, D3DGraphicsCommandList *, const PipelineStageStateBase &, + constexpr void dispatchMeshIndirect(const call_stack::CommandData &, D3DGraphicsCommandList *, const PipelineStageStateBase &, const PipelineStageStateBase &, BasePipeline &, PipelineVariant &, const BufferResourceReferenceAndOffset &, const BufferResourceReferenceAndOffset &, uint32_t) {} - void blit(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *) {} + constexpr void blit(const call_stack::CommandData &, ID3D12GraphicsCommandList2 *) {} void onDeviceRemoved(D3DDevice *, HRESULT, call_stack::Reporter &); - bool sendGPUCrashDump(const char *, const void *, uintptr_t) { return false; } - void onDeviceShutdown() {} - bool onDeviceSetup(ID3D12Device *, const Configuration &, const Direct3D12Enviroment &) { return true; } + constexpr bool sendGPUCrashDump(const char *, const void *, uintptr_t) { return false; } + constexpr void onDeviceShutdown() {} + constexpr bool onDeviceSetup(ID3D12Device *, const Configuration &, const Direct3D12Enviroment &) { return true; } template static bool load(const Configuration &config, const Direct3D12Enviroment &, T &target) diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.cpp b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.cpp index d17d77a11..0b6701cda 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.cpp @@ -1,7 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "gpu_postmortem_dagor_trace.h" -#include "device.h" +#include "configuration.h" +#include "gpu_postmortem_microsoft_dred.h" +#include + namespace drv3d_dx12::debug::gpu_postmortem::dagor { diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.h index 993d4b04c..d388fafe5 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_dagor_trace.h @@ -1,16 +1,21 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "command_list_storage.h" #include "command_list_trace.h" #include "command_list_trace_recorder.h" +#include + namespace drv3d_dx12 { +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; struct Direct3D12Enviroment; +struct PipelineStageStateBase; namespace debug { union Configuration; diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.cpp b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.cpp index 3a180de86..aa15d2774 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.cpp @@ -1,7 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "gpu_postmortem_microsoft_dred.h" -#include "device.h" +#include "configuration.h" +#include namespace { @@ -142,8 +143,6 @@ void DeviceRemovedExtendedData::walkBreadcumbs(const D3D12_AUTO_BREADCRUMB_NODE } } -void DeviceRemovedExtendedData::configure() {} - void DeviceRemovedExtendedData::beginCommandBuffer(ID3D12Device *, ID3D12GraphicsCommandList *cmd) { commandListTable.beginList(cmd).beginTrace(); @@ -252,9 +251,6 @@ void DeviceRemovedExtendedData::onDeviceRemoved(D3DDevice *device, HRESULT reaso report_page_fault(dred.Get()); } -bool DeviceRemovedExtendedData::sendGPUCrashDump(const char *, const void *, uintptr_t) { return false; } - void DeviceRemovedExtendedData::onDeviceShutdown() { commandListTable.reset(); } -bool DeviceRemovedExtendedData::onDeviceSetup(ID3D12Device *, const Configuration &, const Direct3D12Enviroment &) { return true; } } // namespace drv3d_dx12::debug::gpu_postmortem::microsoft diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.h index 2eb0c395f..dd2b65eae 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_microsoft_dred.h @@ -5,6 +5,7 @@ #include "command_list_trace.h" #include "command_list_trace_recorder.h" + inline const char *to_string(D3D12_DRED_ALLOCATION_TYPE type) { switch (type) @@ -113,7 +114,12 @@ inline void report_page_fault(ID3D12DeviceRemovedExtendedData *dred) namespace drv3d_dx12 { +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; struct Direct3D12Enviroment; +struct PipelineStageStateBase; namespace debug { union Configuration; @@ -146,7 +152,7 @@ class DeviceRemovedExtendedData DeviceRemovedExtendedData &operator=(DeviceRemovedExtendedData &&) = delete; DeviceRemovedExtendedData() = default; ~DeviceRemovedExtendedData() { logdbg("DX12: Shutting down DRED"); } - void configure(); + constexpr void configure() {} void beginCommandBuffer(ID3D12Device *device, ID3D12GraphicsCommandList *cmd); void endCommandBuffer(ID3D12GraphicsCommandList *); void beginEvent(ID3D12GraphicsCommandList *, eastl::span, const eastl::string &); @@ -175,11 +181,11 @@ class DeviceRemovedExtendedData const BufferResourceReferenceAndOffset &args, const BufferResourceReferenceAndOffset &count, uint32_t max_count); void blit(const call_stack::CommandData &debug_info, D3DGraphicsCommandList *cmd); void onDeviceRemoved(D3DDevice *device, HRESULT reason, call_stack::Reporter &reporter); - bool sendGPUCrashDump(const char *, const void *, uintptr_t); + constexpr bool sendGPUCrashDump(const char *, const void *, uintptr_t) { return false; } void onDeviceShutdown(); - bool onDeviceSetup(ID3D12Device *, const Configuration &, const Direct3D12Enviroment &); + constexpr bool onDeviceSetup(ID3D12Device *, const Configuration &, const Direct3D12Enviroment &) { return true; } - bool tryCreateDevice(IUnknown *, D3D_FEATURE_LEVEL, void **) { return false; } + constexpr bool tryCreateDevice(IUnknown *, D3D_FEATURE_LEVEL, void **) { return false; } template static bool load(const Configuration &config, const Direct3D12Enviroment &d3d_env, T &target) diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_null_trace.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_null_trace.h index 40ce20554..9c85c5ad4 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_null_trace.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_null_trace.h @@ -2,13 +2,17 @@ #pragma once #include "call_stack.h" -#include #include namespace drv3d_dx12 { +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; struct Direct3D12Enviroment; +struct PipelineStageStateBase; namespace debug { union Configuration; diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.cpp b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.cpp index b8e822c2f..668a93693 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.cpp @@ -1,12 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "gpu_postmortem_nvidia_aftermath.h" -#include "device.h" +#include +#include #include +#include #include #include -#include namespace { diff --git a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.h b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.h index a824aa2da..2bc41d2bf 100644 --- a/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.h +++ b/prog/engine/drv/drv3d_DX12/debug/gpu_postmortem_nvidia_aftermath.h @@ -1,16 +1,15 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "call_stack.h" +#include "command_list_storage.h" +#include "configuration.h" +#include + #include #include #include -#include "driver.h" -#include "pipeline.h" -#include "command_list_storage.h" -#include "call_stack.h" -#include "configuration.h" - // These headers are not self-contained and need to be included after driver.h #include #include @@ -19,7 +18,12 @@ namespace drv3d_dx12 { +class BasePipeline; +class ComputePipeline; +class PipelineVariant; +struct BufferResourceReferenceAndOffset; struct Direct3D12Enviroment; +struct PipelineStageStateBase; namespace debug::gpu_postmortem::nvidia { diff --git a/prog/engine/drv/drv3d_DX12/debug/pipeline_resource_reporter.cpp b/prog/engine/drv/drv3d_DX12/debug/pipeline_resource_reporter.cpp index 7caa17b10..dec0ed97c 100644 --- a/prog/engine/drv/drv3d_DX12/debug/pipeline_resource_reporter.cpp +++ b/prog/engine/drv/drv3d_DX12/debug/pipeline_resource_reporter.cpp @@ -1,7 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "pipeline_resource_reporter.h" -#include "device.h" +#include +#include using namespace drv3d_dx12; diff --git a/prog/engine/drv/drv3d_DX12/derived_span.h b/prog/engine/drv/drv3d_DX12/derived_span.h index cf88d7fdf..3a63d3b2d 100644 --- a/prog/engine/drv/drv3d_DX12/derived_span.h +++ b/prog/engine/drv/drv3d_DX12/derived_span.h @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include #include diff --git a/prog/engine/drv/drv3d_DX12/descriptor_heap.h b/prog/engine/drv/drv3d_DX12/descriptor_heap.h index d52fb8c5f..7ed47dabc 100644 --- a/prog/engine/drv/drv3d_DX12/descriptor_heap.h +++ b/prog/engine/drv/drv3d_DX12/descriptor_heap.h @@ -1,14 +1,16 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include - -#include "driver.h" #include "d3d12_error_handling.h" #include "d3d12_utils.h" -#include "value_range.h" +#include "driver.h" + +#include +#include +#include +#include +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/device.cpp b/prog/engine/drv/drv3d_DX12/device.cpp index cd65f171e..1bb734f03 100644 --- a/prog/engine/drv/drv3d_DX12/device.cpp +++ b/prog/engine/drv/drv3d_DX12/device.cpp @@ -2,10 +2,15 @@ #include "device.h" -#include +#if _TARGET_PC_WIN +#include "debug/global_state.h" +#endif + +#include #include #include -#include "../drv3d_commonCode/dxgi_utils.h" +#include + using namespace drv3d_dx12; @@ -1419,6 +1424,7 @@ LUID Device::preRecovery() // reporting errors during wind down phase and result in a stuck thread, we wait to finish for. auto errorObserverShutdownToken = enterDeviceErrorObserverInShutdownMode(); // also shuts down the swapchain + nvlowlatency::close(); context.preRecovery(); for (auto &handler : deviceResetEventHandlers) handler->preRecovery(); @@ -1433,6 +1439,7 @@ LUID Device::preRecovery() DXGI_ADAPTER_DESC desc = {}; adapter->GetDesc(&desc); adapter.Reset(); + context.shutdownStreamline(); bindlessManager.preRecovery(); return desc.AdapterLuid; } @@ -1459,10 +1466,7 @@ bool Device::recover(DXGIFactory *factory, ComPtr input_adapter, } logdbg("DX12: ...Device has been successfully recreated"); - nvlowlatency::close(); - - context.shutdownStreamline(); - context.initStreamline(&factory, this->adapter.Get()); + context.initStreamline(&factory, adapter.Get()); debug::DeviceState::recover(device.get(), d3d_env); startDeviceErrorObserver(device.get()); @@ -1629,140 +1633,6 @@ Image *Device::placeTextureInHeap(::ResourceHeap *heap, const ResourceDescriptio return result.image; } -/* - ************** - * FrameInfo * - ************** - */ -void FrameInfo::init(ID3D12Device *device) -{ - genericCommands.init(device); - computeCommands.init(device); - earlyUploadCommands.init(device); - lateUploadCommands.init(device); - readBackCommands.init(device); - - resourceViewHeaps = ShaderResourceViewDescriptorHeapManager // - {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)}; - samplerHeaps = SamplerDescriptorHeapManager // - {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)}; - - progressEvent.reset(CreateEvent(nullptr, FALSE, FALSE, nullptr)); -} -void FrameInfo::shutdown(DeviceQueueGroup &queue_group, PipelineManager &pipe_man) -{ - // have to check if the queue group was initialized properly to wait on frame progress - // also if progress is 0, this frame info was never used - if (queue_group.canWaitOnFrameProgress() && progress > 0) - { - wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::shutdown"); - } - - genericCommands.shutdown(); - computeCommands.shutdown(); - earlyUploadCommands.shutdown(); - lateUploadCommands.shutdown(); - readBackCommands.shutdown(); - - for (auto &&prog : deletedPrograms) - pipe_man.removeProgram(prog); - deletedPrograms.clear(); - - for (auto &&prog : deletedGraphicPrograms) - pipe_man.removeProgram(prog); - deletedGraphicPrograms.clear(); - - deletedShaderModules.clear(); - - resourceViewHeaps = ShaderResourceViewDescriptorHeapManager{}; - samplerHeaps = SamplerDescriptorHeapManager{}; - - backendQueryManager.shutdown(); -} - -int64_t FrameInfo::beginFrame(DeviceQueueGroup &queue_group, PipelineManager &pipe_man, uint32_t frame_idx) -{ - auto waitTicks = ref_time_ticks(); - wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::beginFrame"); - waitTicks = ref_time_ticks() - waitTicks; - - frameIndex = frame_idx; - - backendQueryManager.flush(); - - genericCommands.frameReset(); - computeCommands.frameReset(); - earlyUploadCommands.frameReset(); - lateUploadCommands.frameReset(); - readBackCommands.frameReset(); - - for (auto &&prog : deletedPrograms) - pipe_man.removeProgram(prog); - deletedPrograms.clear(); - - for (auto &&prog : deletedGraphicPrograms) - pipe_man.removeProgram(prog); - deletedGraphicPrograms.clear(); - - deletedShaderModules.clear(); - - // usual ranges are from sub 100 to about 2k on resources and sub 100 to about 300 for samplers -#if DX12_REPORT_DESCRIPTOR_USES - logdbg("DX12: Frame %u used %u resource descriptors", progress, resourceViewHeaps.getTotalUsedDescriptors()); - logdbg("DX12: Frame %u used %u sampler descriptors", progress, samplerHeaps.getTotalUsedDescriptors()); -#endif - - resourceViewHeaps.clearScratchSegments(); - samplerHeaps.clearScratchSegment(); - - return waitTicks; -} - -void FrameInfo::preRecovery(DeviceQueueGroup &queue_group, PipelineManager &pipe_man) -{ - wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::preRecovery"); - - genericCommands.shutdown(); - computeCommands.shutdown(); - earlyUploadCommands.shutdown(); - lateUploadCommands.shutdown(); - readBackCommands.shutdown(); - - for (auto &&prog : deletedPrograms) - pipe_man.removeProgram(prog); - deletedPrograms.clear(); - - for (auto &&prog : deletedGraphicPrograms) - pipe_man.removeProgram(prog); - deletedGraphicPrograms.clear(); - - // handle? - // dag::Vector deletedPrograms; - deletedShaderModules.clear(); - resourceViewHeaps = ShaderResourceViewDescriptorHeapManager{}; - samplerHeaps = SamplerDescriptorHeapManager{}; - backendQueryManager.shutdown(); - progress = 0; -} - -void FrameInfo::recover(ID3D12Device *device) -{ -#if _TARGET_PC_WIN - genericCommands.init(device); - computeCommands.init(device); - earlyUploadCommands.init(device); - lateUploadCommands.init(device); - readBackCommands.init(device); - - resourceViewHeaps = ShaderResourceViewDescriptorHeapManager // - {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)}; - samplerHeaps = SamplerDescriptorHeapManager // - {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)}; -#else - G_UNUSED(device); -#endif -} - namespace { void load_config_into_memory_setup(ResourceMemoryHeap::SetupInfo &setup, const DataBlock *config) diff --git a/prog/engine/drv/drv3d_DX12/device.h b/prog/engine/drv/drv3d_DX12/device.h index 3c669232f..315ad9fdf 100644 --- a/prog/engine/drv/drv3d_DX12/device.h +++ b/prog/engine/drv/drv3d_DX12/device.h @@ -1,32 +1,34 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - -#include "driver.h" -#include "platform.h" -#include "device_queue.h" -#include "shader.h" -#include "pipeline_cache.h" -#include "descriptor_heap.h" -#include "swapchain.h" -#include "pipeline.h" #include "bindless.h" +#include "debug/device_state.h" +#include "descriptor_heap.h" #include "device_context.h" -#include "query_manager.h" -#include "tagged_handles.h" +#include "device_features_config.h" +#include "device_queue.h" +#include "driver.h" +#include "pipeline.h" #include "pipeline/blk_cache.h" +#include "pipeline_cache.h" +#include "platform.h" +#include "query_manager.h" #include "resource_manager/image.h" +#include "shader.h" #include "shader_library.h" +#include "swapchain.h" +#include "tagged_handles.h" -#include #include -#include +#include +#include #include +#include #include -#include #include -#include +#include +#include + namespace drv3d_dx12 { @@ -1809,6 +1811,10 @@ inline bool DeviceContext::isVrrSupported() const { return back.swapchain.isVrrS inline bool DeviceContext::isVsyncOn() const { return front.swapchain.isVsyncOn(); } +inline bool DeviceContext::isHfrSupported() const { return back.swapchain.isHfrSupported(); } + +inline bool DeviceContext::isHfrEnabled() const { return back.swapchain.isHfrEnabled(); } + inline FormatStore DeviceContext::getSwapchainColorFormat() const { return front.swapchain.getColorFormat(); } inline FormatStore DeviceContext::getSwapchainSecondaryColorFormat() const { return front.swapchain.getSecondaryColorFormat(); } diff --git a/prog/engine/drv/drv3d_DX12/device_caps_and_shader_model.h b/prog/engine/drv/drv3d_DX12/device_caps_and_shader_model.h index 8cab05fb5..1d66fb9c3 100644 --- a/prog/engine/drv/drv3d_DX12/device_caps_and_shader_model.h +++ b/prog/engine/drv/drv3d_DX12/device_caps_and_shader_model.h @@ -1,8 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include #include "d3d_cap_set_xmacro.h" +#include "driver.h" +#include struct DeviceCapsAndShaderModel diff --git a/prog/engine/drv/drv3d_DX12/device_context.cpp b/prog/engine/drv/drv3d_DX12/device_context.cpp index a3d0f2ab6..828e8d180 100644 --- a/prog/engine/drv/drv3d_DX12/device_context.cpp +++ b/prog/engine/drv/drv3d_DX12/device_context.cpp @@ -1,33 +1,28 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "device_context.h" +#include "frontend_state.h" +#include "render_target_mask_util.h" -#include -#include -#include -#include -#include -#include <3d/dag_lowLatency.h> #include <3d/dag_gpuConfig.h> - +#include <3d/dag_lowLatency.h> +#include +#include #include +#include +#include +#include +#include +#include +#include #if _TARGET_XBOX #include // make_thread_time_sensitive -#endif - -#include -#include - -#include "frontend_state.h" -#include "render_target_mask_util.h" - -#include "amdFsr.h" - -#if !_TARGET_XBOX +#else #include #endif + #define DX12_LOCK_FRONT() WinAutoLock lock(getFrontGuard()) using namespace drv3d_dx12; @@ -129,6 +124,204 @@ TextureMipsCopyInfo drv3d_dx12::calculate_texture_mips_copy_info(const Image &te return copies; } +void FrameInfo::init(ID3D12Device *device) +{ + genericCommands.init(device); + computeCommands.init(device); + earlyUploadCommands.init(device); + lateUploadCommands.init(device); + readBackCommands.init(device); + + resourceViewHeaps = ShaderResourceViewDescriptorHeapManager // + {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)}; + samplerHeaps = SamplerDescriptorHeapManager // + {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)}; + + progressEvent.reset(CreateEvent(nullptr, FALSE, FALSE, nullptr)); +} +void FrameInfo::shutdown(DeviceQueueGroup &queue_group, PipelineManager &pipe_man) +{ + // have to check if the queue group was initialized properly to wait on frame progress + // also if progress is 0, this frame info was never used + if (queue_group.canWaitOnFrameProgress() && progress > 0) + { + wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::shutdown"); + } + + genericCommands.shutdown(); + computeCommands.shutdown(); + earlyUploadCommands.shutdown(); + lateUploadCommands.shutdown(); + readBackCommands.shutdown(); + + for (auto &&prog : deletedPrograms) + pipe_man.removeProgram(prog); + deletedPrograms.clear(); + + for (auto &&prog : deletedGraphicPrograms) + pipe_man.removeProgram(prog); + deletedGraphicPrograms.clear(); + + deletedShaderModules.clear(); + + resourceViewHeaps = ShaderResourceViewDescriptorHeapManager{}; + samplerHeaps = SamplerDescriptorHeapManager{}; + + backendQueryManager.shutdown(); +} + +int64_t FrameInfo::beginFrame(DeviceQueueGroup &queue_group, PipelineManager &pipe_man, uint32_t frame_idx) +{ + auto waitTicks = ref_time_ticks(); + wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::beginFrame"); + waitTicks = ref_time_ticks() - waitTicks; + + frameIndex = frame_idx; + + backendQueryManager.flush(); + + genericCommands.frameReset(); + computeCommands.frameReset(); + earlyUploadCommands.frameReset(); + lateUploadCommands.frameReset(); + readBackCommands.frameReset(); + + for (auto &&prog : deletedPrograms) + pipe_man.removeProgram(prog); + deletedPrograms.clear(); + + for (auto &&prog : deletedGraphicPrograms) + pipe_man.removeProgram(prog); + deletedGraphicPrograms.clear(); + + deletedShaderModules.clear(); + + // usual ranges are from sub 100 to about 2k on resources and sub 100 to about 300 for samplers +#if DX12_REPORT_DESCRIPTOR_USES + logdbg("DX12: Frame %u used %u resource descriptors", progress, resourceViewHeaps.getTotalUsedDescriptors()); + logdbg("DX12: Frame %u used %u sampler descriptors", progress, samplerHeaps.getTotalUsedDescriptors()); +#endif + + resourceViewHeaps.clearScratchSegments(); + samplerHeaps.clearScratchSegment(); + + return waitTicks; +} + +void FrameInfo::preRecovery(DeviceQueueGroup &queue_group, PipelineManager &pipe_man) +{ + wait_for_frame_progress_with_event(queue_group, progress, progressEvent.get(), "FrameInfo::preRecovery"); + + genericCommands.shutdown(); + computeCommands.shutdown(); + earlyUploadCommands.shutdown(); + lateUploadCommands.shutdown(); + readBackCommands.shutdown(); + + for (auto &&prog : deletedPrograms) + pipe_man.removeProgram(prog); + deletedPrograms.clear(); + + for (auto &&prog : deletedGraphicPrograms) + pipe_man.removeProgram(prog); + deletedGraphicPrograms.clear(); + + // handle? + // dag::Vector deletedPrograms; + deletedShaderModules.clear(); + resourceViewHeaps = ShaderResourceViewDescriptorHeapManager{}; + samplerHeaps = SamplerDescriptorHeapManager{}; + backendQueryManager.shutdown(); + progress = 0; +} + +void FrameInfo::recover(ID3D12Device *device) +{ +#if _TARGET_PC_WIN + genericCommands.init(device); + computeCommands.init(device); + earlyUploadCommands.init(device); + lateUploadCommands.init(device); + readBackCommands.init(device); + + resourceViewHeaps = ShaderResourceViewDescriptorHeapManager // + {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)}; + samplerHeaps = SamplerDescriptorHeapManager // + {device, device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)}; +#else + G_UNUSED(device); +#endif +} + +ID3D12CommandSignature *SignatureStore::getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type) +{ + auto ref = eastl::find_if(begin(signatures), end(signatures), + [=](const SignatureInfo &si) { return si.type == type && si.stride == stride; }); + if (end(signatures) == ref) + { + D3D12_INDIRECT_ARGUMENT_DESC arg; + D3D12_COMMAND_SIGNATURE_DESC desc; + desc.NumArgumentDescs = 1; + desc.pArgumentDescs = &arg; + desc.NodeMask = 0; + + arg.Type = type; + desc.ByteStride = stride; + + SignatureInfo info; + info.stride = stride; + info.type = type; + if (!DX12_CHECK_OK(device->CreateCommandSignature(&desc, nullptr, COM_ARGS(&info.signature)))) + { + return nullptr; + } + ref = signatures.insert(ref, eastl::move(info)); + } + return ref->signature.Get(); +} + +ID3D12CommandSignature *SignatureStore::getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type, + GraphicsPipelineSignature &signature) +{ + uint8_t mask = signature.def.vertexShaderRegisters.specialConstantsMask | signature.def.pixelShaderRegisters.specialConstantsMask | + signature.def.geometryShaderRegisters.specialConstantsMask | signature.def.hullShaderRegisters.specialConstantsMask | + signature.def.domainShaderRegisters.specialConstantsMask; + bool has_draw_id = mask & dxil::SpecialConstantType::SC_DRAW_ID; + if (!has_draw_id) + return getSignatureForStride(device, stride, type); + + ID3D12RootSignature *root_signature = signature.signature.Get(); + auto ref = eastl::find_if(begin(signaturesEx), end(signaturesEx), + [=](const SignatureInfoEx &si) { return si.type == type && si.stride == stride && si.rootSignature == root_signature; }); + if (end(signaturesEx) == ref) + { + D3D12_INDIRECT_ARGUMENT_DESC args[2] = {}; + D3D12_COMMAND_SIGNATURE_DESC desc; + desc.NumArgumentDescs = 2; + desc.pArgumentDescs = args; + desc.NodeMask = 0; + + args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT; + args[0].Constant.Num32BitValuesToSet = 1; + args[0].Constant.RootParameterIndex = 0; + args[0].Constant.DestOffsetIn32BitValues = 0; + args[1].Type = type; + desc.ByteStride = stride; + + SignatureInfoEx info; + info.stride = stride; + info.type = type; + info.rootSignature = root_signature; + if (!DX12_CHECK_OK(device->CreateCommandSignature(&desc, root_signature, COM_ARGS(&info.signature)))) + { + return nullptr; + } + ref = signaturesEx.insert(ref, eastl::move(info)); + } + return ref->signature.Get(); +} + + void DeviceContext::replayCommands() { ExecutionContext executionContext // @@ -215,21 +408,25 @@ void DeviceContext::manageLatchedState(TidyFrameMode tidy_mode) { for (FrontendFrameLatchedData *nextFrame = nullptr;;) { - uint64_t gpuProgress = device.queues.checkFrameProgress(); + uint64_t gpuProgress = device.queues.checkFrameProgress() + 1; for (auto &&latchedFrame : front.latchedFrameSet) { - if (latchedFrame.progress <= gpuProgress) + if (latchedFrame.progress < gpuProgress) { if (latchedFrame.progress) { tidyFrame(latchedFrame, tidy_mode); - gpuProgress = device.queues.checkFrameProgress(); + gpuProgress = device.queues.checkFrameProgress() + 1; } - if (!nextFrame) - nextFrame = &latchedFrame; + nextFrame = &latchedFrame; } } + if (DAGOR_UNLIKELY(gpuProgress == 0)) + { + return; + } + if (nextFrame) { front.recordingLatchedFrame = nextFrame; @@ -775,6 +972,28 @@ void DeviceContext::compilePipelineSet2(DynamicArray &&in immediateModeExecute(); } +void DeviceContext::shutdownWorkerThread() +{ +#if !FIXED_EXECUTION_MODE + if (ExecutionMode::CONCURRENT == executionMode) +#endif + { + if (worker) + { + commandStream.pushBack(make_command()); + // tell the worker to terminate + // it will execute all pending commands + // and then clean up and shutdown + worker->terminate(true); + worker.reset(); + } + // switch to immediate mode if something else should come up +#if !FIXED_EXECUTION_MODE + executionMode = ExecutionMode::IMMEDIATE; +#endif + } +} + void DeviceContext::resizeSwapchain(Extent2D size) { front.swapchain.prepareForShutdown(device); @@ -785,6 +1004,7 @@ void DeviceContext::resizeSwapchain(Extent2D size) SwapchainProperties props; props.resolution = size; set_hdr_config(props); + set_hfr_config(props); back.swapchain.bufferResize(device, props); front.swapchain.bufferResize(size); makeReadyForFrame(front.frameIndex); @@ -1094,6 +1314,7 @@ void DeviceContext::setSRVTexture(uint32_t stage, size_t unit, BaseTex *texture, return; } + image->dbgValidateImageViewStateCompatibility(view); commandStream.pushBack( make_command(stage, static_cast(unit), image, view, device.getImageView(image, view), as_const_ds), false /*wake executor*/); @@ -2197,14 +2418,17 @@ void DeviceContext::setRaytraceRootConstant(uint32_t offset, uint32_t size) #if _TARGET_PC_WIN void DeviceContext::preRecovery() { -#if DAGOR_DBGLEVEL > 0 - dumpCommandLog(); -#endif + dumpCommandLog(back.sharedContextState); mutex.lock(); - finishInternal(); + + auto cmd = make_command(front.recordingWorkItemProgress); + commandStream.pushBack(cmd); + immediateModeExecute(); waitForCommandFence(); + closeFrameEndCallbacks(); + back.sharedContextState.preRecovery(device.queues, device.pipeMan); back.constBufferStreamDescriptors.shutdown(); @@ -2681,6 +2905,7 @@ void DeviceContext::executeXess(const XessParams ¶ms) xessParams.inColor = cast_to_texture_base(params.inColor)->getDeviceImage(); xessParams.inDepth = cast_to_texture_base(params.inDepth)->getDeviceImage(); xessParams.inMotionVectors = cast_to_texture_base(params.inMotionVectors)->getDeviceImage(); + xessParams.inExposure = params.inExposure ? cast_to_texture_base(params.inExposure)->getDeviceImage() : nullptr; xessParams.inJitterOffsetX = params.inJitterOffsetX; xessParams.inJitterOffsetY = params.inJitterOffsetY; xessParams.outColor = cast_to_texture_base(params.outColor)->getDeviceImage(); @@ -2953,7 +3178,7 @@ void DeviceContext::updateFenceProgress() DX12_LOCK_FRONT(); for (auto &frame : front.latchedFrameSet) { - if (frame.progress && frame.progress <= device.queues.checkFrameProgress()) + if (frame.progress && frame.progress < device.queues.checkFrameProgress() + 1) { tidyFrame(frame, TidyFrameMode::SyncPoint); } @@ -3362,6 +3587,8 @@ void DeviceContext::ExecutionContext::setSRVTexture(uint32_t stage, uint32_t uni as_const_ds = as_const_ds || (image && (image->getFormat().isDepth() || image->getFormat().isDepth())); #endif + if (image) + image->dbgValidateImageViewStateCompatibility(view_state); contextState.stageState[stage].setSRVTexture(unit, image, view_state, as_const_ds, view); } @@ -3603,18 +3830,16 @@ bool DeviceContext::ExecutionContext::checkDrawCallHasOutput(eastl::span 0 if (FAILED(result)) { D3D_ERROR("Command list '%s' close failed", debug_name); - self.dumpActiveFrameCommandLog(); - CommandLogDecoder::dump_commands_to_log(logger.getCommands()); + self.dumpActiveFrameCommandLog(self.back.sharedContextState); + debug::CommandLogDecoder::dump_commands_to_log(logger.getCommands()); } #endif } @@ -4262,9 +4487,7 @@ void DeviceContext::ExecutionContext::finishFrame(uint64_t progress, Drv3dTiming } self.makeReadyForFrame(front_frame + 1, present_on_swapchain); -#if DAGOR_DBGLEVEL > 0 self.initNextFrameLog(); -#endif device.pipeMan.evictDecompressionCache(); continuePipelineSetCompilation(); self.back.previousPresentEndTicks = ref_time_ticks(); @@ -5827,7 +6050,7 @@ void DeviceContext::ExecutionContext::executeXess(const XessParamsDx12 ¶ms) return; } - prepareExecuteAA({params.inColor, params.inDepth, params.inMotionVectors}, {params.outColor}); + prepareExecuteAA({params.inColor, params.inDepth, params.inMotionVectors, params.inExposure}, {params.outColor}); self.xessWrapper.evaluateXess(static_cast(contextState.cmdBuffer.getHandle()), static_cast(¶ms)); @@ -6568,54 +6791,44 @@ void DeviceContext::ExecutionContext::moveBuffer(BufferResourceReferenceAndOffse void DeviceContext::ExecutionContext::moveTexture(Image *from, Image *to) { - if (readyReadBackCommandList()) - { - contextState.resourceStates.useTextureAsCopyDestinationForWholeCopyOnReadbackQueue(contextState.readbackBarrierBatch, - contextState.graphicsCommandListSplitBarrierTracker, to); - contextState.resourceStates.useTextureAsCopySourceForWholeCopyOnReadbackQueue(contextState.readbackBarrierBatch, - contextState.graphicsCommandListSplitBarrierTracker, from); + if (!readyReadBackCommandList()) + return; - // Using multiple copyTextureRegion instead of copyResource is a workaround for an - // AMD RX 5700 XT issue, where copyResource for a heavy multidimensional resource may cause device hang. + contextState.resourceStates.useTextureAsCopyDestinationForWholeCopyOnReadbackQueue(contextState.readbackBarrierBatch, + contextState.graphicsCommandListSplitBarrierTracker, to); + contextState.resourceStates.useTextureAsCopySourceForWholeCopyOnReadbackQueue(contextState.readbackBarrierBatch, + contextState.graphicsCommandListSplitBarrierTracker, from); + + // Using multiple copyTextureRegion instead of copyResource is a workaround for an + // AMD RX 5700 XT issue, where copyResource for a heavy multidimensional resource may cause device hang. #if _TARGET_PC_WIN - if (d3d_get_gpu_cfg().primaryVendor == D3D_VENDOR_AMD) + if (d3d_get_gpu_cfg().primaryVendor == D3D_VENDOR_AMD) + { + for (const auto subres : from->getSubresourceRange()) { - for (const auto subres : from->getSubresourceRange()) - { - D3D12_TEXTURE_COPY_LOCATION copySrc{}; - copySrc.pResource = from->getHandle(); - copySrc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; - copySrc.SubresourceIndex = subres.index(); + D3D12_TEXTURE_COPY_LOCATION copySrc{}; + copySrc.pResource = from->getHandle(); + copySrc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + copySrc.SubresourceIndex = subres.index(); - D3D12_TEXTURE_COPY_LOCATION copyDst{}; - copyDst.pResource = to->getHandle(); - copyDst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; - copyDst.SubresourceIndex = subres.index(); + D3D12_TEXTURE_COPY_LOCATION copyDst{}; + copyDst.pResource = to->getHandle(); + copyDst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + copyDst.SubresourceIndex = subres.index(); - contextState.activeReadBackCommandList.copyTextureRegion(©Dst, 0, 0, 0, ©Src, nullptr); - } - } - else -#endif - { - contextState.activeReadBackCommandList.copyResource(to->getHandle(), from->getHandle()); + contextState.activeReadBackCommandList.copyTextureRegion(©Dst, 0, 0, 0, ©Src, nullptr); } } - else if (readyCommandList()) + else +#endif { - contextState.resourceStates.useTextureAsCopySourceForWholeCopy(contextState.graphicsCommandListBarrierBatch, - contextState.graphicsCommandListSplitBarrierTracker, from); - contextState.resourceStates.useTextureAsCopyDestinationForWholeCopy(contextState.graphicsCommandListBarrierBatch, - contextState.graphicsCommandListSplitBarrierTracker, to); - - contextState.graphicsCommandListBarrierBatch.execute(contextState.cmdBuffer); - - contextState.resourceStates.finishUseTextureAsCopyDestinationForWholeCopy(contextState.graphicsCommandListBarrierBatch, - contextState.graphicsCommandListSplitBarrierTracker, to); - - contextState.cmdBuffer.copyResource(to->getHandle(), from->getHandle()); + contextState.activeReadBackCommandList.copyResource(to->getHandle(), from->getHandle()); } + // `from` is going to be removed, so we can safely update the last frame access for `to` texture only. + // This tracking is required to avoid reordering with the next frame early upload commands. + to->updateLastFrameAccess(self.back.frameProgress); + dirtyTextureState(to); dirtyTextureState(from); } diff --git a/prog/engine/drv/drv3d_DX12/device_context.h b/prog/engine/drv/drv3d_DX12/device_context.h index be244e583..43fcc91aa 100644 --- a/prog/engine/drv/drv3d_DX12/device_context.h +++ b/prog/engine/drv/drv3d_DX12/device_context.h @@ -1,840 +1,73 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include "query_manager.h" -#include -#include -#include -#include -#if !defined(_M_ARM64) -#include -#endif -#include -#include <3d/dag_nvFeatures.h> -#include <3d/dag_amdFsr.h> -#include -#include -#include -#include <3d/tql.h> -#include "events_pool.h" -#include "variant_vector.h" -#include "texture.h" -#include "buffer.h" -#include "resource_memory_heap.h" -#include "tagged_handles.h" #include "bindless.h" +#include "buffer.h" +#include "command_list.h" +#include "command_stream_set.h" +#include "const_register_type.h" +#include "debug/command_list_logger.h" +#include "debug/device_context_state.h" +#include "debug/frame_command_logger.h" +#include "device_context_cmd.h" #include "device_queue.h" -#include "swapchain.h" -#include "streamline_adapter.h" -#include "xess_wrapper.h" -#include "fsr2_wrapper.h" +#include "events_pool.h" +#include "extra_data_arrays.h" +#include "frame_buffer.h" #include "fsr_args.h" - -#include "debug/device_context_state.h" -// #include "render_graph.h" - -#include "command_list.h" -#include "stateful_command_buffer.h" +#include "fsr2_wrapper.h" +#include "gpu_engine_state.h" +#include "info_types.h" +#include "query_manager.h" +#include "resource_memory_heap.h" #include "resource_state_tracker.h" +#include "ring_pipes.h" +#include "stateful_command_buffer.h" +#include "streamline_adapter.h" +#include "swapchain.h" +#include "tagged_handles.h" +#include "texture.h" +#include "variant_vector.h" #include "viewport_state.h" -#include "const_register_type.h" - - -namespace drv3d_dx12 -{ -enum class ActivePipeline -{ - Graphics, - Compute -}; -template -class ForwardRing -{ - T elements[N]{}; - T *selectedElement = &elements[0]; - - ptrdiff_t getIndex(const T *pos) const { return pos - &elements[0]; } - - T *advancePosition(T *pos) { return &elements[(getIndex(pos) + 1) % N]; } - -public: - T &get() { return *selectedElement; } - const T &get() const { return *selectedElement; } - T &operator*() { return *selectedElement; } - const T &operator*() const { return *selectedElement; } - T *operator->() { return selectedElement; } - const T *operator->() const { return selectedElement; } - - constexpr size_t size() const { return N; } - - void advance() { selectedElement = advancePosition(selectedElement); } - - // Iterates all elements of the ring in a unspecified order - template - void iterate(T clb) - { - for (auto &&v : elements) - { - clb(v); - } - } - - // Iterates all elements from last to the current element - template - void walkAll(T clb) - { - auto at = advancePosition(selectedElement); - for (size_t i = 0; i < N; ++i) - { - clb(*at); - at = advancePosition(at); - } - } - - // Iterates all elements from last to the element before the current element - template - void walkUnitlCurrent(T clb) - { - auto at = advancePosition(selectedElement); - for (size_t i = 0; i < N - 1; ++i) - { - clb(at); - at = advancePosition(at); - } - } -}; -// Ring buffer acting as a thread safe, non blocking, single producer, single consumer pipe -template -class ConcurrentRingPipe -{ - T pipe[N]{}; - alignas(64) std::atomic readPos{0}; - alignas(64) std::atomic writePos{0}; - -public: - T *tryAcquireRead() - { - auto rp = readPos.load(std::memory_order_relaxed); - if (rp < writePos.load(std::memory_order_acquire)) - { - return &pipe[rp % N]; - } - return nullptr; - } - void releaseRead() { ++readPos; } - T *tryAcquireWrite() - { - auto wp = writePos.load(std::memory_order_relaxed); - if (wp - readPos.load(std::memory_order_acquire) < N) - return &pipe[wp % N]; - return nullptr; - } - void releaseWrite() { ++writePos; } - bool canAcquireWrite() const { return (writePos.load(std::memory_order_relaxed) - readPos.load(std::memory_order_acquire)) < N; } -}; - -// Specialization with only one entry, this is used for builds that only support -// concurrent execution mode and don't need more than one pipe element. -// No call will block, return null or fail. -template -class ConcurrentRingPipe -{ - T pipe{}; - -public: - T *tryAcquireRead() { return &pipe; } - void releaseRead() {} - T *tryAcquireWrite() { return &pipe; } - void releaseWrite() {} - constexpr bool canAcquireWrite() const { return true; } -}; - -// Extended ConcurrentRingPipe that implements blocking read/write -template -class WaitableConcurrentRingPipe : private ConcurrentRingPipe -{ - using BaseType = ConcurrentRingPipe; +#include "xess_wrapper.h" - os_event_t itemsToRead; - os_event_t itemsToWrite; +#include +#include +#include +#include +#include +#include +#include +#include -public: - WaitableConcurrentRingPipe() - { - os_event_create(&itemsToRead, "WCRP:itemsToRead"); - os_event_create(&itemsToWrite, "WCRP:itemsToWrite"); - } - ~WaitableConcurrentRingPipe() - { - os_event_destroy(&itemsToRead); - os_event_destroy(&itemsToWrite); - } - using BaseType::tryAcquireRead; - void releaseRead() - { - BaseType::releaseRead(); - os_event_set(&itemsToWrite); - } - using BaseType::tryAcquireWrite; - void releaseWrite() - { - BaseType::releaseWrite(); - os_event_set(&itemsToRead); - } - T &acquireRead() - { - T *result = nullptr; - try_and_wait_with_os_event(itemsToRead, DEFAULT_WAIT_SPINS, - [this, &result]() // - { - result = tryAcquireRead(); - return result != nullptr; - }); - return *result; - } - // repeatedly call clb until it either returns false or a T could be acquired - // return value of acquireRead can be nullptr if clb returned false - template - T *acquireRead(U &&clb) - { - T *result = nullptr; - try_and_wait_with_os_event(itemsToRead, DEFAULT_WAIT_SPINS, - [this, &result, &clb]() // - { - if (!clb()) - return true; - result = tryAcquireRead(); - return result != nullptr; - }); - return result; - } - T &acquireWrite() - { - T *result = nullptr; - try_and_wait_with_os_event(itemsToWrite, DEFAULT_WAIT_SPINS, - [this, &result]() // - { - result = tryAcquireWrite(); - return result != nullptr; - }); - return *result; - } - // repeatedly call clb until it either returns false or a T could be acquired - // return value of acquireRead can be nullptr if clb returned false - template - T *acquireWrite(U &&clb) - { - T *result = nullptr; - try_and_wait_with_os_event(itemsToWrite, DEFAULT_WAIT_SPINS, - [this, &result, &clb]() // - { - if (!clb()) - return true; - result = tryAcquireWrite(); - return result != nullptr; - }); - return result; - } - using BaseType::canAcquireWrite; - void waitForWriteItem() - { - try_and_wait_with_os_event(itemsToWrite, DEFAULT_WAIT_SPINS, [this]() { return this->canAcquireWrite(); }); - } -}; +struct FrameEvents; -// Specialization with only one entry, this is used for builds that only support -// concurrent execution mode and don't need more than one pipe element. -// No call will block, return null or fail. -template -class WaitableConcurrentRingPipe : private ConcurrentRingPipe +namespace drv3d_dx12 { - using BaseType = ConcurrentRingPipe; - -public: - using BaseType::releaseRead; - using BaseType::releaseWrite; - using BaseType::tryAcquireRead; - using BaseType::tryAcquireWrite; - T &acquireRead() { return *tryAcquireRead(); } // -V522 - // repeatedly call clb until it either returns false or a T could be acquired - // return value of acquireRead can be nullptr if clb returned false - template - T *acquireRead(U &&) - { - return acquireRead(); - } - T &acquireWrite() { return *tryAcquireWrite(); } // -V522 - // repeatedly call clb until it either returns false or a T could be acquired - // return value of acquireRead can be nullptr if clb returned false - template - T *acquireWrite(U &&) - { - return acquireWrite(); - } - void waitForWriteItem() {} - using BaseType::canAcquireWrite; -}; +class Device; #if D3D_HAS_RAY_TRACING -struct RaytraceGeometryDescriptionBufferResourceReferenceSet -{ - BufferResourceReference vertexOrAABBBuffer; - BufferResourceReference indexBuffer; - BufferResourceReference transformBuffer; -}; +struct RaytraceAccelerationStructure; #endif constexpr uint32_t timing_history_length = 32; -struct FrontendTimelineTextureUsage -{ - Image *texture = nullptr; - uint32_t subResId = 0; - D3D12_RESOURCE_STATES usage = D3D12_RESOURCE_STATE_COMMON; - D3D12_RESOURCE_STATES nextUsage = D3D12_RESOURCE_STATE_COMMON; - D3D12_RESOURCE_STATES prevUsage = D3D12_RESOURCE_STATE_COMMON; - size_t nextIndex = ~size_t(0); - size_t prevIndex = ~size_t(0); - size_t cmdIndex = 0; - // for render/depth-stencil target this is the index to the last draw - // command before it transitions into nextUsage. - // This information is used to insert split barriers. - size_t lastCmdIndex = ~size_t(0); -}; -struct HostDeviceSharedMemoryImageCopyInfo -{ - HostDeviceSharedMemoryRegion cpuMemory; - Image *image; - uint32_t copyIndex; - uint32_t copyCount; -}; - -struct ImageSubresourceRange -{ - MipMapRange mipMapRange; - ArrayLayerRange arrayLayerRange; -}; -struct ClearDepthStencilValue -{ - float depth; - uint32_t stencil; -}; -union ClearColorValue -{ - float float32[4]; -}; -struct ImageSubresourceLayers -{ - MipMapIndex mipLevel; - ArrayLayerIndex baseArrayLayer; -}; -struct ImageBlit -{ - ImageSubresourceLayers srcSubresource; - Offset3D srcOffsets[2]; // change to 2d have no 3d blitting - ImageSubresourceLayers dstSubresource; - Offset3D dstOffsets[2]; // change to 2d have no 3d blitting -}; -struct BufferCopy -{ - uint64_t srcOffset; - uint64_t dstOffset; - uint64_t size; -}; -struct BufferImageCopy -{ - D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout; - UINT subresourceIndex; - Offset3D imageOffset; -}; - -BufferImageCopy calculate_texture_subresource_copy_info(const Image &texture, uint32_t subresource_index = 0, uint64_t offset = 0); - -using TextureMipsCopyInfo = eastl::fixed_vector; - -TextureMipsCopyInfo calculate_texture_mips_copy_info(const Image &texture, uint32_t mip_levels, uint32_t array_slice = 0, - uint32_t array_size = 1, uint64_t initial_offset = 0); - -struct ImageCopy -{ - SubresourceIndex srcSubresource; - SubresourceIndex dstSubresource; - Offset3D dstOffset; - D3D12_BOX srcBox; -}; inline ImageCopy make_whole_resource_copy_info() { ImageCopy result{}; result.srcSubresource = SubresourceIndex::make(~uint32_t{0}); return result; } -inline bool is_whole_resource_copy_info(const ImageCopy ©) { return copy.srcSubresource == SubresourceIndex::make(~uint32_t{0}); } - -union FramebufferMask -{ - uint32_t raw = 0; - struct - { - uint32_t hasDepthStencilAttachment : 1; - uint32_t isConstantDepthstencilAttachment : 1; - uint32_t colorAttachmentMask : Driver3dRenderTarget::MAX_SIMRT; - }; - - template - void iterateColorAttachments(T &&u) - { - for_each_set_bit(colorAttachmentMask, eastl::forward(u)); - } - - template - void iterateColorAttachments(uint32_t valid_mask, T &&u) - { - for_each_set_bit(colorAttachmentMask & valid_mask, eastl::forward(u)); - } - - void setColorAttachment(uint32_t index) { colorAttachmentMask |= 1u << index; } - - void resetColorAttachment(uint32_t index) { colorAttachmentMask &= ~(1u << index); } - - void setDepthStencilAttachment(bool is_const) - { - hasDepthStencilAttachment = 1; - isConstantDepthstencilAttachment = is_const ? 1u : 0u; - } - - void resetDepthStencilAttachment() - { - hasDepthStencilAttachment = 0; - isConstantDepthstencilAttachment = 0; - } - - void resetAll() { raw = 0; } -}; - -struct FramebufferInfo -{ - struct AttachmentInfo - { - Image *image = nullptr; - ImageViewState view = {}; - }; - AttachmentInfo colorAttachments[Driver3dRenderTarget::MAX_SIMRT] = {}; - AttachmentInfo depthStencilAttachment = {}; - FramebufferMask attachmentMask; - - - FramebufferMask getMatchingAttachmentMask(Image *texture) - { - FramebufferMask result; - for (uint32_t i = 0; i < countof(colorAttachments); ++i) - { - result.colorAttachmentMask |= ((colorAttachments[i].image == texture) ? 1u : 0u) << i; - } - result.isConstantDepthstencilAttachment = attachmentMask.isConstantDepthstencilAttachment; - result.hasDepthStencilAttachment = (depthStencilAttachment.image == texture) ? 1u : 0u; - return result; - } - - void setColorAttachment(uint32_t index, Image *image, ImageViewState view) - { - auto &target = colorAttachments[index]; - target.image = image; - target.view = view; - attachmentMask.setColorAttachment(index); - } - void clearColorAttachment(uint32_t index) - { - colorAttachments[index] = AttachmentInfo{}; - attachmentMask.resetColorAttachment(index); - } - void setDepthStencilAttachment(Image *image, ImageViewState view, bool read_only) - { - depthStencilAttachment.image = image; - depthStencilAttachment.view = view; - attachmentMask.setDepthStencilAttachment(read_only); - } - void clearDepthStencilAttachment() - { - depthStencilAttachment = AttachmentInfo{}; - attachmentMask.resetDepthStencilAttachment(); - } - bool hasConstDepthStencilAttachment() const { return 0 != attachmentMask.isConstantDepthstencilAttachment; } - bool hasDepthStencilAttachment() const { return 0 != attachmentMask.hasDepthStencilAttachment; } - Extent2D makeDrawArea(Extent2D def = {}) const; -}; - - -struct FramebufferDescription -{ - D3D12_CPU_DESCRIPTOR_HANDLE colorAttachments[Driver3dRenderTarget::MAX_SIMRT]; - D3D12_CPU_DESCRIPTOR_HANDLE depthStencilAttachment; - - void clear(D3D12_CPU_DESCRIPTOR_HANDLE null_color) - { - eastl::fill(eastl::begin(colorAttachments), eastl::end(colorAttachments), null_color); - depthStencilAttachment.ptr = 0; - } - bool contains(D3D12_CPU_DESCRIPTOR_HANDLE view) const - { - using namespace eastl; - return (end(colorAttachments) != find(begin(colorAttachments), end(colorAttachments), view)) || (depthStencilAttachment == view); - } - friend bool operator==(const FramebufferDescription &l, const FramebufferDescription &r) - { - return 0 == memcmp(&l, &r, sizeof(FramebufferDescription)); - } - friend bool operator!=(const FramebufferDescription &l, const FramebufferDescription &r) { return !(l == r); } -}; - -struct FramebufferState -{ - FramebufferInfo frontendFrameBufferInfo = {}; - FramebufferLayout framebufferLayout = {}; - FramebufferDescription frameBufferInfo = {}; - FramebufferMask framebufferDirtyState; - - void dirtyTextureState(Image *texture) - { - auto state = frontendFrameBufferInfo.getMatchingAttachmentMask(texture); - framebufferDirtyState.raw |= state.raw; - } - - void dirtyAllTexturesState() { framebufferDirtyState = frontendFrameBufferInfo.attachmentMask; } - - void clear(D3D12_CPU_DESCRIPTOR_HANDLE null_color) - { - frontendFrameBufferInfo = FramebufferInfo{}; - framebufferLayout.clear(); - frameBufferInfo.clear(null_color); - framebufferDirtyState.resetAll(); - } - - void bindColorTarget(uint32_t index, Image *image, ImageViewState ivs, D3D12_CPU_DESCRIPTOR_HANDLE view) - { - frontendFrameBufferInfo.setColorAttachment(index, image, ivs); - framebufferLayout.setColorAttachment(index, image->getMsaaLevel(), ivs.getFormat()); - frameBufferInfo.colorAttachments[index] = view; - framebufferDirtyState.setColorAttachment(index); - } - - void clearColorTarget(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE null_handle) - { - frontendFrameBufferInfo.clearColorAttachment(index); - framebufferLayout.clearColorAttachment(index); - frameBufferInfo.colorAttachments[index] = null_handle; - framebufferDirtyState.resetColorAttachment(index); - } - - void bindDepthStencilTarget(Image *image, ImageViewState ivs, D3D12_CPU_DESCRIPTOR_HANDLE view, bool read_only) - { - frontendFrameBufferInfo.setDepthStencilAttachment(image, ivs, read_only); - framebufferLayout.setDepthStencilAttachment(image->getMsaaLevel(), ivs.getFormat()); - frameBufferInfo.depthStencilAttachment = view; - framebufferDirtyState.setDepthStencilAttachment(read_only); - } - - void clearDepthStencilTarget() - { - frontendFrameBufferInfo.clearDepthStencilAttachment(); - framebufferLayout.clearDepthStencilAttachment(); - frameBufferInfo.depthStencilAttachment.ptr = 0; - framebufferDirtyState.resetDepthStencilAttachment(); - } -}; - -struct GraphicsState -{ - enum - { - SCISSOR_RECT_DIRTY, - SCISSOR_ENABLED, - SCISSOR_ENABLED_DIRTY, - VIEWPORT_DIRTY, - USE_WIREFRAME, - - INDEX_BUFFER_DIRTY, - VERTEX_BUFFER_0_DIRTY, - VERTEX_BUFFER_1_DIRTY, - VERTEX_BUFFER_2_DIRTY, - VERTEX_BUFFER_3_DIRTY, - // state - INDEX_BUFFER_STATE_DIRTY, - VERTEX_BUFFER_STATE_0_DIRTY, - VERTEX_BUFFER_STATE_1_DIRTY, - VERTEX_BUFFER_STATE_2_DIRTY, - VERTEX_BUFFER_STATE_3_DIRTY, - - PREDICATION_BUFFER_STATE_DIRTY, - - COUNT - }; - BasePipeline *basePipeline = nullptr; - PipelineVariant *pipeline = nullptr; - D3D12_PRIMITIVE_TOPOLOGY_TYPE topology = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED; - - InputLayoutID inputLayoutIdent = InputLayoutID::Null(); - StaticRenderStateID staticRenderStateIdent = StaticRenderStateID::Null(); - FramebufferLayoutID framebufferLayoutID = FramebufferLayoutID::Null(); - FramebufferState framebufferState; - D3D12_RECT scissorRects[Viewport::MAX_VIEWPORT_COUNT] = {}; - uint32_t scissorRectCount = 0; - D3D12_VIEWPORT viewports[Viewport::MAX_VIEWPORT_COUNT] = {}; - uint32_t viewportCount = 0; - eastl::bitset statusBits{0}; - - BufferResourceReferenceAndAddressRange indexBuffer; - DXGI_FORMAT indexBufferFormat = DXGI_FORMAT_R16_UINT; - BufferResourceReferenceAndAddressRange vertexBuffers[MAX_VERTEX_INPUT_STREAMS]; - uint32_t vertexBufferStrides[MAX_VERTEX_INPUT_STREAMS] = {}; - BufferResourceReferenceAndOffset predicationBuffer; - BufferResourceReferenceAndOffset activePredicationBuffer; - - void invalidateResourceStates() - { - statusBits.set(INDEX_BUFFER_STATE_DIRTY); - statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY); - statusBits.set(VERTEX_BUFFER_STATE_1_DIRTY); - statusBits.set(VERTEX_BUFFER_STATE_2_DIRTY); - statusBits.set(VERTEX_BUFFER_STATE_3_DIRTY); - statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); - framebufferState.dirtyAllTexturesState(); - } - - void dirtyBufferState(BufferGlobalId ident) - { - if (indexBuffer.resourceId == ident) - { - statusBits.set(INDEX_BUFFER_STATE_DIRTY); - } - for (uint32_t i = 0; i < countof(vertexBuffers); ++i) - { - if (vertexBuffers[i].resourceId == ident) - { - statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY + i); - } - } - if (predicationBuffer.resourceId == ident) - { - statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); - } - } - - void dirtyTextureState(Image *texture) { framebufferState.dirtyTextureState(texture); } - - void onFlush() - { - G_STATIC_ASSERT(4 == MAX_VERTEX_INPUT_STREAMS); - framebufferLayoutID = FramebufferLayoutID::Null(); - statusBits.set(INDEX_BUFFER_DIRTY); - statusBits.set(INDEX_BUFFER_STATE_DIRTY); - for (uint32_t i = 0; i < MAX_VERTEX_INPUT_STREAMS; ++i) - { - statusBits.set(VERTEX_BUFFER_0_DIRTY + i); - statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY + i); - } - statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); - activePredicationBuffer = {}; - - framebufferState.dirtyAllTexturesState(); - } - - void onFrameStateInvalidate(D3D12_CPU_DESCRIPTOR_HANDLE null_ct) - { - pipeline = nullptr; - - statusBits.set(GraphicsState::VIEWPORT_DIRTY); - statusBits.set(GraphicsState::SCISSOR_RECT_DIRTY); - - framebufferState.clear(null_ct); - - basePipeline = nullptr; - framebufferLayoutID = FramebufferLayoutID::Null(); - - indexBuffer = {}; - statusBits.set(INDEX_BUFFER_DIRTY); - statusBits.set(INDEX_BUFFER_STATE_DIRTY); - - for (uint32_t i = 0; i < MAX_VERTEX_INPUT_STREAMS; ++i) - { - statusBits.set(VERTEX_BUFFER_0_DIRTY + i); - statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY + i); - vertexBuffers[i] = {}; - } - - predicationBuffer = {}; - activePredicationBuffer = {}; - statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); - - framebufferState.dirtyAllTexturesState(); - } -}; -struct ComputeState -{ - ComputePipeline *pipeline = nullptr; - - void onFlush() {} - void onFrameStateInvalidate() { pipeline = nullptr; } -}; - -class Query; -class Device; -class DeviceContext; -struct DeviceResourceData; -class BackendQueryManager; -#if D3D_HAS_RAY_TRACING -struct RaytraceAccelerationStructure; -#endif - - -struct DeviceFeaturesConfig -{ - enum Bits - { - OPTIMIZE_BUFFER_UPLOADS, - USE_THREADED_COMMAND_EXECUTION, - PIPELINE_COMPILATION_ERROR_IS_FATAL, - ASSERT_ON_PIPELINE_COMPILATION_ERROR, - ALLOW_OS_MANAGED_SHADER_CACHE, - ENABLE_DEFRAGMENTATION, - DISABLE_PIPELINE_LIBRARY_CACHE, -#if _TARGET_SCARLETT - REPORT_WAVE_64, -#endif -#if DX12_CONFIGUREABLE_BARRIER_MODE - PROCESS_USER_BARRIERS, - VALIDATE_USER_BARRIERS, - GENERATE_ALL_BARRIERS, -#endif -#if DX12_DOES_SET_DEBUG_NAMES - NAME_OBJECTS, -#endif - ALLOW_STREAM_BUFFERS, - ALLOW_STREAM_CONST_BUFFERS, - ALLOW_STREAM_VERTEX_BUFFERS, - ALLOW_STREAM_INDEX_BUFFERS, - ALLOW_STREAM_INDIRECT_BUFFERS, - ALLOW_STREAM_STAGING_BUFFERS, -#if DX12_ENABLE_CONST_BUFFER_DESCRIPTORS - ROOT_SIGNATURES_USES_CBV_DESCRIPTOR_RANGES, -#endif - DISABLE_BUFFER_SUBALLOCATION, - DISABLE_BINDLESS, - IGNORE_PREDICATION, - COUNT, - INVLID = COUNT - }; - typedef eastl::bitset Type; -}; -// very simple fifo queue with a fixed amount of slots -template -class FixedFifoQueue -{ - T store[N] = {}; - size_t top = 0; - size_t count = 0; - -public: - FixedFifoQueue() = default; - ~FixedFifoQueue() = default; - FixedFifoQueue(const FixedFifoQueue &) = default; - FixedFifoQueue &operator=(const FixedFifoQueue &) = default; - FixedFifoQueue(FixedFifoQueue &&) = default; - FixedFifoQueue &operator=(FixedFifoQueue &&) = default; - - template - void push_back(U &&v) - { - store[(top + count) % N] = eastl::forward(v); - ++count; - } - void pop_front() - { - top = (top + 1) % N; - --count; - } - T &front() { return store[top]; } - bool empty() const { return 0 == count; } - bool full() const { return N == count; } - - template - size_t enumerate(U &&clb) - { - for (size_t i = 0; i < count; ++i) - clb(i, store[(top + i) % N]); - return count; - } - - template - size_t enumerateReverse(U &&clb) - { - for (size_t i = 0; i < count; ++i) - clb(count - i - 1, store[(top + (count - i - 1)) % N]); - return count; - } -}; -class Query; +inline bool is_whole_resource_copy_info(const ImageCopy ©) { return copy.srcSubresource == SubresourceIndex::make(~uint32_t{0}); } -template -struct GetSmartPointerOfCommandBufferPointer; +BufferImageCopy calculate_texture_subresource_copy_info(const Image &texture, uint32_t subresource_index = 0, uint64_t offset = 0); -template -struct GetSmartPointerOfCommandBufferPointer> -{ - using Type = VersionedComPtr; -}; +using TextureMipsCopyInfo = eastl::fixed_vector; -template ::Type> -struct CommandStreamSet -{ - ComPtr pool; - dag::Vector lists; - uint32_t listsInUse = 0; +TextureMipsCopyInfo calculate_texture_mips_copy_info(const Image &texture, uint32_t mip_levels, uint32_t array_slice = 0, + uint32_t array_size = 1, uint64_t initial_offset = 0); - void init(ID3D12Device *device) { DX12_CHECK_RESULT(device->CreateCommandAllocator(CommandListTypeName, COM_ARGS(&pool))); } - CommandListResultType allocateList(ID3D12Device *device) - { - CommandListResultType result = {}; - if (!pool) - { - return result; - } - if (listsInUse < lists.size()) - { - result = lists[listsInUse++]; - result->Reset(pool.Get(), nullptr); - } - else - { - CommandListStoreType newList; - if (newList.autoQuery([=](auto uuid, auto ptr) // - { return DX12_DEBUG_OK(device->CreateCommandList(0, CommandListTypeName, pool.Get(), nullptr, uuid, ptr)); })) - { - lists.push_back(eastl::move(newList)); - result = lists[listsInUse++]; - } - else - { - D3D_ERROR("DX12: Unable to allocate new command list"); - // can only happen when all CreateCommandList failed and this can only happen when the device was reset. - } - } - return result; - } - void frameReset() - { - DX12_CHECK_RESULT(pool->Reset()); - listsInUse = 0; - } - void shutdown() - { - listsInUse = 0; - lists.clear(); - pool.Reset(); - } -}; struct FrameInfo { CommandStreamSet genericCommands; @@ -860,94 +93,46 @@ struct FrameInfo void preRecovery(DeviceQueueGroup &queue_group, PipelineManager &pipe_man); void recover(ID3D12Device *device); }; -constexpr uint32_t default_event_wait_time = 1; -// runs until check returns true, after some busy loop tries it starts to check the event state -template -inline void try_and_wait_with_os_event(os_event_t &event, uint32_t spin_count, T check, uint32_t idle_time = default_event_wait_time) + +struct SignatureStore { - for (uint32_t i = 0; i < spin_count; ++i) + struct SignatureInfo { - if (check()) - return; -#if !defined(_M_ARM64) - _mm_pause(); -#endif - } - for (;;) + ComPtr signature; + uint32_t stride; + D3D12_INDIRECT_ARGUMENT_TYPE type; + }; + struct SignatureInfoEx : SignatureInfo { - if (check()) - return; - os_event_wait(&event, idle_time); - } -} -// Argument handler will transform this into RangeType -template -struct ExtraDataArray -{ - size_t index = 0; - - ExtraDataArray() = default; - ExtraDataArray(size_t i) : index{i} {} + ID3D12RootSignature *rootSignature; + }; - using RangeType = eastl::span; -}; + dag::Vector signatures; + dag::Vector signaturesEx; -using StringIndexRef = ExtraDataArray; -using WStringIndexRef = ExtraDataArray; + ID3D12CommandSignature *getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type); + ID3D12CommandSignature *getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type, + GraphicsPipelineSignature &signature); -#if D3D_HAS_RAY_TRACING -using RaytraceGeometryDescriptionBufferResourceReferenceSetListRef = - ExtraDataArray; -using D3D12_RAYTRACING_GEOMETRY_DESC_ListRef = ExtraDataArray; -#endif -using ImageViewStateListRef = ExtraDataArray; -using ImagePointerListRef = ExtraDataArray; -using QueryPointerListRef = ExtraDataArray; -using D3D12_CPU_DESCRIPTOR_HANDLE_ListRef = ExtraDataArray; -using BufferImageCopyListRef = ExtraDataArray; -using BufferResourceReferenceAndShaderResourceViewListRef = ExtraDataArray; -using ViewportListRef = ExtraDataArray; -using ScissorRectListRef = ExtraDataArray; - -#define DX12_BEGIN_CONTEXT_COMMAND(name) \ - struct Cmd##name : debug::call_stack::CommandData \ + void reset() { + signatures.clear(); + signaturesEx.clear(); + } +}; -#define DX12_BEGIN_CONTEXT_COMMAND_EXT_1(name, param0Type, param0Name) \ - struct Cmd##name : debug::call_stack::CommandData \ - { - -#define DX12_BEGIN_CONTEXT_COMMAND_EXT_2(name, param0Type, param0Name, param1Type, param1Name) \ - struct Cmd##name : debug::call_stack::CommandData \ - { - -#define DX12_END_CONTEXT_COMMAND \ - } \ - ; - -#define DX12_CONTEXT_COMMAND_PARAM(type, name) type name; -#define DX12_CONTEXT_COMMAND_PARAM_ARRAY(type, name, size) type name[size]; -#include "device_context_cmd.inc.h" -#undef DX12_BEGIN_CONTEXT_COMMAND -#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_1 -#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_2 -#undef DX12_END_CONTEXT_COMMAND -#undef DX12_CONTEXT_COMMAND_PARAM -#undef DX12_CONTEXT_COMMAND_PARAM_ARRAY - -#if _TARGET_XBOX -#include "device_context_xbox.h" -#endif // need to shorten this - some Cmd structs can be combined, but this needs some refactoring in other places -class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debug::call_stack::Generator //-V553 +class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, + public debug::call_stack::Generator, + public debug::FrameCommandLogger //-V553 { template T make_command(Args &&...args) { - T cmd = T{this->generateCommandData(), eastl::forward(args)...}; - return cmd; + return T{this->generateCommandData(), eastl::forward(args)...}; } + // Warning: intentionally not spinlock, since it has extremely bad behaviour // in case of high contention (e.g. during several threads of loading etc...) WinCritSec mutex; @@ -968,142 +153,7 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu IMMEDIATE_FLUSH, }; #endif - struct ImageStateRange - { - Image *image = nullptr; - uint32_t stateArrayIndex = 0; - ValueRange arrayRange; - ValueRange mipRange; - }; - struct ImageStateRangeInfo - { - D3D12_RESOURCE_STATES state; - ValueRange idRange; - }; - struct BufferStateInfo - { - D3D12_RESOURCE_STATES state; - uint32_t id; - }; - - using AnyCommandPack = TypePack< -#define DX12_BEGIN_CONTEXT_COMMAND(name) Cmd##name, -#define DX12_BEGIN_CONTEXT_COMMAND_EXT_1(name, param0Type, param0Name) ExtendedVariant, -#define DX12_BEGIN_CONTEXT_COMMAND_EXT_2(name, param0Type, param0Name, param1Type, param1Name) \ - ExtendedVariant2, -#define DX12_END_CONTEXT_COMMAND -#define DX12_CONTEXT_COMMAND_PARAM(type, name) -#define DX12_CONTEXT_COMMAND_PARAM_ARRAY(type, name, size) -#include "device_context_cmd.inc.h" -#undef DX12_BEGIN_CONTEXT_COMMAND -#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_1 -#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_2 -#undef DX12_END_CONTEXT_COMMAND -#undef DX12_CONTEXT_COMMAND_PARAM -#undef DX12_CONTEXT_COMMAND_PARAM_ARRAY - void>; - - using AnyCommandStore = VariantRingBuffer; - -#if D3D_HAS_RAY_TRACING - struct RaytraceState - { - RaytracePipeline *pipeline = nullptr; - void onFlush() {} - - void onFrameStateInvalidate() { pipeline = nullptr; } - }; -#endif - - struct SignatureStore - { - struct SignatureInfo - { - ComPtr signature; - uint32_t stride; - D3D12_INDIRECT_ARGUMENT_TYPE type; - }; - struct SignatureInfoEx : SignatureInfo - { - ID3D12RootSignature *rootSignature; - }; - dag::Vector signatures; - dag::Vector signaturesEx; - - ID3D12CommandSignature *getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type) - { - auto ref = eastl::find_if(begin(signatures), end(signatures), - [=](const SignatureInfo &si) { return si.type == type && si.stride == stride; }); - if (end(signatures) == ref) - { - D3D12_INDIRECT_ARGUMENT_DESC arg; - D3D12_COMMAND_SIGNATURE_DESC desc; - desc.NumArgumentDescs = 1; - desc.pArgumentDescs = &arg; - desc.NodeMask = 0; - - arg.Type = type; - desc.ByteStride = stride; - - SignatureInfo info; - info.stride = stride; - info.type = type; - if (!DX12_CHECK_OK(device->CreateCommandSignature(&desc, nullptr, COM_ARGS(&info.signature)))) - { - return nullptr; - } - ref = signatures.insert(ref, eastl::move(info)); - } - return ref->signature.Get(); - } - ID3D12CommandSignature *getSignatureForStride(ID3D12Device *device, uint32_t stride, D3D12_INDIRECT_ARGUMENT_TYPE type, - GraphicsPipelineSignature &signature) - { - uint8_t mask = signature.def.vertexShaderRegisters.specialConstantsMask | - signature.def.pixelShaderRegisters.specialConstantsMask | - signature.def.geometryShaderRegisters.specialConstantsMask | - signature.def.hullShaderRegisters.specialConstantsMask | signature.def.domainShaderRegisters.specialConstantsMask; - bool has_draw_id = mask & dxil::SpecialConstantType::SC_DRAW_ID; - if (!has_draw_id) - return getSignatureForStride(device, stride, type); - - ID3D12RootSignature *root_signature = signature.signature.Get(); - auto ref = eastl::find_if(begin(signaturesEx), end(signaturesEx), - [=](const SignatureInfoEx &si) { return si.type == type && si.stride == stride && si.rootSignature == root_signature; }); - if (end(signaturesEx) == ref) - { - D3D12_INDIRECT_ARGUMENT_DESC args[2] = {}; - D3D12_COMMAND_SIGNATURE_DESC desc; - desc.NumArgumentDescs = 2; - desc.pArgumentDescs = args; - desc.NodeMask = 0; - - args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT; - args[0].Constant.Num32BitValuesToSet = 1; - args[0].Constant.RootParameterIndex = 0; - args[0].Constant.DestOffsetIn32BitValues = 0; - args[1].Type = type; - desc.ByteStride = stride; - - SignatureInfoEx info; - info.stride = stride; - info.type = type; - info.rootSignature = root_signature; - if (!DX12_CHECK_OK(device->CreateCommandSignature(&desc, root_signature, COM_ARGS(&info.signature)))) - { - return nullptr; - } - ref = signaturesEx.insert(ref, eastl::move(info)); - } - return ref->signature.Get(); - } - void reset() - { - signatures.clear(); - signaturesEx.clear(); - } - }; // ContextState struct ContextState : public debug::DeviceContextState @@ -1287,7 +337,7 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu return checkDrawCallHasOutput(string_literal_span(sl)); } - void checkCloseCommandListResult(HRESULT result, eastl::string_view debug_name, const CommandListLogger &logger) const; + void checkCloseCommandListResult(HRESULT result, eastl::string_view debug_name, const debug::CommandListLogger &logger) const; public: ExecutionContext(DeviceContext &ctx, ContextState &css); @@ -1542,52 +592,6 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu void switchActivePipeline(ActivePipeline pipeline); }; -#if DAGOR_DBGLEVEL > 0 - static constexpr size_t NumFrameCommandLogs = 5; - - struct FrameCommandLog - { - VariantVectorRingBuffer log; - uint32_t frameId = 0; - }; - - eastl::array frameLogs; - uint32_t activeLogId = 0; - uint64_t frameId = 0; - - VariantVectorRingBuffer &GetActiveFrameLog() { return frameLogs[activeLogId].log; } - - void initNextFrameLog(); - void dumpCommandLog(); - void dumpActiveFrameCommandLog(); - - void dumpFrameCommandLog(FrameCommandLog &frame_log); - - template - void logCommand(const ExtendedVariant2 ¶ms) - { - GetActiveFrameLog().pushBack(params.cmd, params.p0.size(), [¶ms](auto index, auto first, auto second) { - first(params.p0[index]); - second(params.p1[index]); - }); - } - - template - void logCommand(const ExtendedVariant ¶ms) - { - GetActiveFrameLog().pushBack(params.cmd, params.p0.data(), params.p0.size()); - } - - template - void logCommand(T cmd) - { - GetActiveFrameLog().pushBack(cmd); - } -#else - template - void logCommand(T) - {} -#endif std::atomic finishedFrameIndex = 0; @@ -1727,27 +731,7 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu #else void initMode(ExecutionMode mode); #endif - void shutdownWorkerThread() - { -#if !FIXED_EXECUTION_MODE - if (ExecutionMode::CONCURRENT == executionMode) -#endif - { - if (worker) - { - commandStream.pushBack(make_command()); - // tell the worker to terminate - // it will execute all pending commands - // and then clean up and shutdown - worker->terminate(true); - worker.reset(); - } - // switch to immediate mode if something else should come up -#if !FIXED_EXECUTION_MODE - executionMode = ExecutionMode::IMMEDIATE; -#endif - } - } + void shutdownWorkerThread(); // assumes frontend and backend are synced and locked so that access to front and back is safe void resizeSwapchain(Extent2D size); @@ -1983,6 +967,7 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu return xessWrapper.isXessQualityAvailableAtResolution(target_width, target_height, xess_quality); } void getXessRenderResolution(int &w, int &h) const { xessWrapper.getXeSSRenderResolution(w, h); } + dag::Expected getXessVersion() const { return xessWrapper.getVersion(); } void getFsr2RenderResolution(int &width, int &height) { fsr2Wrapper.getFsr2RenderingResolution(width, height); } void setXessVelocityScale(float x, float y) { xessWrapper.setVelocityScale(x, y); } void createDlssFeature(bool stereo_render, int output_width, int output_height); @@ -2021,6 +1006,8 @@ class DeviceContext : protected ResourceUsageHistoryDataSetDebugger, public debu Extent2D getSwapchainExtent() const; bool isVrrSupported() const; bool isVsyncOn() const; + bool isHfrSupported() const; + bool isHfrEnabled() const; FormatStore getSwapchainColorFormat() const; FormatStore getSwapchainSecondaryColorFormat() const; // flushes all outstanding work, waits for the backend and GPU to complete it and finish up all diff --git a/prog/engine/drv/drv3d_DX12/device_context_cmd.h b/prog/engine/drv/drv3d_DX12/device_context_cmd.h new file mode 100644 index 000000000..0804f38fc --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/device_context_cmd.h @@ -0,0 +1,78 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "debug/call_stack.h" +#include "variant_vector.h" +#include "versioned_com_ptr.h" + +// Dependencies of commands +#include "device_queue.h" +#include "extra_data_arrays.h" +#include "fsr_args.h" +#include "fsr2_wrapper.h" +#include "info_types.h" +#include "pipeline.h" +#include "query_manager.h" +#include "resource_memory_heap.h" +#include "swapchain.h" +#include "viewport_state.h" +#include "xess_wrapper.h" +#include <3d/dag_amdFsr.h> +#include <3d/dag_nvFeatures.h> +#include +#include +#include +#include + + +namespace drv3d_dx12 +{ +#define DX12_BEGIN_CONTEXT_COMMAND(name) \ + struct Cmd##name : debug::call_stack::CommandData \ + { + +#define DX12_BEGIN_CONTEXT_COMMAND_EXT_1(name, param0Type, param0Name) \ + struct Cmd##name : debug::call_stack::CommandData \ + { + +#define DX12_BEGIN_CONTEXT_COMMAND_EXT_2(name, param0Type, param0Name, param1Type, param1Name) \ + struct Cmd##name : debug::call_stack::CommandData \ + { + +#define DX12_END_CONTEXT_COMMAND \ + } \ + ; + +#define DX12_CONTEXT_COMMAND_PARAM(type, name) type name; +#define DX12_CONTEXT_COMMAND_PARAM_ARRAY(type, name, size) type name[size]; +#include "device_context_cmd.inc.h" +#undef DX12_BEGIN_CONTEXT_COMMAND +#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_1 +#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_2 +#undef DX12_END_CONTEXT_COMMAND +#undef DX12_CONTEXT_COMMAND_PARAM +#undef DX12_CONTEXT_COMMAND_PARAM_ARRAY + +#if _TARGET_XBOX +#include "device_context_xbox.h" +#endif + +using AnyCommandPack = TypePack< +#define DX12_BEGIN_CONTEXT_COMMAND(name) Cmd##name, +#define DX12_BEGIN_CONTEXT_COMMAND_EXT_1(name, param0Type, param0Name) ExtendedVariant, +#define DX12_BEGIN_CONTEXT_COMMAND_EXT_2(name, param0Type, param0Name, param1Type, param1Name) \ + ExtendedVariant2, +#define DX12_END_CONTEXT_COMMAND +#define DX12_CONTEXT_COMMAND_PARAM(type, name) +#define DX12_CONTEXT_COMMAND_PARAM_ARRAY(type, name, size) +#include "device_context_cmd.inc.h" +#undef DX12_BEGIN_CONTEXT_COMMAND +#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_1 +#undef DX12_BEGIN_CONTEXT_COMMAND_EXT_2 +#undef DX12_END_CONTEXT_COMMAND +#undef DX12_CONTEXT_COMMAND_PARAM +#undef DX12_CONTEXT_COMMAND_PARAM_ARRAY + void>; + +using AnyCommandStore = VariantRingBuffer; +} diff --git a/prog/engine/drv/drv3d_DX12/device_features_config.h b/prog/engine/drv/drv3d_DX12/device_features_config.h new file mode 100644 index 000000000..47c39f1e5 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/device_features_config.h @@ -0,0 +1,49 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "driver.h" +#include + + +namespace drv3d_dx12 +{ +struct DeviceFeaturesConfig +{ + enum Bits + { + OPTIMIZE_BUFFER_UPLOADS, + USE_THREADED_COMMAND_EXECUTION, + PIPELINE_COMPILATION_ERROR_IS_FATAL, + ASSERT_ON_PIPELINE_COMPILATION_ERROR, + ALLOW_OS_MANAGED_SHADER_CACHE, + ENABLE_DEFRAGMENTATION, + DISABLE_PIPELINE_LIBRARY_CACHE, +#if _TARGET_SCARLETT + REPORT_WAVE_64, +#endif +#if DX12_CONFIGUREABLE_BARRIER_MODE + PROCESS_USER_BARRIERS, + VALIDATE_USER_BARRIERS, + GENERATE_ALL_BARRIERS, +#endif +#if DX12_DOES_SET_DEBUG_NAMES + NAME_OBJECTS, +#endif + ALLOW_STREAM_BUFFERS, + ALLOW_STREAM_CONST_BUFFERS, + ALLOW_STREAM_VERTEX_BUFFERS, + ALLOW_STREAM_INDEX_BUFFERS, + ALLOW_STREAM_INDIRECT_BUFFERS, + ALLOW_STREAM_STAGING_BUFFERS, +#if DX12_ENABLE_CONST_BUFFER_DESCRIPTORS + ROOT_SIGNATURES_USES_CBV_DESCRIPTOR_RANGES, +#endif + DISABLE_BUFFER_SUBALLOCATION, + DISABLE_BINDLESS, + IGNORE_PREDICATION, + COUNT, + INVLID = COUNT + }; + typedef eastl::bitset Type; +}; +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/device_memory_class.h b/prog/engine/drv/drv3d_DX12/device_memory_class.h index 379b2acd1..611769685 100644 --- a/prog/engine/drv/drv3d_DX12/device_memory_class.h +++ b/prog/engine/drv/drv3d_DX12/device_memory_class.h @@ -1,9 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/device_queue.cpp b/prog/engine/drv/drv3d_DX12/device_queue.cpp index 35102b2b4..5e0305ad9 100644 --- a/prog/engine/drv/drv3d_DX12/device_queue.cpp +++ b/prog/engine/drv/drv3d_DX12/device_queue.cpp @@ -1,6 +1,6 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "device_queue.h" #include diff --git a/prog/engine/drv/drv3d_DX12/device_queue.h b/prog/engine/drv/drv3d_DX12/device_queue.h index 7b664de3f..53f8e2ea3 100644 --- a/prog/engine/drv/drv3d_DX12/device_queue.h +++ b/prog/engine/drv/drv3d_DX12/device_queue.h @@ -1,14 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "d3d12_debug_names.h" +#include "d3d12_error_handling.h" + +#include +#include #include #include #include -#include -#include - -#include "d3d12_error_handling.h" -#include "d3d12_debug_names.h" #if _TARGET_PC_WIN diff --git a/prog/engine/drv/drv3d_DX12/driver_mutex.h b/prog/engine/drv/drv3d_DX12/driver_mutex.h index 20b822c0b..52e4bd78f 100644 --- a/prog/engine/drv/drv3d_DX12/driver_mutex.h +++ b/prog/engine/drv/drv3d_DX12/driver_mutex.h @@ -1,8 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include #include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/driver_win.h b/prog/engine/drv/drv3d_DX12/driver_win.h index 203024604..7d264db9b 100644 --- a/prog/engine/drv/drv3d_DX12/driver_win.h +++ b/prog/engine/drv/drv3d_DX12/driver_win.h @@ -45,7 +45,8 @@ using D3DCopyCommandList = ID3D12GraphicsCommandList; #define DX12_SELECTABLE_CALL_STACK_CAPTURE 1 -#define DX12_ENABLE_COMMAND_LIST_LOGGER 0 +#define DX12_ENABLE_COMMAND_LIST_LOGGER 0 +#define DX12_ENABLE_FRAME_COMMAND_LOGGER (DAGOR_DBGLEVEL > 0) #define DX12_VALIDATE_STREAM_CB_USAGE_WITHOUT_INITIALIZATION (DAGOR_DBGLEVEL > 0) diff --git a/prog/engine/drv/drv3d_DX12/dx12.cpp b/prog/engine/drv/drv3d_DX12/dx12.cpp index 6a0f26795..977b7e896 100644 --- a/prog/engine/drv/drv3d_DX12/dx12.cpp +++ b/prog/engine/drv/drv3d_DX12/dx12.cpp @@ -2,10 +2,11 @@ #include "device.h" -#include "../drv3d_commonCode/stereoHelper.h" -#include "../drv3d_commonCode/dxgi_utils.h" -#include "../drv3d_commonCode/gpuConfig.h" -#include "../drv3d_commonCode/validate_sbuf_flags.h" +#include +#include +#include +#include +#include #include <../hid_mouse/api_wrappers.h> @@ -51,8 +52,6 @@ #include "frontend_state.h" -#include "frameStateTM.inc.h" - #include #include @@ -61,10 +60,12 @@ #if _TARGET_PC_WIN #include #include +#include "debug/global_state.h" #endif #include "driver_mutex.h" + #if _TARGET_PC_WIN extern "C" { @@ -128,7 +129,7 @@ FrameStateTM g_frameState; "lock will be released before the destructor is called with " \ "the offending D3D function call, this is because " \ "destructors are called on scope exit at the closing }.") -#include "frameStateTM.inc.cpp" +#include namespace drv3d_dx12 { @@ -601,6 +602,16 @@ void drv3d_dx12::set_hdr_config(SwapchainProperties &sci) #endif } +void drv3d_dx12::set_hfr_config(SwapchainProperties &sci) +{ +#if _TARGET_XBOX + sci.preferHfr = get_hfr_preference_from_settings(); + logdbg("DX12: Preferred display mode is set to %s", sci.preferHfr ? "HFR" : "HDR"); +#else + G_UNUSED(sci); +#endif +} + #if _TARGET_XBOX static bool is_auto_gamedvr() { return ::dgs_get_settings()->getBlockByNameEx("dx12")->getBool("autoGameDvr", true); } #endif @@ -828,9 +839,6 @@ void sort_adapters_by_integrated(dag::Vector &adapter_list, } } // namespace -using UpdateGpuDriverConfigFunc = void (*)(GpuDriverConfig &); -extern UpdateGpuDriverConfigFunc update_gpu_driver_config; - void update_dx12_gpu_driver_config(GpuDriverConfig &gpu_driver_config) { auto info = api_state.device.getAdapterInfo(); @@ -1108,6 +1116,7 @@ bool d3d::init_video(void *hinst, main_wnd_f *wnd_proc, const char *wcname, int sci.resolution.height = api_state.windowState.settings.resolutionY; set_hdr_config(sci); + set_hfr_config(sci); #if DAGOR_DBGLEVEL > 0 constexpr float default_immediate_threshold_percent = 100.f; @@ -1547,6 +1556,19 @@ int d3d::driver_command(Drv3dCommand command, void *par1, void *par2, [[maybe_un api_state.device.getContext().getXessRenderResolution(*(int *)par1, *(int *)par2); return 1; } + case Drv3dCommand::GET_XESS_VERSION: + { + auto maybeVersionString = api_state.device.getContext().getXessVersion(); + if (!maybeVersionString) + logerr("DX12: Failed to get XESS version string. Error: %s", XessWrapper::errorKindToString(maybeVersionString.error())); + + auto versionString = maybeVersionString.value_or("N/A"); + + char *data = reinterpret_cast(par1); + size_t size = reinterpret_cast(par2); + strncpy(data, versionString.c_str(), size); + return 1; + } case Drv3dCommand::EXECUTE_DLSS: { api_state.device.getContext().executeDlss(*(nv::DlssParams<> *)par1, par2 ? *(int *)par2 : 0); @@ -1784,10 +1806,13 @@ int d3d::driver_command(Drv3dCommand command, void *par1, void *par2, [[maybe_un } #if _TARGET_SCARLETT - case Drv3dCommand::GET_CONSOLE_120_HZ_STATUS: + case Drv3dCommand::GET_CONSOLE_HFR_STATUS: { - // Placeholder, for now it reports 120 Hz mode. Need to be implemented. - return 1; + return api_state.device.getContext().isHfrEnabled(); + } + case Drv3dCommand::GET_CONSOLE_HFR_SUPPORTED: + { + return api_state.device.getContext().isHfrSupported(); } #endif diff --git a/prog/engine/drv/drv3d_DX12/dynamic_array.h b/prog/engine/drv/drv3d_DX12/dynamic_array.h index 359e39343..a039a85ad 100644 --- a/prog/engine/drv/drv3d_DX12/dynamic_array.h +++ b/prog/engine/drv/drv3d_DX12/dynamic_array.h @@ -1,8 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include #include +#include +#include template diff --git a/prog/engine/drv/drv3d_DX12/events_pool.h b/prog/engine/drv/drv3d_DX12/events_pool.h index 33a253a8b..df8995d69 100644 --- a/prog/engine/drv/drv3d_DX12/events_pool.h +++ b/prog/engine/drv/drv3d_DX12/events_pool.h @@ -2,10 +2,14 @@ #pragma once #include -#include +#include #include +#include +#include +#include #include + class EventsPool { static constexpr uint8_t MAX_SLOT_COUNT = 16u; diff --git a/prog/engine/drv/drv3d_DX12/extents.h b/prog/engine/drv/drv3d_DX12/extents.h index be163f7fc..b7f2fb13c 100644 --- a/prog/engine/drv/drv3d_DX12/extents.h +++ b/prog/engine/drv/drv3d_DX12/extents.h @@ -1,13 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include - #include "driver.h" #include "util.h" +#include +#include +#include + struct Extent2D { diff --git a/prog/engine/drv/drv3d_DX12/extra_data_array.h b/prog/engine/drv/drv3d_DX12/extra_data_array.h new file mode 100644 index 000000000..eb85179c1 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/extra_data_array.h @@ -0,0 +1,17 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include +#include + +// Argument handler will transform this into RangeType +template +struct ExtraDataArray +{ + size_t index = 0; + + ExtraDataArray() = default; + ExtraDataArray(size_t i) : index{i} {} + + using RangeType = eastl::span; +}; diff --git a/prog/engine/drv/drv3d_DX12/extra_data_arrays.h b/prog/engine/drv/drv3d_DX12/extra_data_arrays.h new file mode 100644 index 000000000..f8f21d10b --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/extra_data_arrays.h @@ -0,0 +1,33 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "driver.h" +#include "extra_data_array.h" +#include "image_view_state.h" +#include "info_types.h" +#include "viewport_state.h" + +#include + +namespace drv3d_dx12 +{ +class Image; +class Query; + +using StringIndexRef = ExtraDataArray; +using WStringIndexRef = ExtraDataArray; + +#if D3D_HAS_RAY_TRACING +using RaytraceGeometryDescriptionBufferResourceReferenceSetListRef = + ExtraDataArray; +using D3D12_RAYTRACING_GEOMETRY_DESC_ListRef = ExtraDataArray; +#endif +using ImageViewStateListRef = ExtraDataArray; +using ImagePointerListRef = ExtraDataArray; +using QueryPointerListRef = ExtraDataArray; +using D3D12_CPU_DESCRIPTOR_HANDLE_ListRef = ExtraDataArray; +using BufferImageCopyListRef = ExtraDataArray; +using BufferResourceReferenceAndShaderResourceViewListRef = ExtraDataArray; +using ViewportListRef = ExtraDataArray; +using ScissorRectListRef = ExtraDataArray; +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/format_store.cpp b/prog/engine/drv/drv3d_DX12/format_store.cpp index af2479930..b184e1b99 100644 --- a/prog/engine/drv/drv3d_DX12/format_store.cpp +++ b/prog/engine/drv/drv3d_DX12/format_store.cpp @@ -1,9 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" - +#include "format_store.h" #include "format_traits.h" + using namespace drv3d_dx12; template @@ -165,6 +165,8 @@ enum class ColorSpace : uint8_t #define CONST_TABLE const #endif +const char *dxgi_format_name(DXGI_FORMAT fmt); + template struct FormatInfoTable { diff --git a/prog/engine/drv/drv3d_DX12/format_store.h b/prog/engine/drv/drv3d_DX12/format_store.h index 157354887..17ff2eb30 100644 --- a/prog/engine/drv/drv3d_DX12/format_store.h +++ b/prog/engine/drv/drv3d_DX12/format_store.h @@ -1,13 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include - -#include "driver.h" #include "bitfield.h" +#include "driver.h" #include "tagged_types.h" +#include +#include + namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/format_traits.h b/prog/engine/drv/drv3d_DX12/format_traits.h index 4f19ba311..6169f43c4 100644 --- a/prog/engine/drv/drv3d_DX12/format_traits.h +++ b/prog/engine/drv/drv3d_DX12/format_traits.h @@ -1,9 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" +#include enum class FormatClass diff --git a/prog/engine/drv/drv3d_DX12/frame_buffer.h b/prog/engine/drv/drv3d_DX12/frame_buffer.h new file mode 100644 index 000000000..3227dd9f2 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/frame_buffer.h @@ -0,0 +1,318 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "bitfield.h" +#include "d3d12_utils.h" +#include "driver.h" +#include "extents.h" +#include "format_store.h" +#include "image_view_state.h" +#include "resource_manager/image.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace drv3d_dx12 +{ +union FramebufferMask +{ + uint32_t raw = 0; + struct + { + uint32_t hasDepthStencilAttachment : 1; + uint32_t isConstantDepthstencilAttachment : 1; + uint32_t colorAttachmentMask : Driver3dRenderTarget::MAX_SIMRT; + }; + + template + void iterateColorAttachments(T &&u) + { + for (auto i : LsbVisitor{colorAttachmentMask}) + { + u(i); + } + } + + template + void iterateColorAttachments(uint32_t valid_mask, T &&u) + { + for (auto i : LsbVisitor{colorAttachmentMask & valid_mask}) + { + u(i); + } + } + + void setColorAttachment(uint32_t index) { colorAttachmentMask |= 1u << index; } + + void resetColorAttachment(uint32_t index) { colorAttachmentMask &= ~(1u << index); } + + void setDepthStencilAttachment(bool is_const) + { + hasDepthStencilAttachment = 1; + isConstantDepthstencilAttachment = is_const ? 1u : 0u; + } + + void resetDepthStencilAttachment() + { + hasDepthStencilAttachment = 0; + isConstantDepthstencilAttachment = 0; + } + + void resetAll() { raw = 0; } +}; + + +struct FramebufferInfo +{ + struct AttachmentInfo + { + Image *image = nullptr; + ImageViewState view = {}; + }; + + AttachmentInfo colorAttachments[Driver3dRenderTarget::MAX_SIMRT] = {}; + AttachmentInfo depthStencilAttachment = {}; + FramebufferMask attachmentMask; + + FramebufferMask getMatchingAttachmentMask(Image *texture) + { + FramebufferMask result; + uint32_t i = 1; + for (auto &colorAttachment : colorAttachments) + { + result.colorAttachmentMask |= colorAttachment.image == texture ? i : 0u; + i <<= 1; + } + result.isConstantDepthstencilAttachment = attachmentMask.isConstantDepthstencilAttachment; + result.hasDepthStencilAttachment = (depthStencilAttachment.image == texture) ? 1u : 0u; + return result; + } + + void setColorAttachment(uint32_t index, Image *image, ImageViewState view) + { + auto &target = colorAttachments[index]; + target.image = image; + target.view = view; + attachmentMask.setColorAttachment(index); + } + void clearColorAttachment(uint32_t index) + { + colorAttachments[index] = AttachmentInfo{}; + attachmentMask.resetColorAttachment(index); + } + void setDepthStencilAttachment(Image *image, ImageViewState view, bool read_only) + { + depthStencilAttachment.image = image; + depthStencilAttachment.view = view; + attachmentMask.setDepthStencilAttachment(read_only); + } + void clearDepthStencilAttachment() + { + depthStencilAttachment = AttachmentInfo{}; + attachmentMask.resetDepthStencilAttachment(); + } + bool hasConstDepthStencilAttachment() const { return 0 != attachmentMask.isConstantDepthstencilAttachment; } + bool hasDepthStencilAttachment() const { return 0 != attachmentMask.hasDepthStencilAttachment; } + Extent2D makeDrawArea(Extent2D def = {}) const; +}; + + +// This data structure is used as is for binary storage on disk for caches and its bit pattern is hashed, +// so its layout has to be tightly packed and avoid padding of members, otherwise initialized bits may +// yield different results for "equal" instances. +struct FramebufferLayout +{ + FormatStore colorFormats[Driver3dRenderTarget::MAX_SIMRT] = {}; + FormatStore depthStencilFormat = {}; + uint8_t colorTargetMask = 0; + uint16_t colorMsaaLevels = 0; + uint8_t hasDepth = 0; + uint8_t depthMsaaLevel = 0; + + static constexpr int MSAA_LEVEL_BITS_PER_RT = BitsNeeded<(TEXCF_SAMPLECOUNT_MAX >> TEXCF_SAMPLECOUNT_OFFSET)>::VALUE; + static_assert(sizeof(colorMsaaLevels) * 8 >= MSAA_LEVEL_BITS_PER_RT * Driver3dRenderTarget::MAX_SIMRT); + static_assert(MSAA_LEVEL_BITS_PER_RT + 1 <= 8); + + static constexpr size_t expected_size = sizeof(uint8_t) * Driver3dRenderTarget::MAX_SIMRT + sizeof(uint8_t) + sizeof(uint8_t) + + sizeof(uint16_t) + sizeof(uint8_t) + sizeof(uint8_t); + + void clear() + { + eastl::fill(eastl::begin(colorFormats), eastl::end(colorFormats), FormatStore{}); + depthStencilFormat = FormatStore{}; + colorTargetMask = 0; + hasDepth = 0; + depthMsaaLevel = 0; + colorMsaaLevels = 0; + } + + void setColorAttachment(uint8_t index, uint8_t msaa_level, FormatStore format) + { + colorTargetMask |= 1 << index; + colorFormats[index] = format; + setColorMsaaLevel(msaa_level, index); + } + + void clearColorAttachment(uint8_t index) + { + colorTargetMask &= ~(1 << index); + colorFormats[index] = FormatStore(0); + clearColorMsaaLevel(index); + } + + void setDepthStencilAttachment(uint8_t msaa_level, FormatStore format) + { + hasDepth = 1; + depthStencilFormat = format; + depthMsaaLevel = msaa_level; + } + + void clearDepthStencilAttachment() + { + hasDepth = 0; + depthStencilFormat = FormatStore(0); + depthMsaaLevel = 0; + } + + uint8_t getColorMsaaLevel(uint8_t index) const { return (colorMsaaLevels >> (index * MSAA_LEVEL_BITS_PER_RT)) & MSAA_LEVEL_MASK; } + + void checkMsaaLevelsEqual() const + { + eastl::optional previous; + for (const auto index : LsbVisitor{colorTargetMask}) + { + G_ASSERT(!previous || *previous == getColorMsaaLevel(index)); + previous = getColorMsaaLevel(index); + } + G_ASSERT(!previous || !hasDepth || *previous == depthMsaaLevel); + } + + // Calculates the color write mask for all targets, per target channel mask depends on format + uint32_t getColorWriteMask() const + { + uint32_t mask = 0; + for (auto i : LsbVisitor{colorTargetMask}) + { + auto m = colorFormats[i].getChannelMask(); + mask |= m << (i * 4); + } + return mask; + } + +private: + static constexpr int MSAA_LEVEL_MASK = TEXCF_SAMPLECOUNT_MASK >> TEXCF_SAMPLECOUNT_OFFSET; + + void clearColorMsaaLevel(uint8_t index) { colorMsaaLevels &= ~(MSAA_LEVEL_MASK << (index * MSAA_LEVEL_BITS_PER_RT)); } + + void setColorMsaaLevel(uint8_t level, uint8_t index) + { + clearColorMsaaLevel(index); + colorMsaaLevels |= level << (index * MSAA_LEVEL_BITS_PER_RT); + } +}; + +inline bool operator==(const FramebufferLayout &l, const FramebufferLayout &r) +{ + static_assert(sizeof(FramebufferLayout) == FramebufferLayout::expected_size); + return (l.colorTargetMask == r.colorTargetMask) && (l.hasDepth == r.hasDepth) && (l.depthStencilFormat == r.depthStencilFormat) && + l.colorMsaaLevels == r.colorMsaaLevels && l.depthMsaaLevel == r.depthMsaaLevel && + eastl::equal(eastl::begin(l.colorFormats), eastl::end(l.colorFormats), eastl::begin(r.colorFormats)); +} + +inline bool operator!=(const FramebufferLayout &l, const FramebufferLayout &r) { return !(l == r); } + + +struct FramebufferLayoutWithHash +{ + FramebufferLayout layout; + dxil::HashValue hash; +}; + +struct FramebufferDescription +{ + D3D12_CPU_DESCRIPTOR_HANDLE colorAttachments[Driver3dRenderTarget::MAX_SIMRT]; + D3D12_CPU_DESCRIPTOR_HANDLE depthStencilAttachment; + + void clear(D3D12_CPU_DESCRIPTOR_HANDLE null_color) + { + eastl::fill(eastl::begin(colorAttachments), eastl::end(colorAttachments), null_color); + depthStencilAttachment.ptr = 0; + } + + bool contains(D3D12_CPU_DESCRIPTOR_HANDLE view) const + { + using namespace eastl; + return (end(colorAttachments) != find(begin(colorAttachments), end(colorAttachments), view)) || (depthStencilAttachment == view); + } +}; + +inline bool operator==(const FramebufferDescription &l, const FramebufferDescription &r) +{ + return 0 == memcmp(&l, &r, sizeof(FramebufferDescription)); +} +inline bool operator!=(const FramebufferDescription &l, const FramebufferDescription &r) { return !(l == r); } + + +struct FramebufferState +{ + FramebufferInfo frontendFrameBufferInfo = {}; + FramebufferLayout framebufferLayout = {}; + FramebufferDescription frameBufferInfo = {}; + FramebufferMask framebufferDirtyState; + + void dirtyTextureState(Image *texture) + { + auto state = frontendFrameBufferInfo.getMatchingAttachmentMask(texture); + framebufferDirtyState.raw |= state.raw; + } + + void dirtyAllTexturesState() { framebufferDirtyState = frontendFrameBufferInfo.attachmentMask; } + + void clear(D3D12_CPU_DESCRIPTOR_HANDLE null_color) + { + frontendFrameBufferInfo = FramebufferInfo{}; + framebufferLayout.clear(); + frameBufferInfo.clear(null_color); + framebufferDirtyState.resetAll(); + } + + void bindColorTarget(uint32_t index, Image *image, ImageViewState ivs, D3D12_CPU_DESCRIPTOR_HANDLE view) + { + frontendFrameBufferInfo.setColorAttachment(index, image, ivs); + framebufferLayout.setColorAttachment(index, image->getMsaaLevel(), ivs.getFormat()); + frameBufferInfo.colorAttachments[index] = view; + framebufferDirtyState.setColorAttachment(index); + } + + void clearColorTarget(uint32_t index, D3D12_CPU_DESCRIPTOR_HANDLE null_handle) + { + frontendFrameBufferInfo.clearColorAttachment(index); + framebufferLayout.clearColorAttachment(index); + frameBufferInfo.colorAttachments[index] = null_handle; + framebufferDirtyState.resetColorAttachment(index); + } + + void bindDepthStencilTarget(Image *image, ImageViewState ivs, D3D12_CPU_DESCRIPTOR_HANDLE view, bool read_only) + { + frontendFrameBufferInfo.setDepthStencilAttachment(image, ivs, read_only); + framebufferLayout.setDepthStencilAttachment(image->getMsaaLevel(), ivs.getFormat()); + frameBufferInfo.depthStencilAttachment = view; + framebufferDirtyState.setDepthStencilAttachment(read_only); + } + + void clearDepthStencilTarget() + { + frontendFrameBufferInfo.clearDepthStencilAttachment(); + framebufferLayout.clearDepthStencilAttachment(); + frameBufferInfo.depthStencilAttachment.ptr = 0; + framebufferDirtyState.resetDepthStencilAttachment(); + } +}; +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/frontend_state.h b/prog/engine/drv/drv3d_DX12/frontend_state.h index bd57989a2..8f8d76886 100644 --- a/prog/engine/drv/drv3d_DX12/frontend_state.h +++ b/prog/engine/drv/drv3d_DX12/frontend_state.h @@ -1,6 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "const_register_type.h" +#include "device.h" +#include "device_context.h" +#include "resource_manager/raytrace_acceleration_structure.h" +#include "shader.h" +#include "texture.h" +#include "viewport_state.h" + #include #include #include @@ -10,14 +18,6 @@ #include #include -#include "device.h" -#include "device_context.h" -#include "texture.h" -#include "shader.h" -#include "const_register_type.h" -#include "viewport_state.h" -#include "resource_manager/raytrace_acceleration_structure.h" - namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/fsr2_wrapper.cpp b/prog/engine/drv/drv3d_DX12/fsr2_wrapper.cpp index df324400a..337f4a939 100644 --- a/prog/engine/drv/drv3d_DX12/fsr2_wrapper.cpp +++ b/prog/engine/drv/drv3d_DX12/fsr2_wrapper.cpp @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" #include "fsr2_wrapper.h" +#include "device.h" +#include #include #include -#include -#include + using namespace drv3d_dx12; diff --git a/prog/engine/drv/drv3d_DX12/fsr2_wrapper.h b/prog/engine/drv/drv3d_DX12/fsr2_wrapper.h index 305c52ff7..e615b255c 100644 --- a/prog/engine/drv/drv3d_DX12/fsr2_wrapper.h +++ b/prog/engine/drv/drv3d_DX12/fsr2_wrapper.h @@ -1,9 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include +#include #include #include -#include struct FfxFsr2ContextDescription; diff --git a/prog/engine/drv/drv3d_DX12/fsr2_wrapper_stub.cpp b/prog/engine/drv/drv3d_DX12/fsr2_wrapper_stub.cpp index fde3bbeeb..c9f8033cd 100644 --- a/prog/engine/drv/drv3d_DX12/fsr2_wrapper_stub.cpp +++ b/prog/engine/drv/drv3d_DX12/fsr2_wrapper_stub.cpp @@ -1,8 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" #include "fsr2_wrapper.h" + using namespace drv3d_dx12; struct FfxFsr2ContextDescription diff --git a/prog/engine/drv/drv3d_DX12/fsr_args.h b/prog/engine/drv/drv3d_DX12/fsr_args.h index e0dd3cdbc..2a171c9d1 100644 --- a/prog/engine/drv/drv3d_DX12/fsr_args.h +++ b/prog/engine/drv/drv3d_DX12/fsr_args.h @@ -3,6 +3,7 @@ #include <3d/dag_amdFsr.h> + namespace drv3d_dx12 { class Image; diff --git a/prog/engine/drv/drv3d_DX12/gpu_engine_state.h b/prog/engine/drv/drv3d_DX12/gpu_engine_state.h new file mode 100644 index 000000000..6a5d5f6be --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/gpu_engine_state.h @@ -0,0 +1,171 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "driver.h" +#include "pipeline.h" +#include "tagged_handles.h" +#include "frame_buffer.h" + +#include +#include +#include + + +namespace drv3d_dx12 +{ +class Image; + +enum class ActivePipeline +{ + Graphics, + Compute +}; + +struct GraphicsState +{ + enum + { + SCISSOR_RECT_DIRTY, + SCISSOR_ENABLED, + SCISSOR_ENABLED_DIRTY, + VIEWPORT_DIRTY, + USE_WIREFRAME, + + INDEX_BUFFER_DIRTY, + VERTEX_BUFFER_0_DIRTY, + VERTEX_BUFFER_1_DIRTY, + VERTEX_BUFFER_2_DIRTY, + VERTEX_BUFFER_3_DIRTY, + // state + INDEX_BUFFER_STATE_DIRTY, + VERTEX_BUFFER_STATE_0_DIRTY, + VERTEX_BUFFER_STATE_1_DIRTY, + VERTEX_BUFFER_STATE_2_DIRTY, + VERTEX_BUFFER_STATE_3_DIRTY, + + PREDICATION_BUFFER_STATE_DIRTY, + + COUNT + }; + + BasePipeline *basePipeline = nullptr; + PipelineVariant *pipeline = nullptr; + D3D12_PRIMITIVE_TOPOLOGY_TYPE topology = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED; + + InputLayoutID inputLayoutIdent = InputLayoutID::Null(); + StaticRenderStateID staticRenderStateIdent = StaticRenderStateID::Null(); + FramebufferLayoutID framebufferLayoutID = FramebufferLayoutID::Null(); + FramebufferState framebufferState; + D3D12_RECT scissorRects[Viewport::MAX_VIEWPORT_COUNT] = {}; + uint32_t scissorRectCount = 0; + D3D12_VIEWPORT viewports[Viewport::MAX_VIEWPORT_COUNT] = {}; + uint32_t viewportCount = 0; + eastl::bitset statusBits{0}; + + BufferResourceReferenceAndAddressRange indexBuffer; + DXGI_FORMAT indexBufferFormat = DXGI_FORMAT_R16_UINT; + BufferResourceReferenceAndAddressRange vertexBuffers[MAX_VERTEX_INPUT_STREAMS]; + uint32_t vertexBufferStrides[MAX_VERTEX_INPUT_STREAMS] = {}; + BufferResourceReferenceAndOffset predicationBuffer; + BufferResourceReferenceAndOffset activePredicationBuffer; + + void invalidateResourceStates() + { + statusBits.set(INDEX_BUFFER_STATE_DIRTY); + statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY); + statusBits.set(VERTEX_BUFFER_STATE_1_DIRTY); + statusBits.set(VERTEX_BUFFER_STATE_2_DIRTY); + statusBits.set(VERTEX_BUFFER_STATE_3_DIRTY); + statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); + framebufferState.dirtyAllTexturesState(); + } + + void dirtyBufferState(BufferGlobalId ident) + { + if (indexBuffer.resourceId == ident) + { + statusBits.set(INDEX_BUFFER_STATE_DIRTY); + } + for (auto [i, vertexBuffer] : enumerate(vertexBuffers, VERTEX_BUFFER_STATE_0_DIRTY)) + { + if (vertexBuffer.resourceId == ident) + { + statusBits.set(i); + } + } + if (predicationBuffer.resourceId == ident) + { + statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); + } + } + + void dirtyTextureState(Image *texture) { framebufferState.dirtyTextureState(texture); } + + void onFlush() + { + G_STATIC_ASSERT(4 == MAX_VERTEX_INPUT_STREAMS); + framebufferLayoutID = FramebufferLayoutID::Null(); + statusBits.set(INDEX_BUFFER_DIRTY); + statusBits.set(INDEX_BUFFER_STATE_DIRTY); + for (uint32_t i = 0; i < MAX_VERTEX_INPUT_STREAMS; ++i) + { + statusBits.set(VERTEX_BUFFER_0_DIRTY + i); + statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY + i); + } + statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); + activePredicationBuffer = {}; + + framebufferState.dirtyAllTexturesState(); + } + + void onFrameStateInvalidate(D3D12_CPU_DESCRIPTOR_HANDLE null_ct) + { + pipeline = nullptr; + + statusBits.set(GraphicsState::VIEWPORT_DIRTY); + statusBits.set(GraphicsState::SCISSOR_RECT_DIRTY); + + framebufferState.clear(null_ct); + + basePipeline = nullptr; + framebufferLayoutID = FramebufferLayoutID::Null(); + + indexBuffer = {}; + statusBits.set(INDEX_BUFFER_DIRTY); + statusBits.set(INDEX_BUFFER_STATE_DIRTY); + + for (uint32_t i = 0; i < MAX_VERTEX_INPUT_STREAMS; ++i) + { + statusBits.set(VERTEX_BUFFER_0_DIRTY + i); + statusBits.set(VERTEX_BUFFER_STATE_0_DIRTY + i); + vertexBuffers[i] = {}; + } + + predicationBuffer = {}; + activePredicationBuffer = {}; + statusBits.set(PREDICATION_BUFFER_STATE_DIRTY); + + framebufferState.dirtyAllTexturesState(); + } +}; + +struct ComputeState +{ + ComputePipeline *pipeline = nullptr; + + void onFlush() {} + void onFrameStateInvalidate() { pipeline = nullptr; } +}; + +#if D3D_HAS_RAY_TRACING +struct RaytraceState +{ + RaytracePipeline *pipeline = nullptr; + + void onFlush() {} + + void onFrameStateInvalidate() { pipeline = nullptr; } +}; +#endif + +} // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/host_device_shared_memory_region.h b/prog/engine/drv/drv3d_DX12/host_device_shared_memory_region.h index 5c517b719..2a8473d91 100644 --- a/prog/engine/drv/drv3d_DX12/host_device_shared_memory_region.h +++ b/prog/engine/drv/drv3d_DX12/host_device_shared_memory_region.h @@ -1,10 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" -#include "value_range.h" + +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/image_global_subresource_id.h b/prog/engine/drv/drv3d_DX12/image_global_subresource_id.h index cf49a25c8..ed5159ab5 100644 --- a/prog/engine/drv/drv3d_DX12/image_global_subresource_id.h +++ b/prog/engine/drv/drv3d_DX12/image_global_subresource_id.h @@ -1,10 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "tagged_types.h" -#include "value_range.h" + +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/image_view_state.h b/prog/engine/drv/drv3d_DX12/image_view_state.h index 03e4252ce..c3b75b2d4 100644 --- a/prog/engine/drv/drv3d_DX12/image_view_state.h +++ b/prog/engine/drv/drv3d_DX12/image_view_state.h @@ -1,10 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" #include "bitfield.h" #include "format_store.h" -#include + #include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/info_types.h b/prog/engine/drv/drv3d_DX12/info_types.h new file mode 100644 index 000000000..d96d3fbe3 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/info_types.h @@ -0,0 +1,123 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "driver.h" +#include "extents.h" +#include "host_device_shared_memory_region.h" +#include "pipeline.h" +#include "tagged_types.h" + +#include +#include + + +namespace drv3d_dx12 +{ +class Image; + +struct ClearDepthStencilValue +{ + float depth; + uint32_t stencil; +}; + +union ClearColorValue +{ + float float32[4]; +}; + +struct ImageSubresourceRange +{ + MipMapRange mipMapRange; + ArrayLayerRange arrayLayerRange; +}; + +struct ImageSubresourceLayers +{ + MipMapIndex mipLevel; + ArrayLayerIndex baseArrayLayer; +}; + +struct ImageBlit +{ + ImageSubresourceLayers srcSubresource; + Offset3D srcOffsets[2]; // change to 2d have no 3d blitting + ImageSubresourceLayers dstSubresource; + Offset3D dstOffsets[2]; // change to 2d have no 3d blitting +}; + +struct ImageCopy +{ + SubresourceIndex srcSubresource; + SubresourceIndex dstSubresource; + Offset3D dstOffset; + D3D12_BOX srcBox; +}; + +struct ImageStateRange +{ + Image *image = nullptr; + uint32_t stateArrayIndex = 0; + ValueRange arrayRange; + ValueRange mipRange; +}; +struct ImageStateRangeInfo +{ + D3D12_RESOURCE_STATES state; + ValueRange idRange; +}; + +struct BufferCopy +{ + uint64_t srcOffset; + uint64_t dstOffset; + uint64_t size; +}; + +struct BufferImageCopy +{ + D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout; + UINT subresourceIndex; + Offset3D imageOffset; +}; + +struct BufferStateInfo +{ + D3D12_RESOURCE_STATES state; + uint32_t id; +}; + +struct FrontendTimelineTextureUsage +{ + Image *texture = nullptr; + uint32_t subResId = 0; + D3D12_RESOURCE_STATES usage = D3D12_RESOURCE_STATE_COMMON; + D3D12_RESOURCE_STATES nextUsage = D3D12_RESOURCE_STATE_COMMON; + D3D12_RESOURCE_STATES prevUsage = D3D12_RESOURCE_STATE_COMMON; + size_t nextIndex = ~size_t(0); + size_t prevIndex = ~size_t(0); + size_t cmdIndex = 0; + // for render/depth-stencil target this is the index to the last draw + // command before it transitions into nextUsage. + // This information is used to insert split barriers. + size_t lastCmdIndex = ~size_t(0); +}; + +struct HostDeviceSharedMemoryImageCopyInfo +{ + HostDeviceSharedMemoryRegion cpuMemory; + Image *image; + uint32_t copyIndex; + uint32_t copyCount; +}; + +#if D3D_HAS_RAY_TRACING +struct RaytraceGeometryDescriptionBufferResourceReferenceSet +{ + BufferResourceReference vertexOrAABBBuffer; + BufferResourceReference indexBuffer; + BufferResourceReference transformBuffer; +}; +#endif + +} // namespace drv3d_dx12 \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/jamfile b/prog/engine/drv/drv3d_DX12/jamfile index 30d3e1998..42761a2ce 100644 --- a/prog/engine/drv/drv3d_DX12/jamfile +++ b/prog/engine/drv/drv3d_DX12/jamfile @@ -17,7 +17,6 @@ Sources = swapchain.cpp format_store.cpp device_context.cpp - device_context_cmd_log.cpp shader.cpp texture.cpp pipeline.cpp @@ -29,9 +28,7 @@ Sources = resource_manager/rtx_components.cpp resource_manager/host_shared_components.cpp resource_update_buffer.cpp - resource_usage_debugger.cpp pipeline/blk_cache.cpp - shader_library.cpp ; CPPopt = -DINSIDE_DRIVER ; @@ -42,7 +39,10 @@ if [ GLOB $(Root)/prog/3rdPartyLibs/nvapi : * ] { CPPopt += -DHAS_NVAPI ; } if $(Config) != rel { Sources += - debug/debug_types.cpp ; + debug/debug_types.cpp + debug/frame_command_logger.cpp + resource_usage_debugger.cpp + ; } if $(Platform) in windows { @@ -54,6 +54,7 @@ if $(Platform) in windows { debug/gpu_postmortem_dagor_trace.cpp debug/gpu_postmortem_microsoft_dred.cpp debug/pipeline_resource_reporter.cpp + shader_library.cpp ; if $(PlatformArch) in arm64 { CPPopt = [ StripStrings $(CPPopt) : -DHAS_NVAPI ] ; } if [ GLOB $(Root)/prog/3rdPartyLibs/aftermath : * ] { @@ -71,6 +72,7 @@ if $(Platform) in windows { if $(Platform) = xboxOne { AddLibs += d3d12_x.lib xg_x.lib ; } else { + Sources += shader_library.cpp ; AddLibs += d3d12_xs.lib xg_xs.lib ; } Sources += diff --git a/prog/engine/drv/drv3d_DX12/pipeline.cpp b/prog/engine/drv/drv3d_DX12/pipeline.cpp index f5b5bdad2..f74022e9e 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline.cpp +++ b/prog/engine/drv/drv3d_DX12/pipeline.cpp @@ -1,10 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "pipeline.h" #include "device.h" -#include "EASTL/functional.h" +#include "render_target_mask_util.h" + +#include #include -#include "render_target_mask_util.h" using namespace drv3d_dx12; @@ -341,7 +343,7 @@ bool PipelineVariant::create(ID3D12Device2 *device, backend::ShaderModuleManager auto result = DX12_CHECK_RESULT(xbox_create_graphics_pipeline(device, desc, !static_state.enableDepthBounds, pipeline)); #endif // Special handling as on PC we may have to retry if cache blob reload failed - if (FAILED(drv3d_dx12::dx12_check_result(result, "CreatePipelineState", __FILE__, __LINE__))) + if (FAILED(DX12_CHECK_RESULTF(result, "CreatePipelineState"))) { if (is_recoverable_error(result)) { @@ -551,7 +553,7 @@ bool PipelineVariant::createMesh(ID3D12Device2 *device, backend::ShaderModuleMan } #endif // Special handling as on PC we may have to retry if cache blob reload failed - if (FAILED(drv3d_dx12::dx12_check_result(result, "CreatePipelineState", __FILE__, __LINE__))) + if (FAILED(DX12_CHECK_RESULTF(result, "CreatePipelineState"))) { if (is_recoverable_error(result)) { @@ -2696,129 +2698,130 @@ void PipelineManager::writeBlkCache(FramebufferLayoutManager &fblm, uint32_t gro void PipelineStageStateBase::setSRVTexture(uint32_t unit, Image *image, ImageViewState view_state, bool as_const_ds, D3D12_CPU_DESCRIPTOR_HANDLE view) { - if ((tRegisters[unit].image != image) || (tRegisters[unit].imageView != view_state) || (tRegisters[unit].view != view) || - isConstDepthStencil.test(unit) != as_const_ds) - { - isConstDepthStencil.set(unit, as_const_ds); + if ((tRegisters[unit].image == image) && (tRegisters[unit].imageView == view_state) && (tRegisters[unit].view == view) && + isConstDepthStencil.test(unit) == as_const_ds) + return; + + isConstDepthStencil.set(unit, as_const_ds); #if D3D_HAS_RAY_TRACING - tRegisters[unit].as = nullptr; + tRegisters[unit].as = nullptr; #endif - tRegisters[unit].buffer = BufferReference{}; + tRegisters[unit].buffer = BufferReference{}; - tRegisters[unit].image = image; - tRegisters[unit].imageView = view_state; - tRegisters[unit].view = view; + tRegisters[unit].image = image; + tRegisters[unit].imageView = view_state; + tRegisters[unit].view = view; - tRegisterValidMask &= ~(1 << unit); - if (image && image->hasTrackedState()) - { - tRegisterStateDirtyMask |= 1u << unit; - } + tRegisterValidMask &= ~(1 << unit); + if (image && image->hasTrackedState()) + { + tRegisterStateDirtyMask |= 1u << unit; } + + if (image) + image->dbgValidateImageViewStateCompatibility(view_state); } void PipelineStageStateBase::setSampler(uint32_t unit, D3D12_CPU_DESCRIPTOR_HANDLE sampler) { - if (sRegisters[unit] != sampler) - { - sRegisterValidMask &= ~(1 << unit); - sRegisters[unit] = sampler; - } + if (sRegisters[unit] == sampler) + return; + + sRegisterValidMask &= ~(1 << unit); + sRegisters[unit] = sampler; } void PipelineStageStateBase::setUAVTexture(uint32_t unit, Image *image, ImageViewState view_state, D3D12_CPU_DESCRIPTOR_HANDLE view) { - if ((uRegisters[unit].image != image) || (uRegisters[unit].imageView != view_state) || (uRegisters[unit].view != view)) - { - uRegisterValidMask &= ~(1 << unit); - uRegisterStateDirtyMask |= 1u << unit; + if ((uRegisters[unit].image == image) && (uRegisters[unit].imageView == view_state) && (uRegisters[unit].view == view)) + return; - uRegisters[unit].image = image; - uRegisters[unit].imageView = view_state; - uRegisters[unit].view = view; + uRegisterValidMask &= ~(1 << unit); + uRegisterStateDirtyMask |= 1u << unit; - uRegisters[unit].buffer = BufferReference{}; - } + uRegisters[unit].image = image; + uRegisters[unit].imageView = view_state; + uRegisters[unit].view = view; + + uRegisters[unit].buffer = BufferReference{}; } bool PipelineStageStateBase::setSRVBuffer(uint32_t unit, BufferResourceReferenceAndShaderResourceView buffer) { - if (tRegisters[unit].view != buffer) - { - tRegisterValidMask &= ~(1 << unit); - tRegisterStateDirtyMask |= 1u << unit; - // have to ensure that samplers have to be looked up again - sRegisterValidMask = 0; + if (tRegisters[unit].view == buffer) + return false; + + tRegisterValidMask &= ~(1 << unit); + tRegisterStateDirtyMask |= 1u << unit; + // have to ensure that samplers have to be looked up again + sRegisterValidMask = 0; #if D3D_HAS_RAY_TRACING - tRegisters[unit].as = nullptr; + tRegisters[unit].as = nullptr; #endif - tRegisters[unit].buffer = buffer; + tRegisters[unit].buffer = buffer; - tRegisters[unit].image = nullptr; - tRegisters[unit].imageView = ImageViewState(); - tRegisters[unit].view = buffer.srv; + tRegisters[unit].image = nullptr; + tRegisters[unit].imageView = ImageViewState(); + tRegisters[unit].view = buffer.srv; - return true; - } - return false; + return true; } bool PipelineStageStateBase::setUAVBuffer(uint32_t unit, BufferResourceReferenceAndUnorderedResourceView buffer) { - if (uRegisters[unit].view != buffer) - { - uRegisterValidMask &= ~(1 << unit); - uRegisterStateDirtyMask |= 1u << unit; + if (uRegisters[unit].view == buffer) + return false; - uRegisters[unit].buffer = buffer; + uRegisterValidMask &= ~(1 << unit); + uRegisterStateDirtyMask |= 1u << unit; - uRegisters[unit].image = nullptr; - uRegisters[unit].imageView = ImageViewState(); - uRegisters[unit].view = buffer.uav; + uRegisters[unit].buffer = buffer; - return true; - } - return false; + uRegisters[unit].image = nullptr; + uRegisters[unit].imageView = ImageViewState(); + uRegisters[unit].view = buffer.uav; + + return true; } void PipelineStageStateBase::setConstBuffer(uint32_t unit, const ConstBufferSetupInformation &info) { - if (bRegisters[unit] != info.buffer) - { - bRegisterValidMask &= ~(1 << unit); - bRegisterStateDirtyMask |= 1u << unit; + if (bRegisters[unit] == info.buffer) + return; - bRegisters[unit].BufferLocation = info.buffer.gpuPointer; - bRegisters[unit].SizeInBytes = info.buffer.size; - bRegisterBuffers[unit] = info; - } + bRegisterValidMask &= ~(1 << unit); + bRegisterStateDirtyMask |= 1u << unit; + + bRegisters[unit].BufferLocation = info.buffer.gpuPointer; + bRegisters[unit].SizeInBytes = info.buffer.size; + bRegisterBuffers[unit] = info; } #if D3D_HAS_RAY_TRACING void PipelineStageStateBase::setRaytraceAccelerationStructureAtT(uint32_t unit, RaytraceAccelerationStructure *as) { - if (tRegisters[unit].as != as) - { - tRegisterValidMask &= ~(1 << unit); - tRegisterStateDirtyMask |= 1u << unit; - // have to ensure that samplers have to be looked up again - sRegisterValidMask = 0; + if (tRegisters[unit].as == as) + return; - tRegisters[unit].as = as; + tRegisterValidMask &= ~(1 << unit); + tRegisterStateDirtyMask |= 1u << unit; + // have to ensure that samplers have to be looked up again + sRegisterValidMask = 0; - tRegisters[unit].buffer = BufferReference{}; + tRegisters[unit].as = as; - tRegisters[unit].image = nullptr; - tRegisters[unit].imageView = ImageViewState(); - tRegisters[unit].view.ptr = 0; + tRegisters[unit].buffer = BufferReference{}; - if (as) - { - tRegisters[unit].view = as->descriptor; - } + tRegisters[unit].image = nullptr; + tRegisters[unit].imageView = ImageViewState(); + tRegisters[unit].view.ptr = 0; + + if (as) + { + tRegisters[unit].view = as->descriptor; } } #endif @@ -2830,39 +2833,39 @@ void PipelineStageStateBase::setSRVNull(uint32_t unit) #if D3D_HAS_RAY_TRACING hasChanged = hasChanged || nullptr != slot.as; #endif - if (hasChanged) - { - tRegisterValidMask &= ~(1 << unit); - tRegisterStateDirtyMask |= 1u << unit; - sRegisterValidMask = 0; + if (!hasChanged) + return; + + tRegisterValidMask &= ~(1 << unit); + tRegisterStateDirtyMask |= 1u << unit; + sRegisterValidMask = 0; #if D3D_HAS_RAY_TRACING - slot.as = nullptr; + slot.as = nullptr; #endif - slot.buffer = BufferReference{}; + slot.buffer = BufferReference{}; - slot.image = nullptr; - slot.imageView = ImageViewState{}; + slot.image = nullptr; + slot.imageView = ImageViewState{}; - slot.view = D3D12_CPU_DESCRIPTOR_HANDLE{0}; - } + slot.view = D3D12_CPU_DESCRIPTOR_HANDLE{0}; } void PipelineStageStateBase::setUAVNull(uint32_t unit) { auto &slot = uRegisters[unit]; - if (D3D12_CPU_DESCRIPTOR_HANDLE{0} != slot.view) - { - uRegisterValidMask &= ~(1 << unit); - uRegisterStateDirtyMask |= 1u << unit; + if (D3D12_CPU_DESCRIPTOR_HANDLE{0} == slot.view) + return; - slot.buffer = BufferReference{}; + uRegisterValidMask &= ~(1 << unit); + uRegisterStateDirtyMask |= 1u << unit; - slot.image = nullptr; - slot.imageView = ImageViewState{}; - slot.view = D3D12_CPU_DESCRIPTOR_HANDLE{0}; - } + slot.buffer = BufferReference{}; + + slot.image = nullptr; + slot.imageView = ImageViewState{}; + slot.view = D3D12_CPU_DESCRIPTOR_HANDLE{0}; } namespace @@ -2917,6 +2920,7 @@ void PipelineStageStateBase::flushResourceStates(uint32_t b_register_mask, uint3 { if (tRegisters[i].image) { + tRegisters[i].image->dbgValidateImageViewStateCompatibility(tRegisters[i].imageView); res_usage.useTextureAsSRV(barrier_batcher, split_tracker, stage, tRegisters[i].image, tRegisters[i].imageView, isConstDepthStencil.test(i)); } @@ -3083,4 +3087,4 @@ void ShaderDeviceRequirementChecker::init(ID3D12Device *device) to_debuglog(supportedRequirement); } -#endif \ No newline at end of file +#endif diff --git a/prog/engine/drv/drv3d_DX12/pipeline.h b/prog/engine/drv/drv3d_DX12/pipeline.h index 3291cdd10..7f58cc3d2 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline.h +++ b/prog/engine/drv/drv3d_DX12/pipeline.h @@ -1,26 +1,28 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "d3d12_debug_names.h" +#include "d3d12_error_handling.h" +#include "d3d12_utils.h" +#include "descriptor_heap.h" +#include "dynamic_array.h" +#include "host_device_shared_memory_region.h" +#include "image_view_state.h" +#include "pipeline_cache.h" +#include "render_state.h" +#include "shader_program_id.h" +#include "tagged_handles.h" + #include -#include -#include -#include +#include #include +#include +#include +#include #include #include #include -#include -#include "d3d12_error_handling.h" -#include "d3d12_debug_names.h" -#include "host_device_shared_memory_region.h" -#include "shader_program_id.h" -#include "pipeline_cache.h" -#include "d3d12_utils.h" -#include "render_state.h" -#include "descriptor_heap.h" -#include "image_view_state.h" -#include "tagged_handles.h" namespace cacheBlk { @@ -627,30 +629,29 @@ struct PipelineCreateInfoDataBase return *::new (at) CT{IST(eastl::forward(args)...)}; } }; +}; - // this just explodes if the inner storage type is a pointer so - // need extra handling of that - template <> - struct ConstructExecuter +// this just explodes if the inner storage type is a pointer so +// need extra handling of that +template <> +struct PipelineCreateInfoDataBase::ConstructExecuter +{ + template + static CT &construct(void *at, Args &&...args) { - template - static CT &construct(void *at, Args &&...args) - { - return *::new (at) CT{eastl::forward(args)...}; - } - }; + return *::new (at) CT{eastl::forward(args)...}; + } +}; - template - struct ConstructHandler> +template +struct PipelineCreateInfoDataBase::ConstructHandler> +{ + typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT ConstructType; + template + static ConstructType &construct(void *at, Args &&...args) { - typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT ConstructType; - template - static ConstructType &construct(void *at, Args &&...args) - { - return ConstructExecuter::value>::template construct(at, - eastl::forward(args)...); - } - }; + return ConstructExecuter::value>::template construct(at, eastl::forward(args)...); + } }; // This is a base structure for pipeline create info, it diff --git a/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.cpp b/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.cpp index 67e4f2581..47bb390e2 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.cpp +++ b/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.cpp @@ -1,6 +1,8 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "blk_cache.h" +#include + using namespace drv3d_dx12; diff --git a/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.h b/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.h index b99aa7532..2529f078a 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.h +++ b/prog/engine/drv/drv3d_DX12/pipeline/blk_cache.h @@ -1,10 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include +#include +#include +#include -#include "derived_span.h" -#include "pipeline_cache.h" +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/pipeline_cache.cpp b/prog/engine/drv/drv3d_DX12/pipeline_cache.cpp index 4aca04920..b424ed85b 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline_cache.cpp +++ b/prog/engine/drv/drv3d_DX12/pipeline_cache.cpp @@ -1,15 +1,16 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "pipeline_cache.h" +#include "const_register_type.h" +#include "d3d12_error_handling.h" +#include "pipeline/blk_cache.h" #include #include -#include #include +#include #include -#include "const_register_type.h" - using namespace drv3d_dx12; diff --git a/prog/engine/drv/drv3d_DX12/pipeline_cache.h b/prog/engine/drv/drv3d_DX12/pipeline_cache.h index 1d40b5352..b6e690bd2 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline_cache.h +++ b/prog/engine/drv/drv3d_DX12/pipeline_cache.h @@ -1,132 +1,23 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include -#include - -#include "render_state.h" +#include "constants.h" #include "device_caps_and_shader_model.h" #include "format_store.h" -#include "constants.h" +#include "frame_buffer.h" +#include "render_state.h" #include "shader.h" +#include +#include +#include +#include + inline const char CACHE_FILE_NAME[] = "cache/dx12.cache"; namespace drv3d_dx12 { -// This data structure is used as is for binary storage on disk for caches and its bit pattern is hashed, -// so its layout has to be tightly packed and avoid padding of members, otherwise initialized bits may -// yield different results for "equal" instances. -struct FramebufferLayout -{ - FormatStore colorFormats[Driver3dRenderTarget::MAX_SIMRT] = {}; - FormatStore depthStencilFormat = {}; - uint8_t colorTargetMask = 0; - uint16_t colorMsaaLevels = 0; - uint8_t hasDepth = 0; - uint8_t depthMsaaLevel = 0; - - static constexpr int MSAA_LEVEL_BITS_PER_RT = BitsNeeded<(TEXCF_SAMPLECOUNT_MAX >> TEXCF_SAMPLECOUNT_OFFSET)>::VALUE; - static_assert(sizeof(colorMsaaLevels) * 8 >= MSAA_LEVEL_BITS_PER_RT * Driver3dRenderTarget::MAX_SIMRT); - static_assert(MSAA_LEVEL_BITS_PER_RT + 1 <= 8); - - static constexpr size_t expected_size = sizeof(uint8_t) * Driver3dRenderTarget::MAX_SIMRT + sizeof(uint8_t) + sizeof(uint8_t) + - sizeof(uint16_t) + sizeof(uint8_t) + sizeof(uint8_t); - - void clear() - { - eastl::fill(eastl::begin(colorFormats), eastl::end(colorFormats), FormatStore{}); - depthStencilFormat = FormatStore{}; - colorTargetMask = 0; - hasDepth = 0; - depthMsaaLevel = 0; - colorMsaaLevels = 0; - } - - void setColorAttachment(uint8_t index, uint8_t msaa_level, FormatStore format) - { - colorTargetMask |= 1 << index; - colorFormats[index] = format; - setColorMsaaLevel(msaa_level, index); - } - - void clearColorAttachment(uint8_t index) - { - colorTargetMask &= ~(1 << index); - colorFormats[index] = FormatStore(0); - clearColorMsaaLevel(index); - } - - void setDepthStencilAttachment(uint8_t msaa_level, FormatStore format) - { - hasDepth = 1; - depthStencilFormat = format; - depthMsaaLevel = msaa_level; - } - - void clearDepthStencilAttachment() - { - hasDepth = 0; - depthStencilFormat = FormatStore(0); - depthMsaaLevel = 0; - } - - uint8_t getColorMsaaLevel(uint8_t index) const { return (colorMsaaLevels >> (index * MSAA_LEVEL_BITS_PER_RT)) & MSAA_LEVEL_MASK; } - - void checkMsaaLevelsEqual() const - { - eastl::optional previous; - for (const auto index : LsbVisitor{colorTargetMask}) - { - G_ASSERT(!previous || *previous == getColorMsaaLevel(index)); - previous = getColorMsaaLevel(index); - } - G_ASSERT(!previous || !hasDepth || *previous == depthMsaaLevel); - } - - // Calculates the color write mask for all targets, per target channel mask depends on format - uint32_t getColorWriteMask() const - { - uint32_t mask = 0; - for (auto i : LsbVisitor{colorTargetMask}) - { - auto m = colorFormats[i].getChannelMask(); - mask |= m << (i * 4); - } - return mask; - } - -private: - static constexpr int MSAA_LEVEL_MASK = TEXCF_SAMPLECOUNT_MASK >> TEXCF_SAMPLECOUNT_OFFSET; - - void clearColorMsaaLevel(uint8_t index) { colorMsaaLevels &= ~(MSAA_LEVEL_MASK << (index * MSAA_LEVEL_BITS_PER_RT)); } - - void setColorMsaaLevel(uint8_t level, uint8_t index) - { - clearColorMsaaLevel(index); - colorMsaaLevels |= level << (index * MSAA_LEVEL_BITS_PER_RT); - } -}; - -inline bool operator==(const FramebufferLayout &l, const FramebufferLayout &r) -{ - static_assert(sizeof(FramebufferLayout) == FramebufferLayout::expected_size); - return (l.colorTargetMask == r.colorTargetMask) && (l.hasDepth == r.hasDepth) && (l.depthStencilFormat == r.depthStencilFormat) && - l.colorMsaaLevels == r.colorMsaaLevels && l.depthMsaaLevel == r.depthMsaaLevel && - eastl::equal(eastl::begin(l.colorFormats), eastl::end(l.colorFormats), eastl::begin(r.colorFormats)); -} - -inline bool operator!=(const FramebufferLayout &l, const FramebufferLayout &r) { return !(l == r); } - -struct FramebufferLayoutWithHash -{ - FramebufferLayout layout; - dxil::HashValue hash; -}; - struct BasePipelineIdentifierHashSet { char vsHash[1 + 2 * sizeof(dxil::HashValue)]{}; diff --git a/prog/engine/drv/drv3d_DX12/platform.h b/prog/engine/drv/drv3d_DX12/platform.h index 7ee7a1268..40223a071 100644 --- a/prog/engine/drv/drv3d_DX12/platform.h +++ b/prog/engine/drv/drv3d_DX12/platform.h @@ -1,13 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include +#include "driver.h" +#include #include - -#include "driver.h" +#include +#include namespace drv3d_dx12 @@ -21,11 +20,12 @@ struct HDRCapabilities eastl::optional get_hdr_caps(const ComPtr &output); bool is_hdr_available(const ComPtr &output = {}); -bool change_hdr(bool force_enable = false, const ComPtr &output = {}); +bool change_hdr(bool prefer_hfr, bool force_enable = false, const ComPtr &output = {}); void hdr_changed(const eastl::optional &caps); struct SwapchainProperties; void set_hdr_config(SwapchainProperties &sci); +void set_hfr_config(SwapchainProperties &sci); #if _TARGET_PC_WIN struct Direct3D12Enviroment diff --git a/prog/engine/drv/drv3d_DX12/platform_pc.cpp b/prog/engine/drv/drv3d_DX12/platform_pc.cpp index 76d2e22fe..99394cfdf 100644 --- a/prog/engine/drv/drv3d_DX12/platform_pc.cpp +++ b/prog/engine/drv/drv3d_DX12/platform_pc.cpp @@ -1,8 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "platform.h" #include "device.h" #include + using namespace drv3d_dx12; eastl::optional drv3d_dx12::get_hdr_caps(const ComPtr &output) diff --git a/prog/engine/drv/drv3d_DX12/query_manager.h b/prog/engine/drv/drv3d_DX12/query_manager.h index e61e5bf2d..655ee1e7b 100644 --- a/prog/engine/drv/drv3d_DX12/query_manager.h +++ b/prog/engine/drv/drv3d_DX12/query_manager.h @@ -1,11 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" +#include "pipeline.h" + #include #include -#include "driver.h" -#include "pipeline.h" namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/render_state.h b/prog/engine/drv/drv3d_DX12/render_state.h index c519e61f5..097ad45b2 100644 --- a/prog/engine/drv/drv3d_DX12/render_state.h +++ b/prog/engine/drv/drv3d_DX12/render_state.h @@ -1,20 +1,21 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "bitfield.h" +#include "driver.h" +#include "dynamic_array.h" +#include "tagged_handles.h" + +#include +#include +#include +#include +#include #include #include +#include #include #include -#include -#include -#include -#include -#include - -#include "driver.h" -#include "bitfield.h" -#include "tagged_handles.h" -#include "dynamic_array.h" #define MINIMUM_REPRESENTABLE_D32 3e-10 diff --git a/prog/engine/drv/drv3d_DX12/render_target_mask_util.h b/prog/engine/drv/drv3d_DX12/render_target_mask_util.h index 1dda62f06..d3899d348 100644 --- a/prog/engine/drv/drv3d_DX12/render_target_mask_util.h +++ b/prog/engine/drv/drv3d_DX12/render_target_mask_util.h @@ -1,6 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include + + // Input is 4x8 bits color channel mask and output will be a 8bit mask of render targets inline uint32_t color_channel_mask_to_render_target_mask(uint32_t mask) { diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/basic_buffer.h b/prog/engine/drv/drv3d_DX12/resource_manager/basic_buffer.h index 2b837a92c..40f9236bb 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/basic_buffer.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/basic_buffer.h @@ -1,18 +1,16 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - -#include "driver.h" -#include "d3d12_error_handling.h" -#include "resource_memory.h" +#include "heap_components.h" +#include +#include +#include -#include "resource_manager/heap_components.h" +#include namespace drv3d_dx12::resource_manager { - // Basic buffer with some common stuff, like handling differences in memory model between PC and consoles. struct BasicBuffer { @@ -79,4 +77,4 @@ struct BasicBuffer explicit operator bool() const { return static_cast(buffer); } }; -} // namespace drv3d_dx12::resource_manager \ No newline at end of file +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/basic_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/basic_components.h index c87f25170..7c57e26cd 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/basic_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/basic_components.h @@ -1,35 +1,32 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include -#include -#include +#include +#include #include +#include #include #include #include // psapi.h is not self-contained, it needs windows.h -#include "driver.h" -#include "d3d12_utils.h" -#include "typed_bit_set.h" -#include "tagged_types.h" -#include "extents.h" -#include "format_store.h" -#include "container_mutex_wrapper.h" -#include "free_list_utils.h" -#include "image_global_subresource_id.h" - - -namespace drv3d_dx12 -{ // We try to work without this #define DX12_USE_ACTIVITY_LOCKING 0 -namespace resource_manager +namespace drv3d_dx12::resource_manager { class ConcurrentAccessControler { @@ -1642,6 +1639,4 @@ class GlobalSubresourceIdProvider : public MetricsProvider free_list_insert_and_coalesce(stateAccess->freeRanges, range); } }; - -} // namespace resource_manager -} // namespace drv3d_dx12 \ No newline at end of file +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.cpp b/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.cpp index 5ac791520..bc1f521f2 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.cpp @@ -1,13 +1,15 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" -#include "device_context.h" +#include "buffer_components.h" +#include +#include -using namespace drv3d_dx12; -BufferState resource_manager::BufferHeap::discardBuffer(DXGIAdapter *adapter, Device &device, BufferState to_discared, - DeviceMemoryClass memory_class, FormatStore format, uint32_t struct_size, bool raw_view, bool struct_view, - D3D12_RESOURCE_FLAGS flags, uint32_t cflags, const char *name, uint32_t frame_index, bool disable_sub_alloc, bool name_objects) +namespace drv3d_dx12::resource_manager +{ +BufferState BufferHeap::discardBuffer(DXGIAdapter *adapter, Device &device, BufferState to_discared, DeviceMemoryClass memory_class, + FormatStore format, uint32_t struct_size, bool raw_view, bool struct_view, D3D12_RESOURCE_FLAGS flags, uint32_t cflags, + const char *name, uint32_t frame_index, bool disable_sub_alloc, bool name_objects) { auto &ctx = device.getContext(); @@ -112,7 +114,7 @@ BufferState resource_manager::BufferHeap::discardBuffer(DXGIAdapter *adapter, De return result; } -BufferState resource_manager::BufferHeap::allocateBuffer(DXGIAdapter *adapter, Device &device, uint64_t size, uint32_t structure_size, +BufferState BufferHeap::allocateBuffer(DXGIAdapter *adapter, Device &device, uint64_t size, uint32_t structure_size, uint32_t discard_count, DeviceMemoryClass memory_class, D3D12_RESOURCE_FLAGS flags, uint32_t cflags, const char *name, bool disable_sub_alloc, bool name_objects) { @@ -139,14 +141,13 @@ BufferState resource_manager::BufferHeap::allocateBuffer(DXGIAdapter *adapter, D return result; } -BufferState resource_manager::BufferHeap::allocateBufferWithoutDefragmentation(DXGIAdapter *adapter, ID3D12Device *device, - uint64_t size, uint32_t structure_size, uint32_t discard_count, DeviceMemoryClass memory_class, D3D12_RESOURCE_FLAGS flags, - uint32_t cflags, const char *name, bool disable_sub_alloc, bool name_objects, const ResourceHeapProperties &heap_properties, +BufferState BufferHeap::allocateBufferWithoutDefragmentation(DXGIAdapter *adapter, ID3D12Device *device, uint64_t size, + uint32_t structure_size, uint32_t discard_count, DeviceMemoryClass memory_class, D3D12_RESOURCE_FLAGS flags, uint32_t cflags, + const char *name, bool disable_sub_alloc, bool name_objects, const ResourceHeapProperties &heap_properties, AllocationFlags allocation_flags, HRESULT &error_code) { const bool canUseSubAlloc = !disable_sub_alloc && can_use_sub_alloc(cflags); - Heap *selectedHeap = nullptr; ValueRange allocationRange; size_t memoryAllocatedSize = 0; @@ -332,3 +333,4 @@ BufferState resource_manager::BufferHeap::allocateBufferWithoutDefragmentation(D return result; } +} // namespace drv3d_dx12::resource_manager \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.h index 2321535d0..186171654 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/buffer_components.h @@ -1,20 +1,17 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include +#include +#include +#include +#include "host_shared_components.h" + #include #include -#include "device_memory_class.h" -#include "pipeline.h" -#include "container_mutex_wrapper.h" -#include "bindless.h" - -#include "resource_manager/host_shared_components.h" - -namespace drv3d_dx12 -{ -namespace resource_manager +namespace drv3d_dx12::resource_manager { class BufferHeap : public PersistentBidirectionalMemoryProvider { @@ -716,5 +713,4 @@ class BufferHeap : public PersistentBidirectionalMemoryProvider return {}; } }; -} // namespace resource_manager -} // namespace drv3d_dx12 \ No newline at end of file +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/descriptor_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/descriptor_components.h index 9c19df53e..377618143 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/descriptor_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/descriptor_components.h @@ -1,18 +1,16 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include "descriptor_heap.h" -#include "pipeline.h" -#include "format_store.h" +#include "object_components.h" +#include +#include +#include -#include "resource_manager/object_components.h" +#include -namespace drv3d_dx12 +namespace drv3d_dx12::resource_manager { -namespace resource_manager -{ - // Allocs and frees do not take a lock as for textures, view create and free is always already guarded // by the context lock. class TextureDescriptorProvider : public ImageObjectProvider @@ -129,10 +127,10 @@ class BufferDescriptorProvider : public TextureDescriptorProvider { auto descriptors = eastl::make_unique(count); auto srvHeapAccess = srvHeap.access(); - for (uint32_t i = 0; i < count; ++i) + for (auto &descriptor : eastl::span{descriptors.get(), count}) { - descriptors[i] = srvHeapAccess->allocate(device); - device->CreateShaderResourceView(buffer, &desc, descriptors[i]); + descriptor = srvHeapAccess->allocate(device); + device->CreateShaderResourceView(buffer, &desc, descriptor); desc.Buffer.FirstElement += desc.Buffer.NumElements; } return descriptors; @@ -143,10 +141,10 @@ class BufferDescriptorProvider : public TextureDescriptorProvider { auto descriptors = eastl::make_unique(count); auto srvHeapAccess = srvHeap.access(); - for (uint32_t i = 0; i < count; ++i) + for (auto &descriptor : eastl::span{descriptors.get(), count}) { - descriptors[i] = srvHeapAccess->allocate(device); - device->CreateUnorderedAccessView(buffer, nullptr, &desc, descriptors[i]); + descriptor = srvHeapAccess->allocate(device); + device->CreateUnorderedAccessView(buffer, nullptr, &desc, descriptor); desc.Buffer.FirstElement += desc.Buffer.NumElements; } return descriptors; @@ -183,7 +181,6 @@ class BufferDescriptorProvider : public TextureDescriptorProvider { G_ASSERTF(0 == (buffer.offset % struct_size), "DX12: Offset %u has to be multiples of element size %u", buffer.offset, struct_size); - auto srvs = eastl::make_unique(buffer.discardCount); D3D12_SHADER_RESOURCE_VIEW_DESC desc; desc.Format = DXGI_FORMAT_UNKNOWN; desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; @@ -204,7 +201,6 @@ class BufferDescriptorProvider : public TextureDescriptorProvider G_ASSERTF(0 == (buffer.size % 16), "DX12: Buffer size %u has to be multiples of 16", buffer.size); } G_ASSERTF(0 == (buffer.offset % 16), "DX12: Offset %u has to be multiples of 16", buffer.offset); - auto srvs = eastl::make_unique(buffer.discardCount); D3D12_SHADER_RESOURCE_VIEW_DESC desc; desc.Format = DXGI_FORMAT_R32_TYPELESS; desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; @@ -275,6 +271,4 @@ class BufferDescriptorProvider : public TextureDescriptorProvider buffer.uavs = createBufferUAVs(device, buffer.buffer, buffer.discardCount, desc); } }; - -} // namespace resource_manager -} // namespace drv3d_dx12 +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/esram_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/esram_components.h index 72c8e4854..11cb153e5 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/esram_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/esram_components.h @@ -1,13 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include "driver.h" - -#include "resource_manager/heap_components.h" - +#include +#include "heap_components.h" #if DX12_USE_ESRAM -#include "resource_manager/esram_components_xbox.h" +#include "esram_components_xbox.h" #else namespace drv3d_dx12::resource_manager { diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.cpp b/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.cpp index 23f2633b6..6bc773592 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.cpp @@ -1,8 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "heap_components.h" +#include #include + using namespace drv3d_dx12; using namespace drv3d_dx12::resource_manager; diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.h index ad1f638a8..ed90bd4ff 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/heap_components.h @@ -1,23 +1,21 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "descriptor_components.h" +#include +#include +#include +#include +#include + +#include +#include #include +#include #include #include -#include -#include - -#include - -#include "driver.h" -#include "typed_bit_set.h" -#include "pipeline.h" -#include "resource_memory.h" -#include "device_memory_class.h" -#include "value_range.h" -#include "free_list_utils.h" - -#include "resource_manager/descriptor_components.h" +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.cpp b/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.cpp index 4221fb63c..adae7bdee 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.cpp @@ -1,10 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "host_shared_components.h" -#include "device.h" +#include -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::FramePushRingMemoryProvider::allocatePushMemory( - DXGIAdapter *adapter, Device &device, uint32_t size, uint32_t alignment) + +namespace drv3d_dx12::resource_manager +{ +HostDeviceSharedMemoryRegion FramePushRingMemoryProvider::allocatePushMemory(DXGIAdapter *adapter, Device &device, uint32_t size, + uint32_t alignment) { auto result = pushRing.access()->allocate(this, adapter, device.getDevice(), size, alignment); // Here is a dangerous place for emergency defragmentation. We have a lot of push memory allocations from drv internal code (like @@ -18,8 +21,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::FramePush return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::UploadRingMemoryProvider::allocateUploadRingMemory( - DXGIAdapter *adapter, Device &device, uint32_t size, uint32_t alignment) +HostDeviceSharedMemoryRegion UploadRingMemoryProvider::allocateUploadRingMemory(DXGIAdapter *adapter, Device &device, uint32_t size, + uint32_t alignment) { auto result = uploadRing.access()->allocate(this, adapter, device.getDevice(), size, alignment); if (!result) @@ -35,8 +38,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::UploadRin return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::TemporaryUploadMemoryProvider::allocateTempUpload( - DXGIAdapter *adapter, Device &device, size_t size, size_t alignment, bool &should_flush) +HostDeviceSharedMemoryRegion TemporaryUploadMemoryProvider::allocateTempUpload(DXGIAdapter *adapter, Device &device, size_t size, + size_t alignment, bool &should_flush) { should_flush = false; HRESULT errorCode = S_OK; @@ -56,8 +59,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Temporary return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::TemporaryUploadMemoryProvider:: - tryAllocateTempUploadForUploadBuffer(DXGIAdapter *adapter, ID3D12Device *device, size_t size, size_t alignment, HRESULT errorCode) +HostDeviceSharedMemoryRegion TemporaryUploadMemoryProvider::tryAllocateTempUploadForUploadBuffer(DXGIAdapter *adapter, + ID3D12Device *device, size_t size, size_t alignment, HRESULT errorCode) { HostDeviceSharedMemoryRegion result; auto tempBufferAccess = tempBuffer.access(); @@ -82,8 +85,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Temporary return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::TemporaryUploadMemoryProvider:: - allocateTempUploadForUploadBuffer(DXGIAdapter *adapter, Device &device, size_t size, size_t alignment) +HostDeviceSharedMemoryRegion TemporaryUploadMemoryProvider::allocateTempUploadForUploadBuffer(DXGIAdapter *adapter, Device &device, + size_t size, size_t alignment) { HRESULT errorCode = S_OK; const auto properties = getProperties(D3D12_RESOURCE_FLAG_NONE, TemporaryUploadMemoryImeplementation::memory_class, @@ -104,8 +107,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Temporary return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::PersistentUploadMemoryProvider::allocatePersistentUploadMemory( - DXGIAdapter *adapter, Device &device, size_t size, size_t alignment) +HostDeviceSharedMemoryRegion PersistentUploadMemoryProvider::allocatePersistentUploadMemory(DXGIAdapter *adapter, Device &device, + size_t size, size_t alignment) { auto result = uploadMemory.access()->allocate(this, adapter, device.getDevice(), size, alignment); const auto properties = getProperties(D3D12_RESOURCE_FLAG_NONE, PersistentUploadMemoryImplementation::memory_class, @@ -123,8 +126,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Persisten return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::PersistentReadBackMemoryProvider::allocatePersistentReadBack( - DXGIAdapter *adapter, Device &device, size_t size, size_t alignment) +HostDeviceSharedMemoryRegion PersistentReadBackMemoryProvider::allocatePersistentReadBack(DXGIAdapter *adapter, Device &device, + size_t size, size_t alignment) { auto result = readBackMemory.access()->allocate(this, adapter, device.getDevice(), size, alignment); const auto properties = getProperties(D3D12_RESOURCE_FLAG_NONE, PersistentReadBackMemoryImplementation::memory_class, @@ -142,8 +145,8 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Persisten return result; } -drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::PersistentBidirectionalMemoryProvider:: - allocatePersistentBidirectional(DXGIAdapter *adapter, Device &device, size_t size, size_t alignment) +HostDeviceSharedMemoryRegion PersistentBidirectionalMemoryProvider::allocatePersistentBidirectional(DXGIAdapter *adapter, + Device &device, size_t size, size_t alignment) { auto result = bidirectionalMemory.access()->allocate(this, adapter, device.getDevice(), size, alignment); const auto properties = getProperties(D3D12_RESOURCE_FLAG_NONE, PersistentBidirectionalMemoryImplementation::memory_class, @@ -160,3 +163,4 @@ drv3d_dx12::HostDeviceSharedMemoryRegion drv3d_dx12::resource_manager::Persisten } return result; } +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.h index 2c5b2af4f..65ead0852 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/host_shared_components.h @@ -1,23 +1,20 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include - -#include "driver.h" -#include "constants.h" -#include "resource_memory.h" -#include "host_device_shared_memory_region.h" -#include "d3d12_error_handling.h" -#include "container_mutex_wrapper.h" +#include "basic_buffer.h" +#include "esram_components.h" +#include +#include +#include +#include +#include +#include -#include "resource_manager/basic_buffer.h" -#include "resource_manager/esram_components.h" +#include +#include -namespace drv3d_dx12 -{ -namespace resource_manager +namespace drv3d_dx12::resource_manager { class RingMemoryBase : public ESRamPageMappingProvider { @@ -1449,5 +1446,4 @@ class PersistentBidirectionalMemoryProvider : public PersistentReadBackMemoryPro } } }; -} // namespace resource_manager -} // namespace drv3d_dx12 +} // namespace drv3d_dx12::resource_manager diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/image.h b/prog/engine/drv/drv3d_DX12/resource_manager/image.h index b0f9fcf1e..006d36eeb 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/image.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/image.h @@ -1,32 +1,31 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include +#include +#include +#include +#include +#include +#include +#include + #include -#include #include - -#include "driver.h" -#include "constants.h" -#include "extents.h" -#include "image_view_state.h" -#include "resource_memory.h" -#include "container_mutex_wrapper.h" -#include "image_global_subresource_id.h" -#include "texture_subresource_util.h" +#include #if DX12_USE_ESRAM -#include "resource_manager/esram_resource_xbox.h" +#include "esram_resource_xbox.h" #endif #if _TARGET_XBOX -#include "resource_manager/texture_access_computer_xbox.h" +#include "texture_access_computer_xbox.h" #endif +#define DX12_IMAGE_DEBUG_NAMES 1 namespace drv3d_dx12 { - -#define DX12_IMAGE_DEBUG_NAMES 1 class Image { public: @@ -61,6 +60,15 @@ class Image uint64_t lastFrameAccess = 0; public: + void dbgValidateImageViewStateCompatibility([[maybe_unused]] ImageViewState image_view_state) + { + G_ASSERTF(image_view_state.getMipBase() + image_view_state.getMipCount() <= mipLevels, + "DX12: Image view validation failed, wrong mip range (tex: %s, view.mipBase: %d, view.mipCount: %d, img.mipCount: %d)", + *debugName.access(), image_view_state.getMipBase(), image_view_state.getMipCount(), mipLevels.count()); + G_ASSERTF(image_view_state.getArrayBase() + image_view_state.getArrayCount() <= layerCount, + "DX12: Image view validation failed, wrong layers range (tex: %s, view.mipBase: %d, view.mipCount: %d, img.mipCount: %d)", + *debugName.access(), image_view_state.getMipBase(), image_view_state.getMipCount(), mipLevels.count()); + } void updateLastFrameAccess(uint64_t index) { lastFrameAccess = index; } bool wasAccessedPreviousFrames(uint64_t index) const { diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/object_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/object_components.h index bc675083b..8c26c2a1a 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/object_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/object_components.h @@ -1,23 +1,22 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "basic_components.h" +#include "image.h" +#include +#include +#include +#include +#include +#include +#include +#include + #include -#include -#include -#include #include - -#include "texture.h" -#include "extents.h" -#include "format_store.h" -#include "device_memory_class.h" -#include "image_view_state.h" -#include "buffer.h" -#include "resource_memory.h" -#include "texture_subresource_util.h" - -#include "resource_manager/basic_components.h" -#include "resource_manager/image.h" +#include +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/raytrace_acceleration_structure.h b/prog/engine/drv/drv3d_DX12/resource_manager/raytrace_acceleration_structure.h index b1a6c294b..6c1840ec0 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/raytrace_acceleration_structure.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/raytrace_acceleration_structure.h @@ -3,16 +3,12 @@ #include -#include "driver.h" -#include "resource_memory.h" - -#include "resource_manager/basic_buffer.h" +#if D3D_HAS_RAY_TRACING +#include namespace drv3d_dx12 { - -#if D3D_HAS_RAY_TRACING struct RaytraceAccelerationStructure { // Warning: ASes are suballocated, this resource may also contain other ASes! @@ -28,6 +24,7 @@ struct RaytraceAccelerationStructure uint16_t slotInAsHeap = {}; uint16_t asHeapIdx = {}; }; -#endif } // namespace drv3d_dx12 + +#endif diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.cpp b/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.cpp index 2be8c395b..ddab42257 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.cpp @@ -1,10 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "rtx_components.h" #ifdef D3D_HAS_RAY_TRACING -using namespace drv3d_dx12::resource_manager; +#include "device.h" + + +namespace drv3d_dx12::resource_manager +{ RaytraceAccelerationStructureHeap RaytraceAccelerationStructureObjectProvider::allocAccelStructHeap(DXGIAdapter *adapter, Device &device, uint32_t size) @@ -206,5 +210,5 @@ drv3d_dx12::RaytraceAccelerationStructure *drv3d_dx12::resource_manager::Raytrac } return result; } - +} // namespace drv3d_dx12::resource_manager #endif \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.h b/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.h index 44d24ee08..6fba16a41 100644 --- a/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.h +++ b/prog/engine/drv/drv3d_DX12/resource_manager/rtx_components.h @@ -1,28 +1,25 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include #include -#include -#include +#include "buffer_components.h" -#include "driver.h" -#include "container_mutex_wrapper.h" +#if D3D_HAS_RAY_TRACING -#include "resource_manager/raytrace_acceleration_structure.h" -#include "resource_manager/buffer_components.h" +#include "buffer_components.h" +#include "raytrace_acceleration_structure.h" +#include +#include +#include +#include +#include +#include +#include -namespace drv3d_dx12 -{ -namespace resource_manager +namespace drv3d_dx12::resource_manager { - -#if D3D_HAS_RAY_TRACING - static constexpr uint32_t RAYTRACE_HEAP_ALIGNMENT = 65536; static constexpr uint32_t RAYTRACE_AS_ALIGNMENT = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT; static_assert(0 == (RAYTRACE_AS_ALIGNMENT & (RAYTRACE_AS_ALIGNMENT - 1)), "AS_ALIGNMENT must be power of 2"); @@ -127,9 +124,10 @@ class RaytraceAccelerationStructureObjectProvider : public BufferHeap [=](auto &data) { data.deletedBottomAccelerationStructure.push_back(ras); }); } }; +} // namespace drv3d_dx12::resource_manager #else +namespace drv3d_dx12::resource_manager +{ using RaytraceAccelerationStructureObjectProvider = BufferHeap; -#endif - -} // namespace resource_manager -} // namespace drv3d_dx12 +} // namespace drv3d_dx12::resource_manager +#endif \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/resource_memory.h b/prog/engine/drv/drv3d_DX12/resource_memory.h index f86eeb9f1..b1b2ea54b 100644 --- a/prog/engine/drv/drv3d_DX12/resource_memory.h +++ b/prog/engine/drv/drv3d_DX12/resource_memory.h @@ -1,10 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "driver.h" -#include "value_range.h" + +#include +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/resource_memory_heap.cpp b/prog/engine/drv/drv3d_DX12/resource_memory_heap.cpp index b0d27543d..003fcafa8 100644 --- a/prog/engine/drv/drv3d_DX12/resource_memory_heap.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_memory_heap.cpp @@ -1,13 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" - -#include - +#include "resource_memory_heap.h" #include "frontend_state.h" +#include #include <3d/dag_resourceDump.h> + using namespace drv3d_dx12; using namespace drv3d_dx12::resource_manager; diff --git a/prog/engine/drv/drv3d_DX12/resource_memory_heap.h b/prog/engine/drv/drv3d_DX12/resource_memory_heap.h index 97753419c..2a06f02f6 100644 --- a/prog/engine/drv/drv3d_DX12/resource_memory_heap.h +++ b/prog/engine/drv/drv3d_DX12/resource_memory_heap.h @@ -2,9 +2,8 @@ #pragma once #include - -#include "value_range.h" -#include "free_list_utils.h" +#include +#include #if _TARGET_XBOX #define REPORT_HEAP_INFO 1 @@ -24,6 +23,7 @@ #include "resource_manager/buffer_components.h" #include "resource_manager/rtx_components.h" + struct ResourceDumpInfo; namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/resource_state_tracker.h b/prog/engine/drv/drv3d_DX12/resource_state_tracker.h index 2275d1829..74d0cd5d4 100644 --- a/prog/engine/drv/drv3d_DX12/resource_state_tracker.h +++ b/prog/engine/drv/drv3d_DX12/resource_state_tracker.h @@ -1,23 +1,23 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include -#include -#include -#include -#include -#include - -#include "driver.h" #include "constants.h" -#include "typed_bit_set.h" #include "d3d12_utils.h" +#include "driver.h" #include "format_store.h" +#include "image_global_subresource_id.h" #include "pipeline.h" +#include "resource_manager/image.h" #include "stateful_command_buffer.h" -#include "image_global_subresource_id.h" +#include "typed_bit_set.h" -#include "resource_manager/image.h" +#include +#include +#include +#include +#include +#include +#include namespace dag diff --git a/prog/engine/drv/drv3d_DX12/resource_update_buffer.cpp b/prog/engine/drv/drv3d_DX12/resource_update_buffer.cpp index b7bc572d9..91b1232bd 100644 --- a/prog/engine/drv/drv3d_DX12/resource_update_buffer.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_update_buffer.cpp @@ -1,12 +1,13 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include -#include - #include "device.h" #include "driver.h" #include "texture.h" +#include +#include + + using namespace drv3d_dx12; struct ResUpdateBufferImp diff --git a/prog/engine/drv/drv3d_DX12/resource_usage_debugger.cpp b/prog/engine/drv/drv3d_DX12/resource_usage_debugger.cpp index 8effeefe8..14d302376 100644 --- a/prog/engine/drv/drv3d_DX12/resource_usage_debugger.cpp +++ b/prog/engine/drv/drv3d_DX12/resource_usage_debugger.cpp @@ -2,16 +2,14 @@ #include "device.h" -using namespace drv3d_dx12; - -#if DAGOR_DBGLEVEL > 0 - #include -// #include #include +// #include // #include // #include +using namespace drv3d_dx12; + namespace { bool begin_sub_section(const char *id, const char *caption, int height) @@ -982,5 +980,3 @@ void ResourceUsageHistoryDataSetDebugger::debugOverlay() } } #endif - -#endif diff --git a/prog/engine/drv/drv3d_DX12/ring_pipes.h b/prog/engine/drv/drv3d_DX12/ring_pipes.h new file mode 100644 index 000000000..43a0c79b0 --- /dev/null +++ b/prog/engine/drv/drv3d_DX12/ring_pipes.h @@ -0,0 +1,263 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "constants.h" +#include +#include +#include + +#if !defined(_M_ARM64) +#include +#endif + + +constexpr uint32_t default_event_wait_time = 1; + +// runs until check returns true, after some busy loop tries it starts to check the event state +template +inline void try_and_wait_with_os_event(os_event_t &event, uint32_t spin_count, T check, uint32_t idle_time = default_event_wait_time) +{ + for (uint32_t i = 0; i < spin_count; ++i) + { + if (check()) + return; +#if !defined(_M_ARM64) + _mm_pause(); +#endif + } + for (;;) + { + if (check()) + return; + os_event_wait(&event, idle_time); + } +} + +template +class ForwardRing +{ + T elements[N]{}; + T *selectedElement = &elements[0]; + + ptrdiff_t getIndex(const T *pos) const { return pos - &elements[0]; } + + T *advancePosition(T *pos) { return &elements[(getIndex(pos) + 1) % N]; } + +public: + T &get() { return *selectedElement; } + const T &get() const { return *selectedElement; } + T &operator*() { return *selectedElement; } + const T &operator*() const { return *selectedElement; } + T *operator->() { return selectedElement; } + const T *operator->() const { return selectedElement; } + + constexpr size_t size() const { return N; } + + void advance() { selectedElement = advancePosition(selectedElement); } + + // Iterates all elements of the ring in a unspecified order + template + void iterate(T clb) + { + for (auto &&v : elements) + { + clb(v); + } + } + + // Iterates all elements from last to the current element + template + void walkAll(T clb) + { + auto at = advancePosition(selectedElement); + for (size_t i = 0; i < N; ++i) + { + clb(*at); + at = advancePosition(at); + } + } + + // Iterates all elements from last to the element before the current element + template + void walkUnitlCurrent(T clb) + { + auto at = advancePosition(selectedElement); + for (size_t i = 0; i < N - 1; ++i) + { + clb(at); + at = advancePosition(at); + } + } +}; + +// Ring buffer acting as a thread safe, non blocking, single producer, single consumer pipe +template +class ConcurrentRingPipe +{ + T pipe[N]{}; + alignas(64) std::atomic readPos{0}; + alignas(64) std::atomic writePos{0}; + +public: + T *tryAcquireRead() + { + auto rp = readPos.load(std::memory_order_relaxed); + if (rp < writePos.load(std::memory_order_acquire)) + { + return &pipe[rp % N]; + } + return nullptr; + } + void releaseRead() { ++readPos; } + T *tryAcquireWrite() + { + auto wp = writePos.load(std::memory_order_relaxed); + if (wp - readPos.load(std::memory_order_acquire) < N) + return &pipe[wp % N]; + return nullptr; + } + void releaseWrite() { ++writePos; } + bool canAcquireWrite() const { return (writePos.load(std::memory_order_relaxed) - readPos.load(std::memory_order_acquire)) < N; } +}; + +// Specialization with only one entry, this is used for builds that only support +// concurrent execution mode and don't need more than one pipe element. +// No call will block, return null or fail. +template +class ConcurrentRingPipe +{ + T pipe{}; + +public: + T *tryAcquireRead() { return &pipe; } + void releaseRead() {} + T *tryAcquireWrite() { return &pipe; } + void releaseWrite() {} + constexpr bool canAcquireWrite() const { return true; } +}; + +// Extended ConcurrentRingPipe that implements blocking read/write +template +class WaitableConcurrentRingPipe : private ConcurrentRingPipe +{ + using BaseType = ConcurrentRingPipe; + + os_event_t itemsToRead; + os_event_t itemsToWrite; + +public: + WaitableConcurrentRingPipe() + { + os_event_create(&itemsToRead, "WCRP:itemsToRead"); + os_event_create(&itemsToWrite, "WCRP:itemsToWrite"); + } + ~WaitableConcurrentRingPipe() + { + os_event_destroy(&itemsToRead); + os_event_destroy(&itemsToWrite); + } + using BaseType::tryAcquireRead; + void releaseRead() + { + BaseType::releaseRead(); + os_event_set(&itemsToWrite); + } + using BaseType::tryAcquireWrite; + void releaseWrite() + { + BaseType::releaseWrite(); + os_event_set(&itemsToRead); + } + T &acquireRead() + { + T *result = nullptr; + try_and_wait_with_os_event(itemsToRead, drv3d_dx12::DEFAULT_WAIT_SPINS, + [this, &result]() // + { + result = tryAcquireRead(); + return result != nullptr; + }); + return *result; + } + // repeatedly call clb until it either returns false or a T could be acquired + // return value of acquireRead can be nullptr if clb returned false + template + T *acquireRead(U &&clb) + { + T *result = nullptr; + try_and_wait_with_os_event(itemsToRead, drv3d_dx12::DEFAULT_WAIT_SPINS, + [this, &result, &clb]() // + { + if (!clb()) + return true; + result = tryAcquireRead(); + return result != nullptr; + }); + return result; + } + T &acquireWrite() + { + T *result = nullptr; + try_and_wait_with_os_event(itemsToWrite, drv3d_dx12::DEFAULT_WAIT_SPINS, + [this, &result]() // + { + result = tryAcquireWrite(); + return result != nullptr; + }); + return *result; + } + // repeatedly call clb until it either returns false or a T could be acquired + // return value of acquireRead can be nullptr if clb returned false + template + T *acquireWrite(U &&clb) + { + T *result = nullptr; + try_and_wait_with_os_event(itemsToWrite, drv3d_dx12::DEFAULT_WAIT_SPINS, + [this, &result, &clb]() // + { + if (!clb()) + return true; + result = tryAcquireWrite(); + return result != nullptr; + }); + return result; + } + using BaseType::canAcquireWrite; + void waitForWriteItem() + { + try_and_wait_with_os_event(itemsToWrite, drv3d_dx12::DEFAULT_WAIT_SPINS, [this]() { return this->canAcquireWrite(); }); + } +}; + +// Specialization with only one entry, this is used for builds that only support +// concurrent execution mode and don't need more than one pipe element. +// No call will block, return null or fail. +template +class WaitableConcurrentRingPipe : private ConcurrentRingPipe +{ + using BaseType = ConcurrentRingPipe; + +public: + using BaseType::releaseRead; + using BaseType::releaseWrite; + using BaseType::tryAcquireRead; + using BaseType::tryAcquireWrite; + T &acquireRead() { return *tryAcquireRead(); } // -V522 + // repeatedly call clb until it either returns false or a T could be acquired + // return value of acquireRead can be nullptr if clb returned false + template + T *acquireRead(U &&) + { + return acquireRead(); + } + T &acquireWrite() { return *tryAcquireWrite(); } // -V522 + // repeatedly call clb until it either returns false or a T could be acquired + // return value of acquireRead can be nullptr if clb returned false + template + T *acquireWrite(U &&) + { + return acquireWrite(); + } + void waitForWriteItem() {} + using BaseType::canAcquireWrite; +}; diff --git a/prog/engine/drv/drv3d_DX12/sampler_state.h b/prog/engine/drv/drv3d_DX12/sampler_state.h index 219588bc5..5f5cf13a8 100644 --- a/prog/engine/drv/drv3d_DX12/sampler_state.h +++ b/prog/engine/drv/drv3d_DX12/sampler_state.h @@ -1,11 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include - #include "bitfield.h" -#include "half_float.h" #include "d3d12_d3d_translation.h" +#include "half_float.h" + +#include namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/shader.cpp b/prog/engine/drv/drv3d_DX12/shader.cpp index f6649f1a5..57ff1805f 100644 --- a/prog/engine/drv/drv3d_DX12/shader.cpp +++ b/prog/engine/drv/drv3d_DX12/shader.cpp @@ -1,7 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "shader.h" +#include "d3d12_error_handling.h" +#include "device_context.h" +#include "pipeline/blk_cache.h" + #include -#include "device.h" using namespace drv3d_dx12; diff --git a/prog/engine/drv/drv3d_DX12/shader.h b/prog/engine/drv/drv3d_DX12/shader.h index 53780999c..58d564539 100644 --- a/prog/engine/drv/drv3d_DX12/shader.h +++ b/prog/engine/drv/drv3d_DX12/shader.h @@ -1,30 +1,30 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "bitfield.h" +#include "byte_units.h" +#include "driver.h" +#include "dynamic_array.h" +#include "render_state.h" +#include "shader_program_id.h" +#include "tagged_handles.h" + +#include +#include +#include #include #include -#include #include +#include #include -#include -#include -#include #include -#include -#include -#include #include +#include +#include #include +#include #include -#include "driver.h" -#include "shader_program_id.h" -#include "tagged_handles.h" -#include "dynamic_array.h" -#include "byte_units.h" -#include "bitfield.h" -#include "render_state.h" - inline constexpr uint32_t MAX_VERTEX_ATTRIBUTES = 16; inline constexpr uint32_t MAX_VERTEX_INPUT_STREAMS = 4; diff --git a/prog/engine/drv/drv3d_DX12/shader_byte_code_id.h b/prog/engine/drv/drv3d_DX12/shader_byte_code_id.h index 3337ab60d..64ac15b2f 100644 --- a/prog/engine/drv/drv3d_DX12/shader_byte_code_id.h +++ b/prog/engine/drv/drv3d_DX12/shader_byte_code_id.h @@ -1,10 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -namespace drv3d_dx12 -{ +#include +namespace drv3d_dx12 +{ class ShaderByteCodeId { union diff --git a/prog/engine/drv/drv3d_DX12/shader_library.cpp b/prog/engine/drv/drv3d_DX12/shader_library.cpp index 7827c6cce..f4a34591b 100644 --- a/prog/engine/drv/drv3d_DX12/shader_library.cpp +++ b/prog/engine/drv/drv3d_DX12/shader_library.cpp @@ -1,8 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "device.h" +#include "shader_library.h" +#include "d3d12_error_handling.h" + +#include + -#if !_TARGET_XBOXONE namespace { template @@ -210,4 +213,3 @@ drv3d_dx12::ShaderLibrary *drv3d_dx12::ShaderLibrary::build(ID3D12Device5 *devic ShaderLibraryBuilder shaderLibraryBuilder{ci}; return shaderLibraryBuilder.build(device); } -#endif \ No newline at end of file diff --git a/prog/engine/drv/drv3d_DX12/shader_library.h b/prog/engine/drv/drv3d_DX12/shader_library.h index db9281828..6a737c8e4 100644 --- a/prog/engine/drv/drv3d_DX12/shader_library.h +++ b/prog/engine/drv/drv3d_DX12/shader_library.h @@ -1,7 +1,15 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" +#include "dynamic_array.h" + #include +#include +#include +#include +#include + #if !_TARGET_XBOXONE namespace drv3d_dx12 @@ -25,10 +33,10 @@ class ShaderLibrary ~ShaderLibrary() = default; ShaderLibrary(eastl::string &&lib_name, eastl::wstring &&lib_prefix, const dxil::LibraryResourceInformation &lib_res_info, dag::ConstSpan shader_properties, ComPtr &&obj, bool allow_expandable_use) : - libName{eastl::forward(lib_name)}, - libPrefix{eastl::forward(lib_prefix)}, + libName{eastl::move(lib_name)}, + libPrefix{eastl::move(lib_prefix)}, libraryResourceInfo{lib_res_info}, - object{eastl::forward>(obj)}, + object{eastl::move(obj)}, allowExpandableUse{allow_expandable_use} { shaderProperties.resize(shader_properties.size()); diff --git a/prog/engine/drv/drv3d_DX12/shader_program_id.h b/prog/engine/drv/drv3d_DX12/shader_program_id.h index 2f3fe9f79..472ce5d81 100644 --- a/prog/engine/drv/drv3d_DX12/shader_program_id.h +++ b/prog/engine/drv/drv3d_DX12/shader_program_id.h @@ -1,9 +1,11 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include + + namespace drv3d_dx12 { - class ShaderID { union diff --git a/prog/engine/drv/drv3d_DX12/stateful_command_buffer.h b/prog/engine/drv/drv3d_DX12/stateful_command_buffer.h index 498bc03b5..2beba77f3 100644 --- a/prog/engine/drv/drv3d_DX12/stateful_command_buffer.h +++ b/prog/engine/drv/drv3d_DX12/stateful_command_buffer.h @@ -1,14 +1,14 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include "driver.h" -#include "validation.h" +#include "command_list.h" #include "constants.h" #include "d3d12_utils.h" -#include "versioned_com_ptr.h" -#include "render_state.h" +#include "driver.h" #include "pipeline_cache.h" -#include "command_list.h" +#include "render_state.h" +#include "validation.h" +#include "versioned_com_ptr.h" namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/swapchain.cpp b/prog/engine/drv/drv3d_DX12/swapchain.cpp index 4168a2acb..14c47d10a 100644 --- a/prog/engine/drv/drv3d_DX12/swapchain.cpp +++ b/prog/engine/drv/drv3d_DX12/swapchain.cpp @@ -1,6 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "swapchain.h" #include "device.h" +#include "device_context.h" +#include "resource_manager/image.h" +#include "texture.h" #include <3d/dag_lowLatency.h> diff --git a/prog/engine/drv/drv3d_DX12/swapchain.h b/prog/engine/drv/drv3d_DX12/swapchain.h index b14407c93..0c79f5d6b 100644 --- a/prog/engine/drv/drv3d_DX12/swapchain.h +++ b/prog/engine/drv/drv3d_DX12/swapchain.h @@ -1,17 +1,17 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include +#include "descriptor_heap.h" +#include "extents.h" +#include "image_view_state.h" + +#include #include +#include #include #include -#include #include -#include "extents.h" -#include "image_view_state.h" -#include "descriptor_heap.h" - namespace drv3d_dx12 { @@ -33,6 +33,7 @@ struct SwapchainProperties bool enableHdr = false; WIN_MEMBER bool forceHdr = false; XBOX_MEMBER bool autoGameDvr = true; + XBOX_MEMBER bool preferHfr = false; }; struct SwapchainCreateInfo : SwapchainProperties @@ -142,9 +143,12 @@ class Swapchain XBOX_MEMBER uint32_t userFreqLevel = 1; // index of 60Hz in freqLevels from swapchain.cpp XBOX_MEMBER uint32_t systemFreqLevel = 1; XBOX_MEMBER uint32_t activeFreqLevel = 1; + XBOX_MEMBER bool isVrrSupportedValue = false; bool isHdrEnabled = false; XBOX_MEMBER bool autoGameDvr = true; + XBOX_MEMBER bool hfrSupported = false; + XBOX_MEMBER bool hfrEnabled = false; WIN_MEMBER bool isInExclusiveFullscreenModeEnabled = false; WIN_MEMBER bool isTearingSupported = false; @@ -198,7 +202,14 @@ class Swapchain PresentationMode getPresentationMode() const { return presentMode; } void changePresentMode(PresentationMode mode) { presentMode = mode; } - WIN_FUNC bool isVrrSupported() const { return isTearingSupported && !isInExclusiveFullscreenModeEnabled; } + XBOX_FUNC bool isHfrEnabled() const { return hfrEnabled; } + XBOX_FUNC bool isHfrSupported() const { return hfrSupported; } + +#if _TARGET_XBOX + bool isVrrSupported() const { return isVrrSupportedValue; } +#else + bool isVrrSupported() const { return isTearingSupported && !isInExclusiveFullscreenModeEnabled; } +#endif }; } // namespace backend } // namespace drv3d_dx12 diff --git a/prog/engine/drv/drv3d_DX12/tagged_handle.h b/prog/engine/drv/drv3d_DX12/tagged_handle.h index 1cb1a5415..fe03a8007 100644 --- a/prog/engine/drv/drv3d_DX12/tagged_handle.h +++ b/prog/engine/drv/drv3d_DX12/tagged_handle.h @@ -1,6 +1,10 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include +#include + + template class TaggedHandle { diff --git a/prog/engine/drv/drv3d_DX12/tagged_handles.h b/prog/engine/drv/drv3d_DX12/tagged_handles.h index 0208c7ef7..5f2833413 100644 --- a/prog/engine/drv/drv3d_DX12/tagged_handles.h +++ b/prog/engine/drv/drv3d_DX12/tagged_handles.h @@ -3,6 +3,7 @@ #include "tagged_handle.h" + namespace drv3d_dx12 { diff --git a/prog/engine/drv/drv3d_DX12/texture.cpp b/prog/engine/drv/drv3d_DX12/texture.cpp index 178538e02..3781248fd 100644 --- a/prog/engine/drv/drv3d_DX12/texture.cpp +++ b/prog/engine/drv/drv3d_DX12/texture.cpp @@ -1,18 +1,21 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. +#include "texture.h" +#include "d3dformat.h" #include "device.h" +#include "device_context.h" +#include "driver.h" #include "frontend_state.h" -#include "d3dformat.h" - -#include -#include -#include -#include #include +#include +#include +#include +#include #include #include + #if 0 #define VERBOSE_DEBUG debug #else @@ -1012,6 +1015,7 @@ bool BaseTex::swapTextureNoLock(Image *expected, Image *replacement) mark_texture_stages_dirty_no_lock(this, srvBindingStages, uavBindingStages, getRtvBinding(), getDsvBinding()); image = replacement; + updateTexName(); return true; } diff --git a/prog/engine/drv/drv3d_DX12/texture.h b/prog/engine/drv/drv3d_DX12/texture.h index d194df00d..007450c67 100644 --- a/prog/engine/drv/drv3d_DX12/texture.h +++ b/prog/engine/drv/drv3d_DX12/texture.h @@ -1,19 +1,19 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -#include <3d/tql.h> -#include -#include -#include -#include - #include "device_memory_class.h" -#include "host_device_shared_memory_region.h" -#include "format_store.h" #include "extents.h" +#include "format_store.h" +#include "host_device_shared_memory_region.h" #include "image_view_state.h" #include "sampler_state.h" +#include <3d/tql.h> +#include +#include +#include +#include + namespace drv3d_dx12 { class BaseTex; diff --git a/prog/engine/drv/drv3d_DX12/util.h b/prog/engine/drv/drv3d_DX12/util.h index 79f47ac89..dfaf228a4 100644 --- a/prog/engine/drv/drv3d_DX12/util.h +++ b/prog/engine/drv/drv3d_DX12/util.h @@ -3,8 +3,8 @@ #include #include - #include +#include template diff --git a/prog/engine/drv/drv3d_DX12/variant_vector.h b/prog/engine/drv/drv3d_DX12/variant_vector.h index 8c5d4f299..22c56cb83 100644 --- a/prog/engine/drv/drv3d_DX12/variant_vector.h +++ b/prog/engine/drv/drv3d_DX12/variant_vector.h @@ -1,17 +1,17 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include "driver.h" + +#include +#include #include #include #include #include #include -#include -#include #include -#include - -#include "driver.h" +#include template diff --git a/prog/engine/drv/drv3d_DX12/versioned_com_ptr.h b/prog/engine/drv/drv3d_DX12/versioned_com_ptr.h index 96c8c24cd..f26a4f399 100644 --- a/prog/engine/drv/drv3d_DX12/versioned_com_ptr.h +++ b/prog/engine/drv/drv3d_DX12/versioned_com_ptr.h @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once +#include #include template diff --git a/prog/engine/drv/drv3d_DX12/xess_wrapper.cpp b/prog/engine/drv/drv3d_DX12/xess_wrapper.cpp index 5b6e32672..fa90a7d71 100644 --- a/prog/engine/drv/drv3d_DX12/xess_wrapper.cpp +++ b/prog/engine/drv/drv3d_DX12/xess_wrapper.cpp @@ -11,6 +11,7 @@ #include + using namespace drv3d_dx12; static const char *get_xess_result_as_string(xess_result_t result) @@ -36,6 +37,45 @@ static const char *get_xess_result_as_string(xess_result_t result) } } +static XessWrapper::ErrorKind toErrorKind(xess_result_t result) +{ + switch (result) + { + case XESS_RESULT_SUCCESS: return XessWrapper::ErrorKind::Unknown; // not an error + case XESS_RESULT_ERROR_UNSUPPORTED_DEVICE: return XessWrapper::ErrorKind::UnsupportedDevice; + case XESS_RESULT_ERROR_UNSUPPORTED_DRIVER: return XessWrapper::ErrorKind::UnsupportedDriver; + case XESS_RESULT_ERROR_UNINITIALIZED: return XessWrapper::ErrorKind::Uninitialized; + case XESS_RESULT_ERROR_INVALID_ARGUMENT: return XessWrapper::ErrorKind::InvalidArgument; + case XESS_RESULT_ERROR_DEVICE_OUT_OF_MEMORY: return XessWrapper::ErrorKind::DeviceOutOfMemory; + case XESS_RESULT_ERROR_DEVICE: return XessWrapper::ErrorKind::Device; + case XESS_RESULT_ERROR_NOT_IMPLEMENTED: return XessWrapper::ErrorKind::NotImplemented; + case XESS_RESULT_ERROR_INVALID_CONTEXT: return XessWrapper::ErrorKind::InvalidContext; + case XESS_RESULT_ERROR_OPERATION_IN_PROGRESS: return XessWrapper::ErrorKind::OperationInProgress; + case XESS_RESULT_ERROR_UNSUPPORTED: return XessWrapper::ErrorKind::Unsupported; + case XESS_RESULT_ERROR_CANT_LOAD_LIBRARY: return XessWrapper::ErrorKind::CantLoadLibrary; + default: return XessWrapper::ErrorKind::Unknown; + } +} + +eastl::string XessWrapper::errorKindToString(ErrorKind kind) +{ + switch (kind) + { + case ErrorKind::UnsupportedDevice: return "Unsupported Device"; + case ErrorKind::UnsupportedDriver: return "Unsupported Driver"; + case ErrorKind::Uninitialized: return "Uninitialized"; + case ErrorKind::InvalidArgument: return "Invalid Argument"; + case ErrorKind::DeviceOutOfMemory: return "Device Out Of Memory"; + case ErrorKind::Device: return "Device error"; + case ErrorKind::NotImplemented: return "Not Implemented"; + case ErrorKind::InvalidContext: return "Invalid Context"; + case ErrorKind::OperationInProgress: return "Operation In Progress"; + case ErrorKind::Unsupported: return "Unsupported"; + case ErrorKind::CantLoadLibrary: return "Can't Load Library"; + default: return "Unknown"; + } +} + namespace drv3d_dx12 { @@ -77,6 +117,7 @@ class XessWrapperImpl LOAD_FUNC(xessD3D12Execute); //-V516 LOAD_FUNC(xessSetVelocityScale); //-V516 LOAD_FUNC(xessStartDump); //-V516 + LOAD_FUNC(xessGetVersion); //-V516 #undef LOAD_FUNC return true; @@ -104,7 +145,7 @@ class XessWrapperImpl memset(&initParms, 0, sizeof(initParms)); initParms.outputResolution = m_desiredOutputResolution; initParms.qualitySetting = toXeSSQuality(quality); - initParms.initFlags = xess_init_flags_t::XESS_INIT_FLAG_INVERTED_DEPTH; + initParms.initFlags = xess_init_flags_t::XESS_INIT_FLAG_INVERTED_DEPTH | xess_init_flags_t::XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE; if (!checkResult(xessD3D12Init(m_xessContext, &initParms))) return false; @@ -149,6 +190,7 @@ class XessWrapperImpl exec_params.pVelocityTexture = xessParams.inMotionVectors->getHandle(); exec_params.pOutputTexture = xessParams.outColor->getHandle(); exec_params.pDepthTexture = xessParams.inDepth->getHandle(); + exec_params.pExposureScaleTexture = xessParams.inExposure ? xessParams.inExposure->getHandle() : nullptr; exec_params.inputColorBase.x = xessParams.inColorDepthOffsetX; exec_params.inputColorBase.y = xessParams.inColorDepthOffsetY; @@ -206,6 +248,22 @@ class XessWrapperImpl } } + dag::Expected getVersion() + { + if (xessGetVersion) + { + xess_version_t version; + if (auto result = xessGetVersion(&version); result == XESS_RESULT_SUCCESS) + return eastl::string(eastl::string::CtorSprintf(), "%d.%d.%d", version.major, version.minor, version.patch); + else + return dag::Unexpected(toErrorKind(result)); + } + else + { + return dag::Unexpected(XessWrapper::ErrorKind::CantLoadLibrary); + } + } + private: bool checkResult(xess_result_t result) { @@ -238,6 +296,7 @@ class XessWrapperImpl decltype(::xessD3D12Execute) *xessD3D12Execute; decltype(::xessSetVelocityScale) *xessSetVelocityScale; decltype(::xessStartDump) *xessStartDump; + decltype(::xessGetVersion) *xessGetVersion; }; } // namespace drv3d_dx12 @@ -279,6 +338,8 @@ void XessWrapper::getXeSSRenderResolution(int &w, int &h) const { pImpl->getXeSS void XessWrapper::startDump(const char *path, int numberOfFrames) { pImpl->startDump(path, numberOfFrames); } +dag::Expected XessWrapper::getVersion() const { return pImpl->getVersion(); } + #if DAGOR_DBGLEVEL > 0 #include diff --git a/prog/engine/drv/drv3d_DX12/xess_wrapper.h b/prog/engine/drv/drv3d_DX12/xess_wrapper.h index 491f9f97a..334173ec4 100644 --- a/prog/engine/drv/drv3d_DX12/xess_wrapper.h +++ b/prog/engine/drv/drv3d_DX12/xess_wrapper.h @@ -2,8 +2,10 @@ #pragma once #include +#include #include +#include namespace drv3d_dx12 { @@ -15,6 +17,7 @@ struct XessParamsDx12 Image *inColor; Image *inDepth; Image *inMotionVectors; + Image *inExposure; float inJitterOffsetX; float inJitterOffsetY; float inInputWidth; @@ -28,6 +31,23 @@ struct XessParamsDx12 class XessWrapper { public: + enum class ErrorKind + { + UnsupportedDevice, + UnsupportedDriver, + Uninitialized, + InvalidArgument, + DeviceOutOfMemory, + Device, + NotImplemented, + InvalidContext, + OperationInProgress, + Unsupported, + CantLoadLibrary, + Unknown + }; + static eastl::string errorKindToString(ErrorKind kind); + bool xessInit(void *device); bool xessCreateFeature(int quality, uint32_t target_width, uint32_t target_height); bool xessShutdown(); @@ -37,6 +57,7 @@ class XessWrapper bool evaluateXess(void *context, const void *dlss_params); void setVelocityScale(float x, float y); bool isXessQualityAvailableAtResolution(uint32_t target_width, uint32_t target_height, int xess_quality) const; + dag::Expected getVersion() const; XessWrapper(); ~XessWrapper(); diff --git a/prog/engine/drv/drv3d_DX12/xess_wrapper_stub.cpp b/prog/engine/drv/drv3d_DX12/xess_wrapper_stub.cpp index 89eadeeb5..4a5700b72 100644 --- a/prog/engine/drv/drv3d_DX12/xess_wrapper_stub.cpp +++ b/prog/engine/drv/drv3d_DX12/xess_wrapper_stub.cpp @@ -10,6 +10,8 @@ class XessWrapperImpl {}; } // namespace drv3d_dx12 +eastl::string XessWrapper::errorKindToString(ErrorKind) { return {}; } + bool XessWrapper::xessInit(void *) { return false; } bool XessWrapper::xessCreateFeature(int, uint32_t, uint32_t) { return false; } @@ -28,6 +30,8 @@ bool XessWrapper::isXessQualityAvailableAtResolution(uint32_t, uint32_t, int) co void XessWrapper::startDump(const char *, int) {} +dag::Expected XessWrapper::getVersion() const { return dag::Unexpected(ErrorKind::Unknown); } + XessWrapper::XessWrapper() = default; XessWrapper::~XessWrapper() = default; diff --git a/prog/engine/drv/drv3d_Metal/d3d_shaders.mm b/prog/engine/drv/drv3d_Metal/d3d_shaders.mm index 6e2aae570..0d5e9f75b 100644 --- a/prog/engine/drv/drv3d_Metal/d3d_shaders.mm +++ b/prog/engine/drv/drv3d_Metal/d3d_shaders.mm @@ -93,7 +93,7 @@ int d3d::set_vs_constbuffer_size(int required_size) { - return required_size; + return min(Render::MAX_CBUFFER_SIZE, required_size); } bool d3d::set_const(unsigned stage, unsigned reg_base, const void *data, unsigned num_regs) @@ -106,7 +106,7 @@ int d3d::set_cs_constbuffer_size(int required_size) { - return required_size; + return min(Render::MAX_CBUFFER_SIZE, required_size); } bool d3d::dispatch(uint32_t thread_group_x, uint32_t thread_group_y, uint32_t thread_group_z, GpuPipeline gpu_pipeline) diff --git a/prog/engine/drv/drv3d_Metal/render.h b/prog/engine/drv/drv3d_Metal/render.h index 3bf84fc0f..9d56c9e82 100644 --- a/prog/engine/drv/drv3d_Metal/render.h +++ b/prog/engine/drv/drv3d_Metal/render.h @@ -104,6 +104,7 @@ class Render { public: static constexpr int MAX_FRAMES_TO_RENDER = 2; + static constexpr int MAX_CBUFFER_SIZE = 64 * 1024; struct Caps { @@ -764,10 +765,10 @@ class Render #if DAGOR_DBGLEVEL > 0 void put_encoder_label(const char *label); - void wait_for_encoder(); + id wait_for_encoder(); #else void put_encoder_label(const char *label) {} - void wait_for_encoder() {} + id wait_for_encoder() { return commandBuffer; } #endif enum class EncoderType @@ -778,17 +779,18 @@ class Render Compute, Acceleration }; - inline void ensureHaveEncoderExceptRender(id cmdBuf, EncoderType type) + inline void ensureHaveEncoderExceptRender(id cmdBuf, EncoderType type, bool wait = true) { -#define KILL_ENCODER(t, enc) \ - if (type != t) \ - { \ - if (enc != nil) \ - { \ - [enc endEncoding]; \ - enc = nil; \ - wait_for_encoder(); \ - } \ +#define KILL_ENCODER(t, enc) \ + if (type != t) \ + { \ + if (enc != nil) \ + { \ + [enc endEncoding]; \ + enc = nil; \ + if (wait) \ + cmdBuf = wait_for_encoder(); \ + } \ } KILL_ENCODER(EncoderType::Render, renderEncoder); KILL_ENCODER(EncoderType::Compute, computeEncoder); diff --git a/prog/engine/drv/drv3d_Metal/render.mm b/prog/engine/drv/drv3d_Metal/render.mm index 6f8d7e004..17bb4b824 100644 --- a/prog/engine/drv/drv3d_Metal/render.mm +++ b/prog/engine/drv/drv3d_Metal/render.mm @@ -348,7 +348,7 @@ inline void checkRenderAcquired(bool acquired = true) void Render::ConstBuffer::init() { - cbuffer = (uint8_t*)malloc(64 * 1024); + cbuffer = (uint8_t*)malloc(MAX_CBUFFER_SIZE); device_buffer_offset = 0; is_binded = nil; is_binded_offset = -1; @@ -357,7 +357,7 @@ inline void checkRenderAcquired(bool acquired = true) void Render::ConstBuffer::applyCmd(void* data, int reg_base, int num_regs) { - G_ASSERT(reg_base + num_regs <= 64 * 1024); + G_ASSERT(reg_base + num_regs <= MAX_CBUFFER_SIZE); memcpy(&cbuffer[reg_base], data, num_regs); num_strored = max(num_strored, reg_base + num_regs); @@ -721,8 +721,8 @@ static void PatchShader(int shader, int num_reg, int num_tex) commandQueue = [device newCommandQueue]; query_buffer = createBuffer(QUERIES_MAX * sizeof(uint64_t), MTLResourceStorageModeShared, "query_buffer"); - stub_buffer = createBuffer(64*1024, MTLResourceStorageModeShared, "stub_buffer"); - memset(stub_buffer.contents, 0, 64*1024); + stub_buffer = createBuffer(MAX_CBUFFER_SIZE, MTLResourceStorageModeShared, "stub_buffer"); + memset(stub_buffer.contents, 0, MAX_CBUFFER_SIZE); used_query = 0; @@ -1297,7 +1297,7 @@ static void PatchShader(int shader, int num_reg, int num_tex) { TIME_PROFILE(upload); - ensureHaveEncoderExceptRender(nullptr, Render::EncoderType::None); + ensureHaveEncoderExceptRender(nullptr, Render::EncoderType::None, false); if (textures2upload.size() || buffers2copy.size() || regions2copy.size() || textures2clear.size() || buffers2clear.size()) { id cmdBuf = createCommandBuffer(commandQueue, "Command buffer flush"); @@ -1307,7 +1307,7 @@ static void PatchShader(int shader, int num_reg, int num_tex) for (int i = 0; i < buffers2copy.size(); ++i) { bool need_set = render.computeEncoder == nil; - ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::Compute); + ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::Compute, false); if (need_set) [computeEncoder setComputePipelineState:copy_cs_pipeline]; @@ -1331,7 +1331,7 @@ static void PatchShader(int shader, int num_reg, int num_tex) bool needBlit = textures2upload.size() || regions2copy.size() || textures2clear.size() || buffers2clear.size(); if (needBlit) - ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::Blit); + ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::Blit, false); for (int i = 0; i < buffers2clear.size(); ++i) { @@ -1375,7 +1375,7 @@ static void PatchShader(int shader, int num_reg, int num_tex) textures2clear.clear(); buffers2clear.clear(); - ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::None); + ensureHaveEncoderExceptRender(cmdBuf, Render::EncoderType::None, false); submitCommandBuffer(cmdBuf, false, false); } } @@ -2871,9 +2871,7 @@ static void fillAttachment(MTLRenderPassAttachmentDescriptor* desc, const Render void Render::releaseOwnerShip() { G_ASSERT(acquire_depth > 0); - acquire_depth--; - - if (acquire_depth == 0) + if (acquire_depth == 1) { cur_thread = main_thread; if (commandBuffer) @@ -2881,6 +2879,7 @@ static void fillAttachment(MTLRenderPassAttachmentDescriptor* desc, const Render [g_render_pool release]; } + acquire_depth--; ::leave_critical_section(acquireSec); } @@ -3397,13 +3396,20 @@ static void fillAttachment(MTLRenderPassAttachmentDescriptor* desc, const Render debug("[signpost] %llu - %s", signpost + 1, label); } - void Render::wait_for_encoder() + id Render::wait_for_encoder() { if (!use_signposts) - return; + return commandBuffer; + + checkRenderAcquired(); + G_ASSERT(commandBuffer != nil); [commandBuffer encodeSignalEvent:signpost_event value:++signpost]; + { + std::lock_guard scopedLock(copy_tex_lock); + flushQueuedCommands(); + } submitCommandBuffer(commandBuffer); debug("[signpost] %llu wait", signpost); @@ -3420,6 +3426,7 @@ static void fillAttachment(MTLRenderPassAttachmentDescriptor* desc, const Render }); commandBuffer = createCommandBuffer(commandQueue, "Command buffer"); + return commandBuffer; } #endif diff --git a/prog/engine/drv/drv3d_commonCode/drv_utils.cpp b/prog/engine/drv/drv3d_commonCode/drv_utils.cpp index 68544be9d..bf19d504b 100644 --- a/prog/engine/drv/drv3d_commonCode/drv_utils.cpp +++ b/prog/engine/drv/drv3d_commonCode/drv_utils.cpp @@ -604,6 +604,12 @@ bool get_enable_hdr_from_settings(const char *name) !isHDRBlackListed(blkDrv, name); } +bool get_hfr_preference_from_settings() +{ + const DataBlock &blk_video = *dgs_get_settings()->getBlockByNameEx("video"); + return blk_video.getBool("preferHfr", false); +} + const char *get_monitor_name_from_settings() { const char *displayName = ::dgs_get_settings()->getBlockByNameEx("video")->getStr("monitor", nullptr); diff --git a/prog/engine/drv/drv3d_commonCode/drv_utils.h b/prog/engine/drv/drv3d_commonCode/drv_utils.h index c3e9eb1c1..aef586f71 100644 --- a/prog/engine/drv/drv3d_commonCode/drv_utils.h +++ b/prog/engine/drv/drv3d_commonCode/drv_utils.h @@ -71,6 +71,7 @@ DAGOR_NOINLINE void paint_window(HWND hWnd, UINT message, WPARAM wParam, LPARAM #endif bool get_enable_hdr_from_settings(const char *name = nullptr); +bool get_hfr_preference_from_settings(); /* Returns with the "video/monitor:t" value from config. nullptr result means default. */ diff --git a/prog/engine/drv/drv3d_commonCode/gpuConfig.h b/prog/engine/drv/drv3d_commonCode/gpuConfig.h index de2588406..947d79b01 100644 --- a/prog/engine/drv/drv3d_commonCode/gpuConfig.h +++ b/prog/engine/drv/drv3d_commonCode/gpuConfig.h @@ -11,4 +11,6 @@ struct GpuDriverConfig : GpuUserConfig bool flushBeforeSurvey; }; -const GpuDriverConfig &get_gpu_driver_cfg(); \ No newline at end of file +const GpuDriverConfig &get_gpu_driver_cfg(); + +extern void (*update_gpu_driver_config)(GpuDriverConfig &); diff --git a/prog/engine/drv/drv3d_commonCode/streamline_adapter.cpp b/prog/engine/drv/drv3d_commonCode/streamline_adapter.cpp index 53bb95d9e..30e616e0f 100644 --- a/prog/engine/drv/drv3d_commonCode/streamline_adapter.cpp +++ b/prog/engine/drv/drv3d_commonCode/streamline_adapter.cpp @@ -37,6 +37,7 @@ SL_FUN_DECL(slSetTag); SL_FUN_DECL(slEvaluateFeature); SL_FUN_DECL(slAllocateResources); SL_FUN_DECL(slFreeResources); +SL_FUN_DECL(slGetFeatureVersion); SL_FUN_DECL(slDLSSGetOptimalSettings); SL_FUN_DECL(slDLSSGetState); @@ -69,6 +70,7 @@ void loadInterposer(void *module) LOAD_FUNC(slEvaluateFeature); LOAD_FUNC(slAllocateResources); LOAD_FUNC(slFreeResources); + LOAD_FUNC(slGetFeatureVersion); #undef LOAD_FUNC } @@ -619,6 +621,23 @@ bool StreamlineAdapter::releaseDlssFeature(int viewportId) return ok; } +static eastl::string versionToString(const sl::Version &version) +{ + return eastl::string(eastl::string::CtorSprintf(), "%d.%d.%d", version.major, version.minor, version.build); +} + +dag::Expected StreamlineAdapter::getDlssVersion() const +{ + if (!sl_funcs::slGetFeatureVersion) + return dag::Unexpected(nv::SupportState::NotSupported); + + sl::FeatureVersion version; + if (SL_FAILED(result, sl_funcs::slGetFeatureVersion(sl::kFeatureDLSS, version))) + return dag::Unexpected(toSupportState(result)); + + return eastl::string{versionToString(version.versionNGX)}; +} + bool StreamlineAdapter::createDlssGFeature(int viewportId, void *commandBuffer) { return sl_funcs::slAllocateResources(commandBuffer, sl::kFeatureDLSS_G, viewportId) == sl::Result::eOk; diff --git a/prog/engine/drv/drv3d_commonCode/streamline_adapter.h b/prog/engine/drv/drv3d_commonCode/streamline_adapter.h index 3ca0a5751..5f86d48ae 100644 --- a/prog/engine/drv/drv3d_commonCode/streamline_adapter.h +++ b/prog/engine/drv/drv3d_commonCode/streamline_adapter.h @@ -76,6 +76,7 @@ class StreamlineAdapter : public nv::DLSS, public nv::Reflex eastl::optional getOptimalSettings(Mode mode, IPoint2 output_resolution) const override; bool setOptions(int viewportId, Mode mode, IPoint2 output_resolution, float sharpness) override; nv::DLSS::State getDlssState() const override { return dlssState; } + dag::Expected getDlssVersion() const override; // DLSS-G bool createDlssGFeature(int viewportId, void *commandBuffer); diff --git a/prog/engine/drv/drv3d_commonCode/streamline_adapter_stub.cpp b/prog/engine/drv/drv3d_commonCode/streamline_adapter_stub.cpp index 2adb7441f..ae2d34a94 100644 --- a/prog/engine/drv/drv3d_commonCode/streamline_adapter_stub.cpp +++ b/prog/engine/drv/drv3d_commonCode/streamline_adapter_stub.cpp @@ -54,6 +54,11 @@ bool StreamlineAdapter::createDlssFeature(int, IPoint2, void *) { return false; bool StreamlineAdapter::releaseDlssFeature(int) { return false; } +dag::Expected StreamlineAdapter::getDlssVersion() const +{ + return dag::Unexpected(nv::SupportState::NotSupported); +} + bool StreamlineAdapter::createDlssGFeature(int, void *) { return false; } bool StreamlineAdapter::releaseDlssGFeature(int) { return false; } diff --git a/prog/engine/drv/drv3d_pc_multi/init.cpp b/prog/engine/drv/drv3d_pc_multi/init.cpp index e72094e8a..e38cda997 100644 --- a/prog/engine/drv/drv3d_pc_multi/init.cpp +++ b/prog/engine/drv/drv3d_pc_multi/init.cpp @@ -273,7 +273,7 @@ static inline int get_selected_api() const bool enableNonAutoDriver = ::dgs_get_settings()->getBlockByNameEx("video")->getBool("enableNonAutoDriver", true); if (!enableNonAutoDriver) { - if (!strcmp(drv, "auto")) + if (strcmp(drv, "auto") != 0) { debug("If it is required for debug purposes add video { enableNonAutoDriver:b=yes; } in settings"); logerr("Only auto driver is allowed! Got %s instead", drv); diff --git a/prog/engine/drv/drv3d_vulkan/buffer_ref.h b/prog/engine/drv/drv3d_vulkan/buffer_ref.h index 07e103c26..9a67a5afd 100644 --- a/prog/engine/drv/drv3d_vulkan/buffer_ref.h +++ b/prog/engine/drv/drv3d_vulkan/buffer_ref.h @@ -18,7 +18,9 @@ struct BufferRef { Buffer *buffer = nullptr; uint32_t offset = 0; - VkDeviceSize visibleDataSize = 0; + uint32_t visibleDataSize = 0; + // for frame mem buffers to uniquely identify them for proper state replace at discard + uint32_t frameReference = 0; BufferRef() = default; ~BufferRef() = default; BufferRef(const BufferRef &) = default; @@ -44,9 +46,13 @@ struct BufferRef buffer = nullptr; offset = 0; visibleDataSize = 0; + frameReference = 0; } - friend bool operator==(const BufferRef &l, const BufferRef &r) { return (l.buffer == r.buffer) && (l.offset == r.offset); } + friend bool operator==(const BufferRef &l, const BufferRef &r) + { + return (l.buffer == r.buffer) && (l.offset == r.offset) && (l.frameReference == r.frameReference); + } friend bool operator!=(const BufferRef &l, const BufferRef &r) { return !(l == r); } }; diff --git a/prog/engine/drv/drv3d_vulkan/d3d/init.cpp b/prog/engine/drv/drv3d_vulkan/d3d/init.cpp index fafd8ba65..e6a740521 100644 --- a/prog/engine/drv/drv3d_vulkan/d3d/init.cpp +++ b/prog/engine/drv/drv3d_vulkan/d3d/init.cpp @@ -796,9 +796,6 @@ void correctStreamingDriverReserve() debug("vulkan: Cannot override texStreaming/driverReserveKB. Settings is not inited yet."); } -using UpdateGpuDriverConfigFunc = void (*)(GpuDriverConfig &); -extern UpdateGpuDriverConfigFunc update_gpu_driver_config; - void update_vulkan_gpu_driver_config(GpuDriverConfig &gpu_driver_config) { auto &deviceProps = Globals::VK::phy; diff --git a/prog/engine/drv/drv3d_vulkan/device_context_cmd.inc b/prog/engine/drv/drv3d_vulkan/device_context_cmd.inc index 5812148aa..1999f046b 100644 --- a/prog/engine/drv/drv3d_vulkan/device_context_cmd.inc +++ b/prog/engine/drv/drv3d_vulkan/device_context_cmd.inc @@ -1345,13 +1345,22 @@ VULKAN_END_CONTEXT_COMMAND VULKAN_BEGIN_CONTEXT_COMMAND(DelaySyncCompletion) VULKAN_CONTEXT_COMMAND_PARAM(bool, enable) #if VULKAN_CONTEXT_COMMAND_IMPLEMENTATION - Backend::sync.setCompletionDelay(enable); if (enable) { + // we need to interrupt frame core, but only once and only after that enable sync delay + // so interrupt it by hand only if we outside of RP and in proper order + InPassStateFieldType inPassState = Backend::State::exec.get(); + bool willInterruptFrameCoreViaRP = (inPassState == InPassStateFieldType::NORMAL_PASS); + ctx.beginCustomStage("DelayedSyncStart"); - ctx.interruptFrameCore(); + if (!willInterruptFrameCoreViaRP) + ctx.interruptFrameCore(); + Backend::sync.setCompletionDelay(enable); } else + { + Backend::sync.setCompletionDelay(enable); ctx.performSyncToPreviousCommandList(); + } #endif VULKAN_END_CONTEXT_COMMAND \ No newline at end of file diff --git a/prog/engine/drv/drv3d_vulkan/driver_config.cpp b/prog/engine/drv/drv3d_vulkan/driver_config.cpp index 271f470a3..0e8e9da73 100644 --- a/prog/engine/drv/drv3d_vulkan/driver_config.cpp +++ b/prog/engine/drv/drv3d_vulkan/driver_config.cpp @@ -244,8 +244,12 @@ const DataBlock *DriverConfig::getPerDriverPropertyBlock(const char *prop_name) bool fitsMin = drvMajor >= entry.getInt("driverMinVer0", 0) && drvMinor >= entry.getInt("driverMinVer1", 0); bool fitsMax = drvMajor <= entry.getInt("driverMaxVer0", drvVerMax) && drvMinor <= entry.getInt("driverMaxVer1", drvVerMax); + bool fitsType = true; bool gpuMatch = true; bool driverInfoMatch = true; + if (entry.paramExists("hwType")) + fitsType = Globals::VK::phy.properties.deviceType == entry.getInt("hwType", 0); + if (entry.paramExists("gpu")) { gpuMatch = false; @@ -263,7 +267,7 @@ const DataBlock *DriverConfig::getPerDriverPropertyBlock(const char *prop_name) #endif } - if (fitsMin && fitsMax && gpuMatch && driverInfoMatch) + if (fitsMin && fitsMax && gpuMatch && driverInfoMatch && fitsType) ret = entry.getBlockByNameEx("data"); }); diff --git a/prog/engine/drv/drv3d_vulkan/predicted_latency_waiter.cpp b/prog/engine/drv/drv3d_vulkan/predicted_latency_waiter.cpp index 47943ba67..6220b84b2 100644 --- a/prog/engine/drv/drv3d_vulkan/predicted_latency_waiter.cpp +++ b/prog/engine/drv/drv3d_vulkan/predicted_latency_waiter.cpp @@ -13,16 +13,19 @@ int64_t PredictedLatencyWaiter::getLastWaitTimeUs() { return profile_usec_from_t void PredictedLatencyWaiter::updateDynamicThreshold(uint64_t external_waited_us) { - // track average for external wait time and treat it as dynamic threshold + // track average for external wait time to treat it as dynamic threshold if needed externalWaitHistoryIndex = (externalWaitHistoryIndex + 1) % AVG_ELEMS; externalWaitUsSum -= externalWaitUsHistory[externalWaitHistoryIndex]; externalWaitUsHistory[externalWaitHistoryIndex] = external_waited_us; externalWaitUsSum += external_waited_us; - dynamicThresholdUs = (externalWaitUsSum / AVG_ELEMS); - // reduce threshold from pure average - // this allows feedback to loop around stable point in order to avoid latching on pure average - if (dynamicThresholdUs > Globals::cfg.latencyWaitDeltaUs) - dynamicThresholdUs -= Globals::cfg.latencyWaitDeltaUs; + + // we can reach max wait time either because frame rate is too low + // and we don't want to correct latency in this case, as prediction time correction step is considered small + // or if we trying to move non-movable time into predicted wait + // in both cases just consume external wait time as dynamic threshold + // reducing inertion on frame rate on low frame rates and fixing up non-movable time block + if (timeToWaitUs == Globals::cfg.latencyWaitMaxUs) + dynamicThresholdUs = (externalWaitUsSum / AVG_ELEMS); } void PredictedLatencyWaiter::update(int64_t external_waited_ticks) diff --git a/prog/engine/drv/drv3d_vulkan/temp_buffers.cpp b/prog/engine/drv/drv3d_vulkan/temp_buffers.cpp index de69b8412..1612dba3a 100644 --- a/prog/engine/drv/drv3d_vulkan/temp_buffers.cpp +++ b/prog/engine/drv/drv3d_vulkan/temp_buffers.cpp @@ -174,7 +174,11 @@ BufferRef FramememBufferManager::acquire(uint32_t size, DeviceMemoryClass mem_cl if (Globals::cfg.debugLevel > 0) buf->setDebugName(String(32, "framemem_%u", frameToRingIdx(frame))); } - return BufferRef{buf, size}; + BufferRef ret{buf, size}; + // make acquires unique over multiple frames as some framemem buffers may be leaved bound, yet not updated + // causing discard state replacement to fail, due to non unique buf+offset combos + ret.frameReference = frame; + return ret; } BufferRef FramememBufferManager::acquire(uint32_t size, uint32_t flags) diff --git a/prog/engine/imgui/imguiImpl.cpp b/prog/engine/imgui/imguiImpl.cpp index 47b34bc3e..c8d01bd83 100644 --- a/prog/engine/imgui/imguiImpl.cpp +++ b/prog/engine/imgui/imguiImpl.cpp @@ -527,6 +527,95 @@ eastl::optional map_dagor_key_to_imgui(int humap_key) } } +int map_imgui_key_to_dagor(int imgui_key) +{ + switch (imgui_key) + { + case ImGuiKey_Tab: return HumanInput::DKEY_TAB; + case ImGuiKey_LeftArrow: return HumanInput::DKEY_LEFT; + case ImGuiKey_RightArrow: return HumanInput::DKEY_RIGHT; + case ImGuiKey_UpArrow: return HumanInput::DKEY_UP; + case ImGuiKey_DownArrow: return HumanInput::DKEY_DOWN; + case ImGuiKey_PageUp: return HumanInput::DKEY_PRIOR; + case ImGuiKey_PageDown: return HumanInput::DKEY_NEXT; + case ImGuiKey_Home: return HumanInput::DKEY_HOME; + case ImGuiKey_End: return HumanInput::DKEY_END; + case ImGuiKey_Insert: return HumanInput::DKEY_INSERT; + case ImGuiKey_Delete: return HumanInput::DKEY_DELETE; + case ImGuiKey_Backspace: return HumanInput::DKEY_BACK; + case ImGuiKey_Space: return HumanInput::DKEY_SPACE; + case ImGuiKey_Enter: return HumanInput::DKEY_RETURN; + case ImGuiKey_Escape: return HumanInput::DKEY_ESCAPE; + case ImGuiKey_KeypadEnter: return HumanInput::DKEY_NUMPADENTER; + case ImGuiKey_LeftShift: return HumanInput::DKEY_LSHIFT; + case ImGuiKey_LeftCtrl: return HumanInput::DKEY_LCONTROL; + case ImGuiKey_LeftAlt: return HumanInput::DKEY_LALT; + case ImGuiKey_RightShift: return HumanInput::DKEY_RSHIFT; + case ImGuiKey_RightCtrl: return HumanInput::DKEY_RCONTROL; + case ImGuiKey_RightAlt: return HumanInput::DKEY_RALT; + case ImGuiKey_A: return HumanInput::DKEY_A; + case ImGuiKey_B: return HumanInput::DKEY_B; + case ImGuiKey_C: return HumanInput::DKEY_C; + case ImGuiKey_D: return HumanInput::DKEY_D; + case ImGuiKey_E: return HumanInput::DKEY_E; + case ImGuiKey_F: return HumanInput::DKEY_F; + case ImGuiKey_G: return HumanInput::DKEY_G; + case ImGuiKey_H: return HumanInput::DKEY_H; + case ImGuiKey_I: return HumanInput::DKEY_I; + case ImGuiKey_J: return HumanInput::DKEY_J; + case ImGuiKey_K: return HumanInput::DKEY_K; + case ImGuiKey_L: return HumanInput::DKEY_L; + case ImGuiKey_M: return HumanInput::DKEY_M; + case ImGuiKey_N: return HumanInput::DKEY_N; + case ImGuiKey_O: return HumanInput::DKEY_O; + case ImGuiKey_P: return HumanInput::DKEY_P; + case ImGuiKey_Q: return HumanInput::DKEY_Q; + case ImGuiKey_R: return HumanInput::DKEY_R; + case ImGuiKey_S: return HumanInput::DKEY_S; + case ImGuiKey_T: return HumanInput::DKEY_T; + case ImGuiKey_U: return HumanInput::DKEY_U; + case ImGuiKey_V: return HumanInput::DKEY_V; + case ImGuiKey_W: return HumanInput::DKEY_W; + case ImGuiKey_X: return HumanInput::DKEY_X; + case ImGuiKey_Y: return HumanInput::DKEY_Y; + case ImGuiKey_Z: return HumanInput::DKEY_Z; + case ImGuiKey_0: return HumanInput::DKEY_0; + case ImGuiKey_1: return HumanInput::DKEY_1; + case ImGuiKey_2: return HumanInput::DKEY_2; + case ImGuiKey_3: return HumanInput::DKEY_3; + case ImGuiKey_4: return HumanInput::DKEY_4; + case ImGuiKey_5: return HumanInput::DKEY_5; + case ImGuiKey_6: return HumanInput::DKEY_6; + case ImGuiKey_7: return HumanInput::DKEY_7; + case ImGuiKey_8: return HumanInput::DKEY_8; + case ImGuiKey_9: return HumanInput::DKEY_9; + case ImGuiKey_F1: return HumanInput::DKEY_F1; + case ImGuiKey_F2: return HumanInput::DKEY_F2; + case ImGuiKey_F3: return HumanInput::DKEY_F3; + case ImGuiKey_F4: return HumanInput::DKEY_F4; + case ImGuiKey_F5: return HumanInput::DKEY_F5; + case ImGuiKey_F6: return HumanInput::DKEY_F6; + case ImGuiKey_F7: return HumanInput::DKEY_F7; + case ImGuiKey_F8: return HumanInput::DKEY_F8; + case ImGuiKey_F9: return HumanInput::DKEY_F9; + case ImGuiKey_F10: return HumanInput::DKEY_F10; + case ImGuiKey_F11: return HumanInput::DKEY_F11; + case ImGuiKey_F12: return HumanInput::DKEY_F12; + case ImGuiKey_Keypad0: return HumanInput::DKEY_NUMPAD0; + case ImGuiKey_Keypad1: return HumanInput::DKEY_NUMPAD1; + case ImGuiKey_Keypad2: return HumanInput::DKEY_NUMPAD2; + case ImGuiKey_Keypad3: return HumanInput::DKEY_NUMPAD3; + case ImGuiKey_Keypad4: return HumanInput::DKEY_NUMPAD4; + case ImGuiKey_Keypad5: return HumanInput::DKEY_NUMPAD5; + case ImGuiKey_Keypad6: return HumanInput::DKEY_NUMPAD6; + case ImGuiKey_Keypad7: return HumanInput::DKEY_NUMPAD7; + case ImGuiKey_Keypad8: return HumanInput::DKEY_NUMPAD8; + case ImGuiKey_Keypad9: return HumanInput::DKEY_NUMPAD9; + + default: return -1; + } +} + bool imgui_window_is_visible(const char *, const char *name) { return load_window_opened(name); } static int menu_bar_height = 0; diff --git a/prog/engine/lib3d/setGamma.cpp b/prog/engine/lib3d/setGamma.cpp index 192099e47..336dfc029 100644 --- a/prog/engine/lib3d/setGamma.cpp +++ b/prog/engine/lib3d/setGamma.cpp @@ -9,12 +9,6 @@ static real cur_gamma = 1; -void set_gamma(real p) -{ - cur_gamma = p; - d3d::setgamma(p); -} - void set_gamma_shadervar(real p) { cur_gamma = p; diff --git a/prog/engine/lib3d/texMgrData.h b/prog/engine/lib3d/texMgrData.h index bc68cc40a..f408f0d32 100644 --- a/prog/engine/lib3d/texMgrData.h +++ b/prog/engine/lib3d/texMgrData.h @@ -566,6 +566,8 @@ struct texmgr_internal::D3dResMgrDataFinal : public D3dResManagerData static void setupQLev(int idx, int q_id, const ddsx::Header &hdr) { resQS[idx].setQLev(max(texDesc[idx].dim.maxLev - hdr.getSkipLevelsFromQ(q_id), texDesc[idx].getMinLev())); + unsigned ld_lev = resQS[idx].getLdLev(); + resQS[idx].setCurQL(ld_lev < resQS[idx].getQLev() ? calcCurQL(idx, ld_lev) : resQS[idx].getMaxQL()); } //! verbose dump of current texture entry state diff --git a/prog/engine/osApiWrappers/macosx/macAsyncRead.cpp b/prog/engine/osApiWrappers/macosx/macAsyncRead.cpp index 0e17caf9a..3ab26f48b 100644 --- a/prog/engine/osApiWrappers/macosx/macAsyncRead.cpp +++ b/prog/engine/osApiWrappers/macosx/macAsyncRead.cpp @@ -159,7 +159,6 @@ bool dfa_read_async(void *handle, int asyncdata_handle, int offset, void *buf, i lseek(p.aio_fildes, offset, SEEK_SET); p.bytesRead = read(p.aio_fildes, buf, len); p.code = 0; - logwarn("AIO failed, using sync IO: read(%d,%d)->%d", offset, len, p.bytesRead); return true; } sleep_msec(1); diff --git a/prog/engine/shaders/dynSceneRes.cpp b/prog/engine/shaders/dynSceneRes.cpp index a0c7a18c0..cb460075e 100644 --- a/prog/engine/shaders/dynSceneRes.cpp +++ b/prog/engine/shaders/dynSceneRes.cpp @@ -1223,6 +1223,7 @@ DynamicRenderableSceneInstance::DynamicRenderableSceneInstance(DynamicRenderable wtmToOriginVecPrev()[i].set(0, -100, 0); opacity()[i] = 1; } + clearNodeCollapser(); } diff --git a/prog/engine/shaders/scriptSMat.cpp b/prog/engine/shaders/scriptSMat.cpp index b785f1dc2..f4bb68fb7 100644 --- a/prog/engine/shaders/scriptSMat.cpp +++ b/prog/engine/shaders/scriptSMat.cpp @@ -34,6 +34,15 @@ static TEXTUREID get_diffuse_mipmap_tex(TEXTUREID tex_id); static inline TEXTUREID get_diffuse_mipmap_tex(TEXTUREID tex_id) { return tex_id; } #endif +const char *get_shader_class_name_by_material_name(const char *mat_name) +{ + const shaderbindump::ShaderClass *sc = shBinDumpEx(true).findShaderClass(mat_name); + if (!sc) + return NULL; + return (const char *)sc->name; +} + + bool shader_exists(const char *shader_name) { return shBinDump().findShaderClass(shader_name) != nullptr; } ShaderMaterial *new_shader_material(const MaterialData &m, bool sec_dump_for_exp, bool do_log) diff --git a/prog/engine/shaders/shadersBinaryData.h b/prog/engine/shaders/shadersBinaryData.h index 1e40ca1dd..89fa99e1d 100644 --- a/prog/engine/shaders/shadersBinaryData.h +++ b/prog/engine/shaders/shadersBinaryData.h @@ -64,6 +64,7 @@ struct ScriptedShadersBinDumpOwner void clear(); size_t getDumpSize() const { return mSelfData.size(); } + HashVal<64> getDumpHash() const { return mInitialDataHash; } dag::ConstSpan getCode(uint32_t id, ShaderCodeType type, ShaderBytecode &tmpbuf); @@ -89,6 +90,7 @@ struct ScriptedShadersBinDumpOwner ScriptedShadersBinDumpV2 *mShaderDumpV2 = nullptr; ScriptedShadersBinDumpV3 *mShaderDumpV3 = nullptr; Tab mSelfData; + HashVal<64> mInitialDataHash; eastl::unique_ptr mDecompressedGropusLru; OSSpinlock mDecompressedGroupsLruMutex; diff --git a/prog/engine/shaders/shadersBinaryDataLoad.cpp b/prog/engine/shaders/shadersBinaryDataLoad.cpp index 4706f2b79..c6c1eb098 100644 --- a/prog/engine/shaders/shadersBinaryDataLoad.cpp +++ b/prog/engine/shaders/shadersBinaryDataLoad.cpp @@ -144,6 +144,8 @@ bool ScriptedShadersBinDumpOwner::load(IGenLoad &crd, int size, bool full_file_l ShaderVariableInfo::resolveAll(); if (mShaderDump == &shBinDump()) d3d::driver_command(Drv3dCommand::REGISTER_SHADER_DUMP, this, (void *)crd.getTargetName()); + + mInitialDataHash = mem_hash_fnv1<64>((char *)mSelfData.data(), mSelfData.size()); return true; } diff --git a/prog/engine/workCycle/idleCycle.cpp b/prog/engine/workCycle/idleCycle.cpp index 9b5ac0c9c..97451ff87 100644 --- a/prog/engine/workCycle/idleCycle.cpp +++ b/prog/engine/workCycle/idleCycle.cpp @@ -12,9 +12,11 @@ #include "workCyclePriv.h" #include <3d/dag_lowLatency.h> -#if _TARGET_XBOX +#if _TARGET_GDK #include -#elif _TARGET_PC_WIN +#endif + +#if _TARGET_PC_WIN #include #endif @@ -78,7 +80,7 @@ void dagor_process_sys_messages(bool input_only) ::perform_wnd_proc_components(NULL, 0, 0, 0, result); } -#if _TARGET_XBOX +#if _TARGET_GDK xbox::dispatch_queue(xbox::get_default_queue()); #endif diff --git a/prog/gameLibs/bvh/bvh.cpp b/prog/gameLibs/bvh/bvh.cpp index c718cb4cb..14905cdbd 100644 --- a/prog/gameLibs/bvh/bvh.cpp +++ b/prog/gameLibs/bvh/bvh.cpp @@ -83,7 +83,8 @@ void teardown(); void init(ContextId context_id); void teardown(ContextId context_id); void on_unload_scene(ContextId context_id); -void update_dynrend_instances(ContextId bvh_context_id, dynrend::ContextId dynrend_context_id, const Point3 &view_position); +void update_dynrend_instances(ContextId bvh_context_id, dynrend::ContextId dynrend_context_id, + dynrend::ContextId dynrend_plane_context_id, const Point3 &view_position); void set_up_dynrend_context_for_processing(dynrend::ContextId dynrend_context_id); } // namespace dyn @@ -411,12 +412,12 @@ void start_frame() void add_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform) { - add_instance(context_id, context_id->genericInstances, mesh_id, transform, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, -1); + add_instance(context_id, context_id->genericInstances, mesh_id, transform, nullptr, false, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, -1); } void update_instances(ContextId bvh_context_id, const Point3 &view_position, const Frustum &frustum, - dynrend::ContextId *dynrend_context_id, RiGenVisibility *ri_gen_visibility) + dynrend::ContextId *dynrend_context_id, dynrend::ContextId *dynrend_plane_context_id, RiGenVisibility *ri_gen_visibility) { bvh_context_id->genericInstances.clear(); for (auto &instances : bvh_context_id->dynrendInstances) @@ -441,7 +442,7 @@ void update_instances(ContextId bvh_context_id, const Point3 &view_position, con ri::update_ri_extra_instances(bvh_context_id, view_position, frustum); } if (bvh_context_id->has(Features::DynrendRigidFull | Features::DynrendRigidBaked | Features::DynrendSkinnedFull)) - dyn::update_dynrend_instances(bvh_context_id, *dynrend_context_id, view_position); + dyn::update_dynrend_instances(bvh_context_id, *dynrend_context_id, *dynrend_plane_context_id, view_position); } static __forceinline bool need_winding_flip(const Mesh &mesh, const Context::Instance &instance) @@ -662,6 +663,8 @@ static void do_add_mesh(ContextId context_id, uint64_t mesh_id, const MeshInfo & memcpy(mesh.impostorOffsets, info.impostorOffsets, sizeof(mesh.impostorOffsets)); if (info.isInterior) mesh.materialType = MeshMeta::bvhMaterialInterior; + else if (info.isClipmap) + mesh.materialType = MeshMeta::bvhMaterialTerrain; else mesh.materialType = MeshMeta::bvhMaterialRendinst; @@ -1449,7 +1452,7 @@ void build(ContextId context_id, const TMatrix &itm, const TMatrix4 &projTm, con auto &desc = hwInstances.emplace_back(); desc.transform = instance.transform; desc.instanceID = metaIndex; - desc.instanceMask = group_mask; + desc.instanceMask = instance.noShadow ? bvhGroupNoShadow : group_mask; desc.instanceContributionToHitGroupIndex = perInstanceDataIndex; desc.flags = mesh.enableCulling ? (flipWinding ? RaytraceGeometryInstanceDescription::TRIANGLE_CULL_FLIP_WINDING : RaytraceGeometryInstanceDescription::NONE) @@ -1905,8 +1908,8 @@ void bind_resources(ContextId context_id, int render_width) static int bvh_atmosphere_texture_distanceVarId = get_shader_variable_id("bvh_atmosphere_texture_distance"); static int bvh_paint_details_tex_slotVarId = get_shader_variable_id("bvh_paint_details_tex_slot"); static int bvh_paint_details_smp_slotVarId = get_shader_variable_id("bvh_paint_details_smp_slot"); - static int bvh_land_color_tex_slotVarId = get_shader_variable_id("bvh_land_color_tex_slot"); - static int bvh_land_color_smp_slotVarId = get_shader_variable_id("bvh_land_color_smp_slot"); + static int bvh_land_color_tex_slotVarId = get_shader_variable_id("bvh_land_color_tex_slot", true); + static int bvh_land_color_smp_slotVarId = get_shader_variable_id("bvh_land_color_smp_slot", true); static int bvh_mip_rangeVarId = get_shader_variable_id("bvh_mip_range"); static int bvh_mip_scaleVarId = get_shader_variable_id("bvh_mip_scale"); static int bvh_mip_biasVarId = get_shader_variable_id("bvh_mip_bias"); @@ -2046,6 +2049,8 @@ bool is_building(ContextId context_id) return !context_id->halfBakedMeshes.empty() || context_id->hasPendingMeshActions.load(std::memory_order_relaxed); } +void set_grass_range(ContextId context_id, float range) { context_id->grassRange = range; } + void start_async_atmosphere_update(ContextId context_id, const Point3 &view_pos, atmosphere_callback callback) { if (!context_id->atmosphereTexture) diff --git a/prog/gameLibs/bvh/bvh_add_instance.h b/prog/gameLibs/bvh/bvh_add_instance.h index 708979b21..8f1069bc8 100644 --- a/prog/gameLibs/bvh/bvh_add_instance.h +++ b/prog/gameLibs/bvh/bvh_add_instance.h @@ -35,8 +35,9 @@ BVH_INLINE bool need_winding_flip(const Mesh &mesh, mat43f_cref transform) } BVH_INLINE void add_instance(ContextId context_id, Context::InstanceMap &instanceMap, uint64_t mesh_id, mat43f_cref transform, - const Point4 *per_instance_data, MeshSkinningInfo *skinning_info, MeshHeliRotorInfo *heli_rotor_info, TreeInfo *tree_info, - LeavesInfo *leaves_info, FlagInfo *flag_info, DeformedInfo *deformed_info, MeshMetaAllocator::AllocId meta_alloc_id) + const Point4 *per_instance_data, bool no_shadow, MeshSkinningInfo *skinning_info, MeshHeliRotorInfo *heli_rotor_info, + TreeInfo *tree_info, LeavesInfo *leaves_info, FlagInfo *flag_info, DeformedInfo *deformed_info, + MeshMetaAllocator::AllocId meta_alloc_id) { auto meshIter = context_id->meshes.find(mesh_id); @@ -52,6 +53,7 @@ BVH_INLINE void add_instance(ContextId context_id, Context::InstanceMap &instanc instance.transform = transform; instance.meshId = mesh_id; instance.uniqueIsRecycled = false; + instance.noShadow = no_shadow; if (per_instance_data) instance.perInstanceData = *per_instance_data; if (skinning_info) @@ -113,22 +115,22 @@ BVH_INLINE void add_instance(ContextId context_id, Context::InstanceMap &instanc BVH_INLINE void add_riGen_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, int thread_ix) { - add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, -1); + add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, false, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, -1); } BVH_INLINE void add_riGen_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, TreeInfo *tree_info, MeshMetaAllocator::AllocId meta_alloc_id, int thread_ix) { - add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, nullptr, nullptr, tree_info, nullptr, - nullptr, nullptr, meta_alloc_id); + add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, false, nullptr, nullptr, tree_info, + nullptr, nullptr, nullptr, meta_alloc_id); } BVH_INLINE void add_riGen_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, LeavesInfo *leaves_info, MeshMetaAllocator::AllocId meta_alloc_id, int thread_ix) { - add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, nullptr, nullptr, nullptr, leaves_info, - nullptr, nullptr, meta_alloc_id); + add_instance(context_id, context_id->riGenInstances[thread_ix], mesh_id, transform, nullptr, false, nullptr, nullptr, nullptr, + leaves_info, nullptr, nullptr, meta_alloc_id); } BVH_INLINE void VECTORCALL add_riExtra_instance(mat43f transform, vec4f pX, vec4f pY, vec4f pZ, ContextId context_id, uint64_t mesh_id, @@ -173,43 +175,46 @@ BVH_INLINE void VECTORCALL add_riExtra_instance(mat43f transform, vec4f pX, vec4 BVH_INLINE void add_riExtra_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, TreeInfo *tree_info, MeshMetaAllocator::AllocId meta_alloc_id, int thread_ix) { - add_instance(context_id, context_id->riExtraTreeInstances[thread_ix], mesh_id, transform, nullptr, nullptr, nullptr, tree_info, - nullptr, nullptr, nullptr, meta_alloc_id); + add_instance(context_id, context_id->riExtraTreeInstances[thread_ix], mesh_id, transform, nullptr, false, nullptr, nullptr, + tree_info, nullptr, nullptr, nullptr, meta_alloc_id); } BVH_INLINE void add_riExtra_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, FlagInfo *flag_info, MeshMetaAllocator::AllocId meta_alloc_id, int thread_ix) { - add_instance(context_id, context_id->riExtraTreeInstances[thread_ix], mesh_id, transform, nullptr, nullptr, nullptr, nullptr, + add_instance(context_id, context_id->riExtraTreeInstances[thread_ix], mesh_id, transform, nullptr, false, nullptr, nullptr, nullptr, nullptr, flag_info, nullptr, meta_alloc_id); } BVH_INLINE void add_dynrend_instance(ContextId context_id, dynrend::ContextId dynrend_context_id, uint64_t mesh_id, - mat43f_cref transform, const Point4 *per_instance_data) + mat43f_cref transform, const Point4 *per_instance_data, bool no_shadow) { - add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, -1); + add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, no_shadow, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, -1); } BVH_INLINE void add_dynrend_instance(ContextId context_id, dynrend::ContextId dynrend_context_id, uint64_t mesh_id, - mat43f_cref transform, const Point4 *per_instance_data, MeshSkinningInfo &skinning_info, MeshMetaAllocator::AllocId meta_alloc_id) + mat43f_cref transform, const Point4 *per_instance_data, bool no_shadow, MeshSkinningInfo &skinning_info, + MeshMetaAllocator::AllocId meta_alloc_id) { - add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, &skinning_info, - nullptr, nullptr, nullptr, nullptr, nullptr, meta_alloc_id); + add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, no_shadow, + &skinning_info, nullptr, nullptr, nullptr, nullptr, nullptr, meta_alloc_id); } BVH_INLINE void add_dynrend_instance(ContextId context_id, dynrend::ContextId dynrend_context_id, uint64_t mesh_id, - mat43f_cref transform, const Point4 *per_instance_data, MeshHeliRotorInfo &heli_rotor_info, MeshMetaAllocator::AllocId meta_alloc_id) + mat43f_cref transform, const Point4 *per_instance_data, bool no_shadow, MeshHeliRotorInfo &heli_rotor_info, + MeshMetaAllocator::AllocId meta_alloc_id) { - add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, nullptr, + add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, no_shadow, nullptr, &heli_rotor_info, nullptr, nullptr, nullptr, nullptr, meta_alloc_id); } BVH_INLINE void add_dynrend_instance(ContextId context_id, dynrend::ContextId dynrend_context_id, uint64_t mesh_id, - mat43f_cref transform, const Point4 *per_instance_data, DeformedInfo &deformed_info, MeshMetaAllocator::AllocId meta_alloc_id) + mat43f_cref transform, const Point4 *per_instance_data, bool no_shadow, DeformedInfo &deformed_info, + MeshMetaAllocator::AllocId meta_alloc_id) { - add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, nullptr, nullptr, - nullptr, nullptr, nullptr, &deformed_info, meta_alloc_id); + add_instance(context_id, context_id->dynrendInstances[dynrend_context_id], mesh_id, transform, per_instance_data, no_shadow, nullptr, + nullptr, nullptr, nullptr, nullptr, &deformed_info, meta_alloc_id); } BVH_INLINE void add_impostor_instance(ContextId context_id, uint64_t mesh_id, mat43f_cref transform, uint32_t color, int thread_ix, diff --git a/prog/gameLibs/bvh/bvh_context.h b/prog/gameLibs/bvh/bvh_context.h index 9036e0ab3..1269bec02 100644 --- a/prog/gameLibs/bvh/bvh_context.h +++ b/prog/gameLibs/bvh/bvh_context.h @@ -588,6 +588,7 @@ struct Context BVHBufferReference *uniqueTransformBuffer; UniqueBLAS *uniqueBlas; bool uniqueIsRecycled; + bool noShadow; MeshMetaAllocator::AllocId metaAllocId; bool hasInstanceColor; eastl::optional perInstanceData; @@ -681,6 +682,8 @@ struct Context Features features = static_cast(0); + float grassRange = 100; + InstanceMap genericInstances; InstanceMap riGenInstances[ri_gen_thread_count]; HWInstanceMap riExtraInstances[ri_extra_thread_count]; diff --git a/prog/gameLibs/bvh/bvh_debug.cpp b/prog/gameLibs/bvh/bvh_debug.cpp index a0a9774d8..925308cf0 100644 --- a/prog/gameLibs/bvh/bvh_debug.cpp +++ b/prog/gameLibs/bvh/bvh_debug.cpp @@ -29,7 +29,8 @@ extern float water_fade_power; namespace bvh::grass { void get_memory_statistics(int &vb, int &ib, int &blas, int &meta, int &query); -} +void get_instances(ContextId context_id, Sbuffer *&instances, Sbuffer *&instance_count); +} // namespace bvh::grass namespace bvh::gobj { void get_memory_statistics(int &meta, int &query); @@ -247,6 +248,10 @@ static void imguiWindow() auto stats = bvh::get_memory_statistics(debugged_context_id); + Sbuffer *grassInstances = nullptr; + Sbuffer *grassInstanceCount = nullptr; + bvh::grass::get_instances(debugged_context_id, grassInstances, grassInstanceCount); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::BeginCombo("##debugged_context_id", debugged_context_id->name.data(), 0)) { @@ -291,15 +296,17 @@ static void imguiWindow() ImGui::Text("Terrain BLAS: %d MB", mb(stats.terrainBlasSize)); ImGui::SameLine(); ImGui::Text("Terrain VB: %d MB", mb(stats.terrainVBSize)); - ImGui::Text("Grass BLAS: %d MB", mb(stats.grassBlasSize)); + ImGui::Text("Grass count: %d", grassInstances ? grassInstances->getNumElements() : 0); + ImGui::SameLine(); + ImGui::Text("BLAS: %d MB", mb(stats.grassBlasSize)); ImGui::SameLine(); - ImGui::Text("Grass VB: %d MB", mb(stats.grassVBSize)); + ImGui::Text("VB: %d MB", mb(stats.grassVBSize)); ImGui::SameLine(); - ImGui::Text("Grass IB: %d MB", mb(stats.grassIBSize)); + ImGui::Text("IB: %d MB", mb(stats.grassIBSize)); ImGui::SameLine(); - ImGui::Text("Grass meta: %d MB", mb(stats.grassMetaSize)); + ImGui::Text("Meta: %d MB", mb(stats.grassMetaSize)); ImGui::SameLine(); - ImGui::Text("Grass query: %d MB", mb(stats.grassQuerySize)); + ImGui::Text("Query: %d MB", mb(stats.grassQuerySize)); ImGui::Text("Cable BLAS: %d MB", mb(stats.cableBLASSize)); ImGui::SameLine(); ImGui::Text("Cable VB: %d MB", mb(stats.cableVBSize)); diff --git a/prog/gameLibs/bvh/bvh_dyn.cpp b/prog/gameLibs/bvh/bvh_dyn.cpp index 9fc1352e7..43b726af2 100644 --- a/prog/gameLibs/bvh/bvh_dyn.cpp +++ b/prog/gameLibs/bvh/bvh_dyn.cpp @@ -21,6 +21,8 @@ extern float bvh_dyn_range; namespace bvh::dyn { +static ShaderVariableInfo aircraft_damage_decals_setupVarId("aircraft_damage_decals_setup"); + static eastl::unordered_set relem_changed_contexts; static CallbackToken relem_changed_token; @@ -127,7 +129,11 @@ static void on_relem_changed_all(const DynamicRenderableSceneLodsResource *resou void init() { relem_changed_token = unitedvdata::dmUnitedVdata.on_mesh_relems_updated.subscribe(on_relem_changed_all); } -void teardown() { relem_changed_token.~CallbackToken(); } +void teardown() +{ + relem_changed_token.~CallbackToken(); + relem_changed_token = CallbackToken(); +} void init(ContextId context_id) { @@ -179,6 +185,7 @@ struct IterCtx { ContextId contextId; Point3 viewPosition; + bool isPlane; }; bool has_camo(ShaderMesh::RElem &elem) @@ -192,8 +199,8 @@ bool has_camo(ShaderMesh::RElem &elem) inline bool is_deformed(ShaderMesh::RElem &elem) { return strcmp(elem.mat->getShaderClassName(), "dynamic_deformed") == 0; } static void iterate_instances(dynrend::ContextId dynrend_context_id, const DynamicRenderableSceneResource &res, - const DynamicRenderableSceneInstance &inst, const Tab &all_visibility, int visibility_index, float min_elem_radius, - int base_offset_render_data, int index_to_per_instance_render_data, int rigid_chunk_size, void *user_data) + const DynamicRenderableSceneInstance &inst, const dynrend::PerInstanceRenderData &inst_render_data, const Tab &all_visibility, + int visibility_index, float min_elem_radius, int base_offset_render_data, int rigid_chunk_size, void *user_data) { IterCtx *ctx = (IterCtx *)user_data; ContextId bvh_context_id = ctx->contextId; @@ -212,53 +219,66 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam auto rigidCount = res.getRigidsConst().size(); auto lodNo = inst.getCurrentLodNo(); + bool isDamaged = false; + for (auto &interval : inst_render_data.intervals) + if (interval.varId == aircraft_damage_decals_setupVarId.get_var_id()) + isDamaged = true; + Point4 camoData; auto getCamoData = [&](const Mesh &mesh, const ShaderMesh::RElem &elem) -> const Point4 * { if (mesh.materialType & MeshMeta::bvhMaterialCamo) { auto camoTexture = elem.mat->get_texture(1); - uint32_t camoTexBindless = 0xFFFFFFFFU; - if (camoTexture != BAD_TEXTUREID) + auto tql = get_managed_res_cur_tql(camoTexture); + if (tql != TQL_stub) { - auto iter = bvh_context_id->camoTextures.find((uint32_t)camoTexture); - if (iter == bvh_context_id->camoTextures.end()) + uint32_t camoTexBindless = 0xFFFFFFFFU; + if (camoTexture != BAD_TEXTUREID) { - bvh_context_id->holdTexture(camoTexture, camoTexBindless); - bvh_context_id->camoTextures.emplace((uint32_t)camoTexture, camoTexBindless); + auto iter = bvh_context_id->camoTextures.find((uint32_t)camoTexture); + if (iter == bvh_context_id->camoTextures.end()) + { + bvh_context_id->holdTexture(camoTexture, camoTexBindless); + bvh_context_id->camoTextures.emplace((uint32_t)camoTexture, camoTexBindless); + } + else + camoTexBindless = iter->second; } - else - camoTexBindless = iter->second; - } - auto data = dynrend::get_per_instance_render_data(dynrend_context_id, index_to_per_instance_render_data); - auto pack = (uint32_t)float_to_half(data[1].z) | (float_to_half(data[1].w) << 16); - camoData.x = data[0].z; - camoData.y = data[0].w; - memcpy(&camoData.z, &pack, sizeof(pack)); - memcpy(&camoData.w, &camoTexBindless, sizeof(camoTexBindless)); - return &camoData; + auto data = inst_render_data.params.data(); + auto pack = (uint32_t)float_to_half(data[1].z) | (float_to_half(data[1].w) << 16); + camoData.x = data[0].z; + camoData.y = data[0].w; + memcpy(&camoData.z, &pack, sizeof(pack)); + memcpy(&camoData.w, &camoTexBindless, sizeof(camoTexBindless)); + return &camoData; + } } else { auto skinTexture = elem.mat->get_texture(0); if (skinTexture != BAD_TEXTUREID && skinTexture != mesh.albedoTextureId) { - uint32_t skinTexBindless = 0xFFFFFFFFU; - auto iter = bvh_context_id->camoTextures.find((uint32_t)skinTexture); - if (iter == bvh_context_id->camoTextures.end()) + auto tql = get_managed_res_cur_tql(skinTexture); + if (tql != TQL_stub) { - bvh_context_id->holdTexture(skinTexture, skinTexBindless); - bvh_context_id->camoTextures.emplace((uint32_t)skinTexture, skinTexBindless); + uint32_t skinTexBindless = 0xFFFFFFFFU; + auto iter = bvh_context_id->camoTextures.find((uint32_t)skinTexture); + if (iter == bvh_context_id->camoTextures.end()) + { + bvh_context_id->holdTexture(skinTexture, skinTexBindless); + bvh_context_id->camoTextures.emplace((uint32_t)skinTexture, skinTexBindless); + } + else + skinTexBindless = iter->second; + + memcpy(&camoData.x, &skinTexBindless, sizeof(skinTexBindless)); + // Totally random numbers, indicating that this per instance data is replacing the albedo texture; + camoData.y = 80; + camoData.z = 7; + camoData.w = 14; + return &camoData; } - else - skinTexBindless = iter->second; - - memcpy(&camoData.x, &skinTexBindless, sizeof(skinTexBindless)); - // Totally random numbers, indicating that this per instance data is replacing the albedo texture; - camoData.y = 80; - camoData.z = 7; - camoData.w = 14; - return &camoData; } } @@ -321,7 +341,7 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam heliRotorInfo.transformedBlas = &data.blas; heliRotorInfo.invWorldTm = TMatrix4(inverse(tm)).transpose(); heliRotorInfo.getParamsFn = [=](Point4 ¶ms, Point4 &sec_params) { - auto allParams = dynrend::get_per_instance_render_data(dynrend_context_id, index_to_per_instance_render_data); + auto allParams = inst_render_data.params.data(); params = allParams[0]; sec_params = allParams[1]; }; @@ -329,7 +349,8 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam if (data.metaAllocId < 0) data.metaAllocId = bvh_context_id->allocateMetaRegion(); - add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, heliRotorInfo, data.metaAllocId); + add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, isDamaged, heliRotorInfo, + data.metaAllocId); } else if (DAGOR_UNLIKELY(is_deformed(elem))) { @@ -351,7 +372,7 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam deformedInfo.simParams.y = 0; deformedInfo.getParamsFn = [=](float &deform_id, Point2 &sim_params) { - auto allParams = dynrend::get_per_instance_render_data(dynrend_context_id, index_to_per_instance_render_data); + auto allParams = inst_render_data.params.data(); deform_id = allParams[2].x; sim_params = deformedInfo.simParams; }; @@ -359,10 +380,11 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam if (data.metaAllocId < 0) data.metaAllocId = bvh_context_id->allocateMetaRegion(); - add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, deformedInfo, data.metaAllocId); + add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, isDamaged, deformedInfo, + data.metaAllocId); } else - add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr); + add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, isDamaged); } }, [&](const ShaderSkinnedMesh *mesh, int node_id, int skin_no) { @@ -408,7 +430,8 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam data.metaAllocId = bvh_context_id->allocateMetaRegion(); auto camoDataPtr = getCamoData(*bvhMesh, elem); - add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, skinningInfo, data.metaAllocId); + add_dynrend_instance(bvh_context_id, dynrend_context_id, meshId, tm43, camoDataPtr, isDamaged, skinningInfo, + data.metaAllocId); } } @@ -416,15 +439,18 @@ static void iterate_instances(dynrend::ContextId dynrend_context_id, const Dynam }); } -void update_dynrend_instances(ContextId bvh_context_id, dynrend::ContextId dynrend_context_id, const Point3 &view_position) +void update_dynrend_instances(ContextId bvh_context_id, dynrend::ContextId dynrend_context_id, + dynrend::ContextId dynrend_plane_context_id, const Point3 &view_position) { if (!bvh_context_id->has(Features::DynrendRigidBaked | Features::DynrendRigidFull | Features::DynrendSkinnedFull)) return; TIME_D3D_PROFILE(bvh::update_dynrend_instances); - IterCtx ctx = {bvh_context_id, view_position}; + IterCtx ctx = {bvh_context_id, view_position, false}; dynrend::iterate_instances(dynrend_context_id, iterate_instances, &ctx); + ctx.isPlane = true; + dynrend::iterate_instances(dynrend_plane_context_id, iterate_instances, &ctx); } void set_up_dynrend_context_for_processing(dynrend::ContextId dynrend_context_id) diff --git a/prog/gameLibs/bvh/bvh_grass.cpp b/prog/gameLibs/bvh/bvh_grass.cpp index 23778a633..89f0719c6 100644 --- a/prog/gameLibs/bvh/bvh_grass.cpp +++ b/prog/gameLibs/bvh/bvh_grass.cpp @@ -102,6 +102,8 @@ struct BVHConnection : public bvh::BVHConnection dag::Vector metainfoMappingsCpu; BVHConnection(const char *name) : bvh::BVHConnection(name) {} + + float getMaxRange() const override { return contexts.empty() ? 0 : (*contexts.begin())->grassRange; } } bvhConnection("grass"); void init() diff --git a/prog/gameLibs/bvh/bvh_ri.cpp b/prog/gameLibs/bvh/bvh_ri.cpp index a8e797a9a..164470e9f 100644 --- a/prog/gameLibs/bvh/bvh_ri.cpp +++ b/prog/gameLibs/bvh/bvh_ri.cpp @@ -100,6 +100,7 @@ void teardown_ri_gen(); void teardown() { relem_changed_token.~CallbackToken(); + relem_changed_token = CallbackToken(); RenderableInstanceLodsResource::setImpostorTextureCallback(nullptr); teardown_ri_gen(); diff --git a/prog/gameLibs/bvh/shaders/bvh.dshl b/prog/gameLibs/bvh/shaders/bvh.dshl index 19211b4bb..412d18b5f 100644 --- a/prog/gameLibs/bvh/shaders/bvh.dshl +++ b/prog/gameLibs/bvh/shaders/bvh.dshl @@ -239,18 +239,19 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face static const uint bvhMaterialTypeMask = (1 << 16) - 1; - static const uint bvhGroupTerrain = 1 << 0; - static const uint bvhGroupRiGen = 1 << 1; - static const uint bvhGroupRiExtra = 1 << 2; - static const uint bvhGroupDynrend = 1 << 3; - static const uint bvhGroupGrass = 1 << 4; - static const uint bvhGroupImpostor = 1 << 5; + static const uint bvhGroupTerrain = 1 << 0; + static const uint bvhGroupRiGen = 1 << 1; + static const uint bvhGroupRiExtra = 1 << 2; + static const uint bvhGroupDynrend = 1 << 3; + static const uint bvhGroupGrass = 1 << 4; + static const uint bvhGroupImpostor = 1 << 5; + static const uint bvhGroupNoShadow = 1 << 6; static const uint bvhGroupAll = 0xff; static const uint bvhGroupRender = bvhGroupAll; - static const uint bvhGroupSoftShadow = bvhGroupAll & ~bvhGroupTerrain; - static const uint bvhGroupHardShadow = bvhGroupAll & ~bvhGroupTerrain & ~bvhGroupGrass; + static const uint bvhGroupSoftShadow = bvhGroupAll & ~bvhGroupTerrain & ~bvhGroupNoShadow; + static const uint bvhGroupHardShadow = bvhGroupAll & ~bvhGroupTerrain & ~bvhGroupGrass & ~bvhGroupNoShadow; static const uint bvhGroupAO = bvhGroupAll; struct LayerData @@ -390,6 +391,8 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face struct HitInfo { + bool dissolved; + float t; float3 centerWorldPos; @@ -496,7 +499,7 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face return bvh_mip_bias + saturate(sqrt(d / bvh_mip_range)) * bvh_mip_scale * (for_atest ? 0.5 : 1); } - HitInfo CalcHitInfo( float3 ray_origin, float3 ray_direction, float ray_t, uint triangleIx, uint instanceId, uint instanceContributionToHitGroupIndex, float2 barycentrics2, float3x4 to_world, bool isFrontFace, half3 defaultColor ) + HitInfo CalcHitInfo(float3 ray_origin, float3 ray_direction, float ray_t, uint triangleIx, uint instanceId, uint instanceContributionToHitGroupIndex, float2 barycentrics2, float3x4 to_world, bool isFrontFace, half3 defaultColor) { HitInfo hitInfo = (HitInfo)0; @@ -509,7 +512,23 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face // The most significant bit tells if the instance has translucency. // If it has, the next 8 bits are the translucency value bool hasTranslucency = instanceId >> 23; - uint translucency = hasTranslucency ? ((instanceId >> 15) & 0xFF) : 0; + uint translucencyI = hasTranslucency ? ((instanceId >> 15) & 0xFF) : 0; + float translucency = translucencyI / 255.0; + + #if BVH_TRANSLUCENCY_IS_DISSOLVE + [branch] + if (translucency > 0) + { + float dissolveAlpha = get_dissolve_value_from_world_position(hitInfo.position + bvh_origin); + [branch] + if (translucency > dissolveAlpha) + { + hitInfo.dissolved = true; + return hitInfo; + } + } + #endif + instanceId = hasTranslucency ? (instanceId & 0x7FFF) : instanceId; bool hasPerInstanceData = instanceContributionToHitGroupIndex != 0xFFFFFFU; @@ -520,7 +539,7 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face hitInfo.alphaTextureIndex = get_alpha_texture_index(meta, hitInfo.alphaSamplerIndex); hitInfo.normalTextureIndex = get_normal_texture_index(meta, hitInfo.normalSamplerIndex); hitInfo.extraTextureIndex = get_extra_texture_index(meta, hitInfo.extraSamplerIndex); - hitInfo.translucency = half(translucency / 255.0); + hitInfo.translucency = half(translucency); hitInfo.materialData1 = meta.materialData1; hitInfo.materialData2 = meta.materialData2; hitInfo.isImpostor = is_impostor(meta.materialType); @@ -809,6 +828,12 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face #if handle_translucent HitInfo hitInfo = CalcHitInfo(ForwardAHSParams, defaultColor); + #if BVH_TRANSLUCENCY_IS_DISSOLVE + [branch] + if (hitInfo.dissolved) + return false; + #endif + [branch] if (need_clip_impostor(hitInfo)) return false; @@ -816,13 +841,17 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face [branch] if (IsAlphaGreaterThan(hitInfo, calc_mip_level(primaryT + hitInfo.t, true), 0.5)) { - if (hitInfo.translucency > 0) - { - translucentT = max(translucentT, ray_t); - rayColor = lerp(0, rayColor, hitInfo.translucency); - } - else + #if BVH_TRANSLUCENCY_IS_DISSOLVE return true; + #else + if (hitInfo.translucency > 0) + { + translucentT = max(translucentT, ray_t); + rayColor = lerp(0, rayColor, hitInfo.translucency); + } + else + return true; + #endif } #endif return false; @@ -844,7 +873,11 @@ macro USE_MAIN_BVH(stage, need_textures, need_normal, need_color, cull_back_face const uint flags = RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES | (handle_translucent ? RAY_FLAG_NONE : RAY_FLAG_FORCE_OPAQUE) | (first_hit ? RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH : RAY_FLAG_NONE) - | (cull_back_face ? RAY_FLAG_CULL_BACK_FACING_TRIANGLES : RAY_FLAG_NONE); + | (cull_back_face ? RAY_FLAG_CULL_BACK_FACING_TRIANGLES : RAY_FLAG_NONE) + #ifdef TRACE_RAY_EXTRA_FLAGS + | TRACE_RAY_EXTRA_FLAGS + #endif + ; GenericRayQuery(flags, TraceRayAHSLambda) query; diff --git a/prog/gameLibs/bvh/stub/bvh_stub.cpp b/prog/gameLibs/bvh/stub/bvh_stub.cpp index f47896832..dbc7b06ae 100644 --- a/prog/gameLibs/bvh/stub/bvh_stub.cpp +++ b/prog/gameLibs/bvh/stub/bvh_stub.cpp @@ -28,7 +28,7 @@ void set_ri_extra_range(ContextId, float) {} void prepare_ri_extra_instances() {} -void update_instances(ContextId, const Point3 &, const Frustum &, dynrend::ContextId *, RiGenVisibility *) {} +void update_instances(ContextId, const Point3 &, const Frustum &, dynrend::ContextId *, dynrend::ContextId *, RiGenVisibility *) {} void add_mesh(ContextId, uint64_t, const MeshInfo &) {} @@ -64,6 +64,8 @@ void finalize_async_atmosphere_update(ContextId) {} bool is_building(ContextId) { return false; } +void set_grass_range(ContextId, float) {} + void ChannelParser::enum_shader_channel(int, int, int, int, int, ChannelModifier, int) {} } // namespace bvh \ No newline at end of file diff --git a/prog/gameLibs/bvh/stub/bvh_stub_dyn.cpp b/prog/gameLibs/bvh/stub/bvh_stub_dyn.cpp index aada77d6d..410735043 100644 --- a/prog/gameLibs/bvh/stub/bvh_stub_dyn.cpp +++ b/prog/gameLibs/bvh/stub/bvh_stub_dyn.cpp @@ -9,6 +9,6 @@ void teardown() {} void init(ContextId) {} void teardown(ContextId) {} void on_unload_scene(ContextId) {} -void update_dynrend_instances(ContextId, dynrend::ContextId, const Point3 &) {} +void update_dynrend_instances(ContextId, dynrend::ContextId, dynrend::ContextId, const Point3 &) {} void set_up_dynrend_context_for_processing(dynrend::ContextId) {} } // namespace bvh::dyn \ No newline at end of file diff --git a/prog/gameLibs/daECS/core/entityManagerDebug.cpp b/prog/gameLibs/daECS/core/entityManagerDebug.cpp index b4fec61f3..f8e8bd81a 100644 --- a/prog/gameLibs/daECS/core/entityManagerDebug.cpp +++ b/prog/gameLibs/daECS/core/entityManagerDebug.cpp @@ -417,11 +417,11 @@ void ecs::EntityManager::trackComponent(ecs::component_t comp, TrackComponentOp void ecs::EntityManager::trackComponent(const ecs::BaseQueryDesc &desc, const char *details, TrackAccessStack need_stack, ecs::EntityId eid) const { - TrackAccessRecordRAIILock scopeLock(track_mutex); - - if (DAGOR_LIKELY(records_by_component.empty())) + if (DAGOR_LIKELY(records_by_component.empty())) // intentionally before lock return; + TrackAccessRecordRAIILock scopeLock(track_mutex); + for (const ecs::ComponentDesc &c : desc.componentsRO) trackComponent(c.name, TrackComponentOp::READ, details, need_stack, eid); diff --git a/prog/gameLibs/daGI2/treesAboveDepth.cpp b/prog/gameLibs/daGI2/treesAboveDepth.cpp index 9e655915a..b01914ca8 100644 --- a/prog/gameLibs/daGI2/treesAboveDepth.cpp +++ b/prog/gameLibs/daGI2/treesAboveDepth.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #define GLOBAL_VARS_LIST \ @@ -25,7 +26,8 @@ VAR(trees2d_depth_region) \ VAR(trees2d_depth_samplerstate) \ VAR(trees2d_depth_min_samplerstate) \ - VAR(trees2d_samplerstate) + VAR(trees2d_samplerstate) \ + VAR(trees2d_clear_regions_arr) static ShaderVariableInfo object_tess_factorVarId{"object_tess_factor", true}; @@ -173,23 +175,31 @@ void TreesAboveDepth::prepare(const Point3 &origin, float minZ, float maxZ, cons // clear all regions first if (!regionsToClear.empty()) { - d3d::set_render_target(nullptr, 0); - d3d::set_depth(trees2dDepthMin.getTex2D(), 0, DepthAccess::RW); + TIME_D3D_PROFILE(trees_above_clear); + carray shaderRegions; + G_ASSERT(regionsToClear.size() <= shaderRegions.size()); - for (auto ® : regionsToClear) + for (int i = 0; i < regionsToClear.size(); i++) { - d3d::setview(reg.left(), reg.top(), reg.size().x + 1, reg.size().y + 1, 0, 1); - d3d::clearview(CLEAR_ZBUFFER, 0, 0.0f, 0); + auto &b = regionsToClear[i]; + shaderRegions[i] = IPoint4(b.getMin().x, b.getMin().y, b.getMax().x, b.getMax().y); } + for (int i = regionsToClear.size(); i < shaderRegions.size(); i++) + shaderRegions[i] = IPoint4(1, 1, 0, 0); // empty, inclusive min/max + + ShaderGlobal::set_int4_array(trees2d_clear_regions_arrVarId, shaderRegions.data(), shaderRegions.size()); + + d3d::set_render_target(nullptr, 0); + d3d::set_depth(trees2dDepthMin.getTex2D(), 0, DepthAccess::RW); + + d3d::setview(0, 0, trees2dHelper.texSize, trees2dHelper.texSize, 0, 1); + clearRegions.render(); d3d::set_render_target(trees2d.getTex2D(), 0); d3d::set_depth(trees2dDepth.getTex2D(), 0, DepthAccess::RW); - for (auto ® : regionsToClear) - { - d3d::setview(reg.left(), reg.top(), reg.size().x + 1, reg.size().y + 1, 0, 1); - d3d::clearview(CLEAR_ZBUFFER | CLEAR_TARGET, 0, 0.0f, 0); - } + d3d::setview(0, 0, trees2dHelper.texSize, trees2dHelper.texSize, 0, 1); + clearRegions.render(); d3d::resource_barrier({trees2dDepth.getTex2D(), RB_RO_SRV | stageAll | RB_SOURCE_STAGE_PIXEL, 0, 0}); d3d::resource_barrier({trees2dDepthMin.getTex2D(), RB_RO_SRV | stageAll | RB_SOURCE_STAGE_PIXEL, 0, 0}); @@ -281,6 +291,7 @@ void TreesAboveDepth::init(float half_distance, float texel_size) trees2dHelper.curOrigin = IPoint2(-1000000, 1000000); trees2dHelper.texSize = trees2dDRes; writeDepthToAlpha.init("trees2d_depth_write_to_alpha"); + clearRegions.init("trees2d_clear"); } void TreesAboveDepth::invalidate() { trees2dHelper.curOrigin = IPoint2(-1024 * 1024, 1024 * 1024); } diff --git a/prog/gameLibs/daRg/guiScene.cpp b/prog/gameLibs/daRg/guiScene.cpp index 079524a05..dfcfb88c9 100644 --- a/prog/gameLibs/daRg/guiScene.cpp +++ b/prog/gameLibs/daRg/guiScene.cpp @@ -672,6 +672,7 @@ void GuiScene::renderThreadBeforeRender() AutoProfileScope profileTotal(profiler, M_BEFORE_RENDER_TOTAL); G_ASSERT(etree.rebuildFlagsAccum == 0); + yuvRenderer.resetOnFrameStart(); int curTime = get_time_msec(); float dt = (lastRenderTimestamp != 0) ? (curTime - lastRenderTimestamp) * 1e-3f : 0.0f; diff --git a/prog/gameLibs/daRg/yuvRenderer.cpp b/prog/gameLibs/daRg/yuvRenderer.cpp index 13bfa2435..7e8c5f889 100644 --- a/prog/gameLibs/daRg/yuvRenderer.cpp +++ b/prog/gameLibs/daRg/yuvRenderer.cpp @@ -22,9 +22,6 @@ bool YuvRenderer::init() textureVVarId = VariableMap::getVariableId("texV"); alphaVarId = get_shader_variable_id("transparent", true); - if (!shader.init(YuvRenderer::shaderName, false)) - return false; - return true; } @@ -36,11 +33,17 @@ void YuvRenderer::startRender(StdGuiRender::GuiContext &ctx, bool *own_render) ctx.resetFrame(); ctx.start_render(); } + if (currentShader == shadersPool.size()) + if (!shadersPool.push_back().init(YuvRenderer::shaderName, false)) + logerr("failed to init yuv renderer shader"); + G_ASSERTF(currentShader < shadersPool.size(), // + "currentShader=%u shadersPool.size()=%u (%d max)", currentShader, shadersPool.size(), shadersPool.capacity()); } void YuvRenderer::render(StdGuiRender::GuiContext &ctx, TEXTUREID texIdY, TEXTUREID texIdU, TEXTUREID texIdV, float l, float t, float r, float b, const Point2 &tc_lt, const Point2 &tc_rb, E3DCOLOR color, BlendMode blend_mode, float saturate) { + auto &shader = shadersPool[currentShader]; shader.material->set_texture_param(textureYVarId, texIdY); shader.material->set_texture_param(textureUVarId, texIdU); shader.material->set_texture_param(textureVVarId, texIdV); @@ -61,8 +64,7 @@ void YuvRenderer::endRender(StdGuiRender::GuiContext &ctx, bool own_render) { if (own_render) ctx.end_render(); + currentShader++; } -void YuvRenderer::term() { shader.close(); } - } // namespace darg diff --git a/prog/gameLibs/daRg/yuvRenderer.h b/prog/gameLibs/daRg/yuvRenderer.h index 0eebcca46..173b898fc 100644 --- a/prog/gameLibs/daRg/yuvRenderer.h +++ b/prog/gameLibs/daRg/yuvRenderer.h @@ -3,7 +3,7 @@ #include #include - +#include namespace darg { @@ -11,17 +11,18 @@ class YuvRenderer { public: bool init(); + void resetOnFrameStart() { currentShader = 0; } void startRender(StdGuiRender::GuiContext &ctx, bool *own_render); void render(StdGuiRender::GuiContext &ctx, TEXTUREID texIdY, TEXTUREID texIdU, TEXTUREID texIdV, float l, float t, float r, float b, const Point2 &tc_lt, const Point2 &tc_rb, E3DCOLOR color, BlendMode blend_mode, float saturate); void endRender(StdGuiRender::GuiContext &ctx, bool own_render); - void term(); static const char *shaderName; private: - StdGuiRender::StdGuiShader shader; + StaticTab shadersPool; //< we allow upto 16 videoframes on screen rendered simultaneously + unsigned currentShader = 0; int textureYVarId = -1, textureUVarId = -1, textureVVarId = -1; int alphaVarId = -1; }; diff --git a/prog/gameLibs/daSkies2/shaders/skies2/prepareAltScattering.dshl b/prog/gameLibs/daSkies2/shaders/skies2/prepareAltScattering.dshl index 537a304cf..0b1e3ab69 100644 --- a/prog/gameLibs/daSkies2/shaders/skies2/prepareAltScattering.dshl +++ b/prog/gameLibs/daSkies2/shaders/skies2/prepareAltScattering.dshl @@ -298,6 +298,7 @@ shader skies_integrate_froxel_scattering_ps shader skies_integrate_froxel_scattering_cs { + ENABLE_ASSERT(cs) USE_PS5_WAVE32_MODE() FROXELS_SCATTERING(cs) hlsl(cs) { @@ -366,7 +367,8 @@ shader skies_integrate_froxel_scattering_cs //tMax = min(tMax, prepare_resolution.w/1000); // Sample count - float tMax = prepare_resolution.w/1000/skies_frustum_scattering_last_tz; + ##assert(skies_frustum_scattering_last_tz != 0.0); + float tMax = prepare_resolution.w/1000/max(skies_frustum_scattering_last_tz, 0.1); float prevD = 0; // Phase functions @@ -379,7 +381,9 @@ shader skies_integrate_froxel_scattering_cs // Ray march the atmosphere to integrate optical depth IrradianceSpectrum L = IrradianceSpectrum(0.0f,0.0f,0.0f); DimensionlessSpectrum throughput = DimensionlessSpectrum(1.0,1.0,1.0); - uint sampleCount = (skies_frustum_scattering_last_tz < 1) ? uint(skies_froxels_resolution.z)-1 : uint(skies_froxels_resolution.z); + + ##assert(all(skies_froxels_resolution != 0.0)); + uint sampleCount = (skies_frustum_scattering_last_tz < 1) ? max(uint(skies_froxels_resolution.z), 1)-1 : uint(skies_froxels_resolution.z); sampleCount <<= DOUBLE_SAMPLING; for (uint i = 0; i < sampleCount; i++) diff --git a/prog/gameLibs/das/daBfg/daBfg.das b/prog/gameLibs/das/daBfg/daBfg.das index d3c629cf1..531808ebe 100644 --- a/prog/gameLibs/das/daBfg/daBfg.das +++ b/prog/gameLibs/das/daBfg/daBfg.das @@ -127,7 +127,7 @@ def registerNode(var self : NameSpace; name : string; var declaration_callback : return <- registry.nodes |> get(nodeId) <| $(var node_data : NodeData&) getTracker() |> unregisterNode(nodeId, node_data.generation) getTracker() |> registerNode(nodeId) - node_data |> registerNodeDeclaration(self.nameSpaceId) <| @ [[ <- declaration_callback, =registry ]] () + node_data |> registerNodeDeclaration(self.nameSpaceId) <| @ [[ <- declaration_callback, =registry]] () return <- declaration_callback |> invoke() <| [[Registry nameSpaceId = self.nameSpaceId, nodeId = nodeId, @@ -479,8 +479,8 @@ class BlobMacro : AstCallMacro res |> setDescription($v(mangledBlobTypeName), $v(blobType.sizeOf), $v(blobType.alignOf), getTypeInfo(type<$t(blobType)>), @@$c("ctor`{blobTypeHash}"), @@$c("dtor`{blobTypeHash}"), @@$c("copy`{blobTypeHash}")); } else { - let nullFunc = [[function<(var arg0 : void?) : void> ]]; - let nullCopyFunc = [[function<(var arg0 : void?; arg1 : void const?) : void> ]]; + let nullFunc = [[function<(var arg0 : void?) : void>]]; + let nullCopyFunc = [[function<(var arg0 : void?; arg1 : void const?) : void>]]; res |> setDescription($v(mangledBlobTypeName), $v(blobType.sizeOf), $v(blobType.alignOf), getTypeInfo(type<$t(blobType)>), nullFunc, nullFunc, nullCopyFunc); } diff --git a/prog/gameLibs/das/daBfg/resource_slot.das b/prog/gameLibs/das/daBfg/resource_slot.das index c19299654..25a64c0d7 100644 --- a/prog/gameLibs/das/daBfg/resource_slot.das +++ b/prog/gameLibs/das/daBfg/resource_slot.das @@ -33,8 +33,8 @@ def registerAccess(var self : NameSpace; name : string; slot_decl : resource_slo for a in slot_decl.read actionList |> read(a.slot, a.priority) - let declCB <- @ <| [[ <- declaration_callback ]] (var node_handle : daBfgCore::NodeHandle &; var slots_state : ResourceSlotCore::State &) - node_handle <- self |> daBfg::registerNode(name) <| @ [[ <- declaration_callback, <- slots_state ]] (var reg : daBfg::Registry) + let declCB <- @ <| [[ <- declaration_callback]] (var node_handle : daBfgCore::NodeHandle &; var slots_state : ResourceSlotCore::State &) + node_handle <- self |> daBfg::registerNode(name) <| @ [[ <- declaration_callback, <- slots_state]] (var reg : daBfg::Registry) return <- declaration_callback |> invoke(slots_state, reg) handle |> ResourceSlotCore::register_access(self.nameSpaceId, name, actionList, declCB) \ No newline at end of file diff --git a/prog/gameLibs/das/ecs/safe.das b/prog/gameLibs/das/ecs/safe.das index 315f0d6ff..23b878f06 100644 --- a/prog/gameLibs/das/ecs/safe.das +++ b/prog/gameLibs/das/ecs/safe.das @@ -98,7 +98,7 @@ def operator ?.(t : Object const? const ==const; name : string) : ChildComponent return (*t)[name] else return get_child(*t, name, ecs_hash(name)) - return [[ChildComponent const? const ]] + return [[ChildComponent const? const]] [generic, constant_expression(name=false), unused_argument(name)] @@ -108,7 +108,7 @@ def operator ?.(var t : Object? ==const; name : string) : ChildComponent? return (*t)[name] else return getRW_child(*t, name, ecs_hash(name)) - return [[ChildComponent? ]] + return [[ChildComponent?]] [generic, constant_expression(name=false), unused_argument(name)] @@ -118,7 +118,7 @@ def operator ?[] (t : Object const? const; name : string) : ChildComponent const return (*t)[name] else return get_child(*t, name, ecs_hash(name)) - return [[ChildComponent const? const ]] + return [[ChildComponent const? const]] [generic, constant_expression(name=false), unused_argument(name)] @@ -128,7 +128,7 @@ def operator ?[] (var t : Object?; name : string) : ChildComponent? return (*t)[name] else return getRW_child(*t, name, ecs_hash(name)) - return [[ChildComponent? ]] + return [[ChildComponent?]] def operator ??(a : ChildComponent const? const; default_value) diff --git a/prog/gameLibs/dasModules/generic/animchar.cpp b/prog/gameLibs/dasModules/generic/animchar.cpp index 90999fa16..541140c3f 100644 --- a/prog/gameLibs/dasModules/generic/animchar.cpp +++ b/prog/gameLibs/dasModules/generic/animchar.cpp @@ -259,6 +259,8 @@ struct AnimFifo3QueueAnnotation : das::ManagedStructureAnnotation("node"); + addField("morphTime"); addField("state"); addField("t0"); } @@ -486,6 +488,18 @@ class AnimV20 final : public das::Module das::addExtern(*this, lib, "scene_instance_setNodeWtm", das::SideEffects::modifyArgument, "das_call_member::invoke"); + using method_clearNodeCollapser = + das::das_call_member; + das::addExtern(*this, lib, "scene_instance_clearNodeCollapser", + das::SideEffects::modifyArgument, + "das_call_member::invoke"); + using method_markNodeCollapserNode = das::das_call_member; + das::addExtern(*this, lib, "scene_instance_markNodeCollapserNode", + das::SideEffects::modifyArgument, + "das_call_member::invoke"); auto sendChangeAnimStateEventExt = das::addExtern(*this, lib, "send_change_anim_state_event", das::SideEffects::modifyExternal, "bind_dascript::send_change_anim_state_event"); sendChangeAnimStateEventExt->annotations.push_back( @@ -495,6 +509,8 @@ class AnimV20 final : public das::Module "AnimCharV20::getSlotId"); das::addExtern(*this, lib, "animchar_addSlotId", das::SideEffects::modifyExternal, "AnimCharV20::addSlotId"); + das::addExtern(*this, lib, "animchar_getSlotName", das::SideEffects::accessExternal, + "AnimCharV20::getSlotName"); using method_setTraceContext = DAS_CALL_MEMBER(::AnimCharV20::AnimcharBaseComponent::setTraceContext); das::addExtern(*this, lib, "animchar_setTraceContext", das::SideEffects::modifyArgument, @@ -648,6 +664,18 @@ class AnimV20 final : public das::Module das::addExtern(*this, lib, "animchar_getAttachmentTm", das::SideEffects::none, DAS_CALL_MEMBER_CPP(::AnimCharV20::AnimcharBaseComponent::getAttachmentTm)); + using method_getAttachmentSlotsCount = DAS_CALL_MEMBER(::AnimCharV20::AnimcharBaseComponent::getAttachmentSlotsCount); + das::addExtern(*this, lib, "animchar_getAttachmentSlotsCount", + das::SideEffects::none, DAS_CALL_MEMBER_CPP(::AnimCharV20::AnimcharBaseComponent::getAttachmentSlotsCount)); + + using method_getAttachmentSlotId = DAS_CALL_MEMBER(::AnimCharV20::AnimcharBaseComponent::getAttachmentSlotId); + das::addExtern(*this, lib, "animchar_getAttachmentSlotId", das::SideEffects::none, + DAS_CALL_MEMBER_CPP(::AnimCharV20::AnimcharBaseComponent::getAttachmentSlotId)); + + using method_getAttachmentUid = DAS_CALL_MEMBER(::AnimCharV20::AnimcharBaseComponent::getAttachmentUid); + das::addExtern(*this, lib, "animchar_getAttachmentUid", das::SideEffects::none, + DAS_CALL_MEMBER_CPP(::AnimCharV20::AnimcharBaseComponent::getAttachmentUid)); + using method_setTmRel = DAS_CALL_MEMBER(::AnimCharV20::AnimcharBaseComponent::setTmRel); das::addExtern(*this, lib, "animchar_setTmRel", das::SideEffects::modifyArgument, DAS_CALL_MEMBER_CPP(::AnimCharV20::AnimcharBaseComponent::setTmRel)); @@ -691,7 +719,13 @@ class AnimV20 final : public das::Module using method = das::das_call_member; das::addExtern(*this, lib, "anim_state_holder_getInlinePtr", das::SideEffects::modifyArgument, "das::das_call_member< void *(::AnimV20::IAnimStateHolder::*)(int), &::AnimV20::IAnimStateHolder::getInlinePtr >::invoke"); + using const_method = + das::das_call_member; + das::addExtern(*this, lib, "anim_state_holder_getInlinePtrConst", das::SideEffects::none, + "das::das_call_member< const void *(::AnimV20::IAnimStateHolder::*)(int) const, " + "&::AnimV20::IAnimStateHolder::getInlinePtr >::invoke"); } + DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::getInlinePtrMaxSz, das::SideEffects::none, "anim_state_holder_getInlinePtrMaxSz") DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::getTimeScaleParamId, das::SideEffects::none, "anim_state_holder_getTimeScaleParamId") DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::getParamEffTimeScale, das::SideEffects::none, "anim_state_holder_getParamEffTimeScale") @@ -702,6 +736,7 @@ class AnimV20 final : public das::Module DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::setTimeScaleParamId, das::SideEffects::modifyArgument, "anim_state_holder_setTimeScaleParamId") DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::setParamFlags, das::SideEffects::modifyArgument, "anim_state_holder_setParamFlags") + DAS_BIND_MEMBER(::AnimV20::IAnimStateHolder::advance, das::SideEffects::modifyArgument, "anim_state_holder_advance") DAS_BIND_MEMBER(::AnimV20::AnimBlendCtrl_1axis::getParamId, das::SideEffects::none, "anim_blend_node_getParamId") DAS_BIND_MEMBER(::AnimV20::AnimBlendCtrl_Fifo3::getParamId, das::SideEffects::none, "anim_blend_node_getParamId") diff --git a/prog/gameLibs/dasModules/pathFinder/pathFinder.cpp b/prog/gameLibs/dasModules/pathFinder/pathFinder.cpp index 961127c02..59f5c7a35 100644 --- a/prog/gameLibs/dasModules/pathFinder/pathFinder.cpp +++ b/prog/gameLibs/dasModules/pathFinder/pathFinder.cpp @@ -297,19 +297,6 @@ class PathfinderModule final : public das::Module das::addExtern(*this, lib, "rebuildNavMesh_close", das::SideEffects::modifyExternal, "pathfinder::rebuildNavMesh_close"); - das::addExtern(*this, lib, "walk_removed_tile_cache_tiles", - das::SideEffects::modifyExternal, "bind_dascript::walk_removed_tile_cache_tiles"); - - das::addExtern(*this, lib, "clear_removed_tile_cache_tiles", - das::SideEffects::modifyExternal, "pathfinder::clear_removed_tile_cache_tiles"); - - das::addExtern(*this, lib, "walk_removed_rebuild_tile_cache_tiles", - das::SideEffects::modifyExternal, "bind_dascript::walk_removed_rebuild_tile_cache_tiles"); - - das::addExtern(*this, lib, - "clear_removed_rebuild_tile_cache_tiles", das::SideEffects::modifyExternal, - "pathfinder::clear_removed_rebuild_tile_cache_tiles"); - das::addExtern(*this, lib, "tilecache_obstacle_move", das::SideEffects::modifyExternal, "bind_dascript::tilecache_obstacle_move"); das::addExtern(*this, lib, "tilecache_obstacle_move", diff --git a/prog/gameLibs/dxil/shader_header_compiler.cpp b/prog/gameLibs/dxil/shader_header_compiler.cpp index 96475c9f6..7a71bb2c7 100644 --- a/prog/gameLibs/dxil/shader_header_compiler.cpp +++ b/prog/gameLibs/dxil/shader_header_compiler.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -10,6 +11,8 @@ #include #include "supplements/auto.h" #include +#include +#include using namespace dxil; @@ -257,23 +260,12 @@ bool is_cbv_type(D3D_SHADER_INPUT_TYPE type) { return D3D_SIT_CBUFFER == type; } bool is_sampler_type(D3D_SHADER_INPUT_TYPE type) { return D3D_SIT_SAMPLER == type; } -} // namespace - -ShaderHeaderCompileResult dxil::compileHeaderFromReflectionData(ShaderStage stage, const eastl::vector &reflection, - uint32_t max_const_count, void *dxc_lib) +ComPtr load_utilities(void *dxc_lib) { - ShaderHeaderCompileResult result = {}; -#if _TARGET_PC_WIN - - result.header.shaderType = static_cast(stage); - result.header.maxConstantCount = max_const_count; - result.header.bonesConstantsUsed = -1; // @TODO: remove + ComPtr utilities; if (!dxc_lib) { - result.logMessage = "dxil::compileHeaderFromShader: no valid shader compiler library handle " - "provided"; - result.isOk = false; - return result; + return utilities; } DxcCreateInstanceProc DxcCreateInstance = nullptr; @@ -281,37 +273,77 @@ ShaderHeaderCompileResult dxil::compileHeaderFromReflectionData(ShaderStage stag if (!DxcCreateInstance) { - result.logMessage = "dxil::compileHeaderFromShader: Missing entry point DxcCreateInstance in " - "dxcompiler.dll"; - result.isOk = false; - return result; + return utilities; } - IDxcUtils *utilities = nullptr; DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&utilities)); if (!utilities) { - result.logMessage = "dxil::compileHeaderFromShader: DxcCreateInstance with CLSID_DxcUtils " - "failed"; - result.isOk = false; - return result; + return utilities; } + return utilities; +} +template +ComPtr create_reflection(IDxcUtils *utils, eastl::span data) +{ DxcBuffer blob; blob.Encoding = DXC_CP_ACP; - blob.Ptr = reflection.data(); - blob.Size = reflection.size(); + blob.Ptr = data.data(); + blob.Size = data.size(); - ID3D12ShaderReflection *shaderInfo = nullptr; - utilities->CreateReflection(&blob, IID_PPV_ARGS(&shaderInfo)); + ComPtr result; + utils->CreateReflection(&blob, IID_PPV_ARGS(&result)); + return result; +} + +eastl::string get_function_name(const D3D12_FUNCTION_DESC &func) +{ + // Name is mangled like it would be c++ + // convention is ?@@ + auto mangledName = func.Name; + uint32_t start = 0; + for (; mangledName[start] != '\0'; ++start) + { + if (isalpha(mangledName[start])) + { + break; + } + } + uint32_t stop = mangledName[start] != '\0' ? start + 1 : start; + for (; mangledName[stop] != '\0'; ++stop) + { + if (!isalpha(mangledName[stop])) + { + break; + } + } + return {mangledName + start, stop - start}; +} +} // namespace + +ShaderHeaderCompileResult dxil::compileHeaderFromReflectionData(ShaderStage stage, const eastl::vector &reflection, + uint32_t max_const_count, void *dxc_lib) +{ + ShaderHeaderCompileResult result = {}; +#if _TARGET_PC_WIN + + auto utilitiesLoadResult = load_utilities(dxc_lib); + if (!utilitiesLoadResult) + { + return result; + } + + auto shaderInfo = create_reflection(utilitiesLoadResult /*->*/.Get(), reflection); if (!shaderInfo) { - utilities->Release(); - result.logMessage = "dxil::compileHeaderFromShader: IDxcUtils::CreateReflection failed"; - result.isOk = false; return result; } + result.header.shaderType = static_cast(stage); + result.header.maxConstantCount = max_const_count; + result.header.bonesConstantsUsed = -1; // @TODO: remove + result.isOk = true; D3D12_SHADER_DESC desc = {}; shaderInfo->GetDesc(&desc); @@ -589,13 +621,365 @@ ShaderHeaderCompileResult dxil::compileHeaderFromReflectionData(ShaderStage stag if (!result.isOk) { - result.logMessage += make_bound_resource_table(desc, shaderInfo); + result.logMessage += make_bound_resource_table(desc, shaderInfo.Get()); result.logMessage += "Error while building shader resource usage header.\n"; } - shaderInfo->Release(); - utilities->Release(); - #endif return result; } + +namespace +{ +enum class ShaderFunctionRelfectionError +{ + NoError, + NoDesc, + InvalidBindlessResourceType, + InvalidBindlessBindingPoint, + BindlessSamplerSpaceOutOfRange, + BindlessResourceSpaceOutOfRange, + InvalidSpecialConstantRegister, + InvalidRootConstantRegister, + InvalidResourceSpace, + BRegisterIndexOutOfRange, + InvalidSamplerSpaceIndex, + SRegisterIndexOutOfRange, + TRegisterIndexOufOfRange, + UAVHasEmbeddedCounter, + URegisterIndexOutOfRange, + NotYetImplemented, +}; + +template +ShaderFunctionRelfectionError parse_resource_definition(const D3D12_SHADER_INPUT_BIND_DESC &desc, T &target, U &library_info) +{ + if (0 == desc.BindCount) + { + if (!is_supported_bindless_type(desc.Type)) + { + return ShaderFunctionRelfectionError::InvalidBindlessResourceType; + } + if (0 != desc.BindPoint) + { + return ShaderFunctionRelfectionError::InvalidBindlessBindingPoint; + } + if (is_sampler_type(desc.Type)) + { + if ((desc.Space < dxil::BINDLESS_SAMPLERS_SPACE_OFFSET) || + (desc.Space >= (dxil::BINDLESS_SAMPLERS_SPACE_OFFSET + dxil::BINDLESS_SAMPLERS_SPACE_COUNT))) + { + return ShaderFunctionRelfectionError::BindlessSamplerSpaceOutOfRange; + } + + target.resourceUsageTable.bindlessUsageMask |= 1u << (desc.Space - 1); + library_info.resourceUsageTable.bindlessUsageMask |= 1u << (desc.Space - 1); + } + else + { + if ((desc.Space < dxil::BINDLESS_RESOURCES_SPACE_OFFSET) || + (desc.Space >= (dxil::BINDLESS_RESOURCES_SPACE_OFFSET + dxil::BINDLESS_RESOURCES_SPACE_COUNT))) + { + return ShaderFunctionRelfectionError::BindlessResourceSpaceOutOfRange; + } + + target.resourceUsageTable.bindlessUsageMask |= 1u << (desc.Space + 1); + library_info.resourceUsageTable.bindlessUsageMask |= 1u << (desc.Space + 1); + } + } + else + { + if (is_cbv_type(desc.Type)) + { + if (desc.Space > 0) + { + if (desc.BindPoint == dxil::SPECIAL_CONSTANTS_REGISTER_INDEX) + { + if (desc.Space == dxil::DRAW_ID_REGISTER_SPACE) + { + target.resourceUsageTable.specialConstantsMask |= dxil::SC_DRAW_ID; + library_info.resourceUsageTable.specialConstantsMask |= dxil::SC_DRAW_ID; + } + else + { + return ShaderFunctionRelfectionError::InvalidSpecialConstantRegister; + } + } + else if (desc.BindPoint == dxil::ROOT_CONSTANT_BUFFER_REGISTER_INDEX) + { + if (desc.Space <= dxil::ROOT_CONSTANT_BUFFER_REGISTER_SPACE_OFFSET) + { + return ShaderFunctionRelfectionError::InvalidRootConstantRegister; + } + + target.resourceUsageTable.rootConstantDwords = desc.Space - dxil::ROOT_CONSTANT_BUFFER_REGISTER_SPACE_OFFSET; + library_info.resourceUsageTable.rootConstantDwords = desc.Space - dxil::ROOT_CONSTANT_BUFFER_REGISTER_SPACE_OFFSET; + } + else + { + return ShaderFunctionRelfectionError::InvalidResourceSpace; + } + } + else + { + if ((desc.BindPoint >= dxil::MAX_B_REGISTERS)) + { + return ShaderFunctionRelfectionError::BRegisterIndexOutOfRange; + } + + target.resourceUsageTable.bRegisterUseMask |= 1ul << desc.BindPoint; + library_info.resourceUsageTable.bRegisterUseMask |= 1ul << desc.BindPoint; + } + } + else if (is_sampler_type(desc.Type)) + { + if (desc.Space != dxil::REGULAR_RESOURCES_SPACE_INDEX) + { + return ShaderFunctionRelfectionError::InvalidSamplerSpaceIndex; + } + if (desc.BindPoint >= dxil::MAX_T_REGISTERS) + { + return ShaderFunctionRelfectionError::SRegisterIndexOutOfRange; + } + target.resourceUsageTable.sRegisterUseMask |= 1ul << desc.BindPoint; + library_info.resourceUsageTable.sRegisterUseMask |= 1ul << desc.BindPoint; + if (0 != (desc.uFlags & D3D_SIF_COMPARISON_SAMPLER)) + { + library_info.sRegisterCompareUseMask |= 1ul << desc.BindPoint; + } + } + else if (is_srv_type(desc.Type)) + { + if (desc.BindPoint >= dxil::MAX_T_REGISTERS) + { + return ShaderFunctionRelfectionError::TRegisterIndexOufOfRange; + } + + for (UINT i = 0; i < desc.BindCount; ++i) + { + target.resourceUsageTable.tRegisterUseMask |= 1ul << (desc.BindPoint + i); + library_info.resourceUsageTable.tRegisterUseMask |= 1ul << (desc.BindPoint + i); + library_info.tRegisterTypes[desc.BindPoint + i] = desc.Type | (desc.Dimension << 4); + } + } + else if (is_uav_type(desc.Type)) + { + if (is_uav_with_counter_type(desc.Type)) + { + return ShaderFunctionRelfectionError::UAVHasEmbeddedCounter; + } + + if (desc.BindPoint >= dxil::MAX_U_REGISTERS) + { + return ShaderFunctionRelfectionError::URegisterIndexOutOfRange; + } + for (UINT i = 0; i < desc.BindCount; ++i) + { + target.resourceUsageTable.uRegisterUseMask |= 1ul << (desc.BindPoint + i); + library_info.resourceUsageTable.uRegisterUseMask |= 1ul << (desc.BindPoint + i); + library_info.uRegisterTypes[desc.BindPoint + i] = desc.Type | (desc.Dimension << 4); + } + } + } + return ShaderFunctionRelfectionError::NoError; +} + +uint16_t translate_shader_type(UINT version) +{ + dxil::ShaderStage value = dxil::ShaderStage::INVALID_STAGE; + switch (version >> 16) + { + case 16: // explicit invalid case + default: break; + case 0: value = dxil::ShaderStage::PIXEL; break; + case 1: value = dxil::ShaderStage::VERTEX; break; + case 2: value = dxil::ShaderStage::GEOMETRY; break; + case 3: value = dxil::ShaderStage::HULL; break; + case 4: value = dxil::ShaderStage::DOMAIN; break; + case 5: value = dxil::ShaderStage::COMPUTE; break; + case 6: value = dxil::ShaderStage::LIBRARY; break; + case 7: value = dxil::ShaderStage::RAY_GEN; break; + case 8: value = dxil::ShaderStage::INTERSECTION; break; + case 9: value = dxil::ShaderStage::ANY_HIT; break; + case 10: value = dxil::ShaderStage::CLOSEST_HIT; break; + case 11: value = dxil::ShaderStage::MISS; break; + case 12: value = dxil::ShaderStage::CALLABLE; break; + case 13: value = dxil::ShaderStage::MESH; break; + case 14: value = dxil::ShaderStage::AMPLIFICATION; break; + case 15: value = dxil::ShaderStage::NODE; break; + } + return static_cast(value); +} + +uint32_t get_shader_minimum_recursion(dxil::ShaderStage stage) +{ + // ray gen shader has to have at least a recursion of 1 to allow to shoot rays + return (dxil::ShaderStage::RAY_GEN == stage) ? 1 : 0; +} + +bool is_a_shader_with_recursion(dxil::ShaderStage stage) +{ + return (dxil::ShaderStage::RAY_GEN == stage) || (dxil::ShaderStage::CLOSEST_HIT == stage) || (dxil::ShaderStage::ANY_HIT == stage) || + (dxil::ShaderStage::MISS == stage) || (dxil::ShaderStage::CALLABLE == stage); +} + +bool is_a_shader_with_payload(dxil::ShaderStage stage) +{ + return (dxil::ShaderStage::RAY_GEN == stage) || (dxil::ShaderStage::CLOSEST_HIT == stage) || (dxil::ShaderStage::ANY_HIT == stage) || + (dxil::ShaderStage::MISS == stage); +} + +bool is_a_shader_with_attributes(dxil::ShaderStage stage) +{ + return (dxil::ShaderStage::CLOSEST_HIT == stage) || (dxil::ShaderStage::ANY_HIT == stage) || + (dxil::ShaderStage::INTERSECTION == stage); +} + +ShaderFunctionRelfectionError relfect(uint32_t default_playload_size_in_bytes, const FunctionExtraDataQuery &function_extra_data_query, + ID3D12FunctionReflection &function, LibraryResourceInformation &library_info, dxil::LibraryShaderProperties &output) +{ + D3D12_FUNCTION_DESC functionDesc{}; + if (FAILED(function.GetDesc(&functionDesc))) + { + return ShaderFunctionRelfectionError::NoDesc; + } + + auto functionName = get_function_name(functionDesc); + + output.shaderType = translate_shader_type(functionDesc.Version); + output.deviceRequirement.shaderFeatureFlagsLow = static_cast(functionDesc.RequiredFeatureFlags); + output.deviceRequirement.shaderFeatureFlagsHigh = static_cast(functionDesc.RequiredFeatureFlags >> 32); + output.deviceRequirement.shaderModel = functionDesc.Version & 0xFF; + + // currently we need to specify this values externally as there is no way to get them, other than decoding the DXIL + // container and looking at disassembly strings. + uint32_t recursionDepth = get_shader_minimum_recursion(static_cast(output.shaderType)); + uint32_t maxPayLoadSizeInBytes = default_playload_size_in_bytes; + uint32_t maxAttributeSizeInBytes = sizeof(float) * 2; + auto functionData = function_extra_data_query(static_cast(output.shaderType), functionName); + if (functionData) + { + recursionDepth = functionData->recursionDepth; + maxPayLoadSizeInBytes = functionData->maxPayLoadSizeInBytes; + maxAttributeSizeInBytes = functionData->maxAttributeSizeInBytes; + } + output.maxRecusionDepth = is_a_shader_with_recursion(static_cast(output.shaderType)) ? recursionDepth : 0; + output.maxPayloadSizeInBytes = + is_a_shader_with_payload(static_cast(output.shaderType)) ? maxPayLoadSizeInBytes : 0; + output.maxAttributeSizeInBytes = + is_a_shader_with_attributes(static_cast(output.shaderType)) ? maxAttributeSizeInBytes : 0; + + if (functionDesc.BoundResources > 0) + { + for (UINT bi = 0; bi < functionDesc.BoundResources; ++bi) + { + D3D12_SHADER_INPUT_BIND_DESC boundResourceInfo{}; + function.GetResourceBindingDesc(bi, &boundResourceInfo); + auto result = parse_resource_definition(boundResourceInfo, output, library_info); + if (ShaderFunctionRelfectionError::NoError != result) + { + return result; + } + } + } + + return ShaderFunctionRelfectionError::NoError; +} + +void append_to_log(eastl::string &log, ShaderFunctionRelfectionError error) +{ + switch (error) + { + case ShaderFunctionRelfectionError::NoError: log += "No error"; break; + case ShaderFunctionRelfectionError::NoDesc: log += "Unable to retrieve description"; break; + case ShaderFunctionRelfectionError::InvalidBindlessResourceType: log += "Invalid bindless resource type"; break; + case ShaderFunctionRelfectionError::InvalidBindlessBindingPoint: log += "Invalid bindless binding point"; break; + case ShaderFunctionRelfectionError::BindlessSamplerSpaceOutOfRange: log += "Bindless samplers out of space range"; break; + case ShaderFunctionRelfectionError::BindlessResourceSpaceOutOfRange: log += "Bindless resource out of space ranget"; break; + case ShaderFunctionRelfectionError::InvalidSpecialConstantRegister: log += "Invalid special const register"; break; + case ShaderFunctionRelfectionError::InvalidRootConstantRegister: log += "Invalid root const register"; break; + case ShaderFunctionRelfectionError::InvalidResourceSpace: log += "Invalid resource space"; break; + case ShaderFunctionRelfectionError::BRegisterIndexOutOfRange: log += "B register index out of range"; break; + case ShaderFunctionRelfectionError::InvalidSamplerSpaceIndex: log += "Invalid sampler space index"; break; + case ShaderFunctionRelfectionError::SRegisterIndexOutOfRange: log += "S register index out of range"; break; + case ShaderFunctionRelfectionError::TRegisterIndexOufOfRange: log += "T register index out of range"; break; + case ShaderFunctionRelfectionError::UAVHasEmbeddedCounter: log += "UAV resource has embedded counter"; break; + case ShaderFunctionRelfectionError::URegisterIndexOutOfRange: log += "U register index out of range"; break; + case ShaderFunctionRelfectionError::NotYetImplemented: log += "Functionality is not implemented yet"; break; + } +} +} // namespace + +dxil::LibraryShaderPropertiesCompileResult dxil::compileLibraryShaderPropertiesFromReflectionData( + uint32_t default_playload_size_in_bytes, const FunctionExtraDataQuery &function_extra_data_query, + eastl::span reflection, void *dxc_lib_handle) +{ + LibraryShaderPropertiesCompileResult result; + + if (reflection.empty()) + { + result.isOk = false; + result.logMessage = "Reflection blob was empty"; + return result; + } + + if (!dxc_lib_handle) + { + result.isOk = false; + result.logMessage = "DXC lib handle was null"; + return result; + } + auto utilitiesLoadResult = load_utilities(dxc_lib_handle); + if (!utilitiesLoadResult) + { + result.isOk = false; + result.logMessage = "Failed to create DXC utilities library"; + return result; + } + + auto libInfo = create_reflection(utilitiesLoadResult.Get(), reflection); + if (!libInfo) + { + result.isOk = false; + result.logMessage = "Unable to create reflection interface from reflection blob"; + return result; + } + + D3D12_LIBRARY_DESC libDesc{}; + libInfo->GetDesc(&libDesc); + + result.properties.resize(libDesc.FunctionCount); + result.names.resize(libDesc.FunctionCount); + for (uint32_t i = 0; i < libDesc.FunctionCount; ++i) + { + auto &target = result.properties[i]; + auto info = libInfo->GetFunctionByIndex(i); + + D3D12_FUNCTION_DESC functionDesc{}; + info->GetDesc(&functionDesc); + + auto functionName = get_function_name(functionDesc); + if (functionName.empty()) + { + result.logMessage += "Unable to obtain function name from mangled name "; + result.logMessage += functionDesc.Name; + result.isOk = false; + continue; + } + result.names[i] = functionName; + + auto relfectionResult = + relfect(default_playload_size_in_bytes, function_extra_data_query, *info, result.libInfo, result.properties[i]); + if (ShaderFunctionRelfectionError::NoError != relfectionResult) + { + result.isOk = false; + result.logMessage += "Error while reflecting function "; + result.logMessage += functionDesc.Name; + result.logMessage += ": "; + append_to_log(result.logMessage, relfectionResult); + continue; + } + } + + return result; +} diff --git a/prog/gameLibs/ecs/debug/ecsDebug.cpp.gen.es.cpp b/prog/gameLibs/ecs/debug/ecsDebug.cpp.gen.es.cpp index f9b9a254d..6578f5516 100644 --- a/prog/gameLibs/ecs/debug/ecsDebug.cpp.gen.es.cpp +++ b/prog/gameLibs/ecs/debug/ecsDebug.cpp.gen.es.cpp @@ -22,91 +22,94 @@ static ecs::EntitySystemDesc ecs_debug_entity_clear_es_es_desc ecs::EventEntityManagerBeforeClear>::build(), 0 ,"ecsDebug",nullptr,"__first_sync_point"); -static constexpr ecs::ComponentDesc ecs_debug_entity_created_es_event_handler_comps[] = +static constexpr ecs::ComponentDesc ecs_debug_entity_created_es_comps[] = { -//start of 3 ro components at [0] +//start of 4 ro components at [0] {ECS_HASH("eid"), ecs::ComponentTypeInfo()}, {ECS_HASH("transform"), ecs::ComponentTypeInfo(), ecs::CDF_OPTIONAL}, {ECS_HASH("position"), ecs::ComponentTypeInfo(), ecs::CDF_OPTIONAL}, -//start of 1 no components at [3] - {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo()} + {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo(), ecs::CDF_OPTIONAL} }; -static void ecs_debug_entity_created_es_event_handler_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) +static void ecs_debug_entity_created_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) { G_FAST_ASSERT(evt.is()); auto comp = components.begin(), compE = components.end(); G_ASSERT(comp!=compE); do - ecs_debug_entity_created_es_event_handler(static_cast(evt) - , ECS_RO_COMP(ecs_debug_entity_created_es_event_handler_comps, "eid", ecs::EntityId) - , ECS_RO_COMP_PTR(ecs_debug_entity_created_es_event_handler_comps, "transform", TMatrix) - , ECS_RO_COMP_PTR(ecs_debug_entity_created_es_event_handler_comps, "position", Point3) + ecs_debug_entity_created_es(static_cast(evt) + , components.manager() + , ECS_RO_COMP(ecs_debug_entity_created_es_comps, "eid", ecs::EntityId) + , ECS_RO_COMP_PTR(ecs_debug_entity_created_es_comps, "transform", TMatrix) + , ECS_RO_COMP_PTR(ecs_debug_entity_created_es_comps, "position", Point3) + , ECS_RO_COMP_PTR(ecs_debug_entity_created_es_comps, "noECSDebug", ecs::Tag) ); while (++comp != compE); } -static ecs::EntitySystemDesc ecs_debug_entity_created_es_event_handler_es_desc +static ecs::EntitySystemDesc ecs_debug_entity_created_es_es_desc ( "ecs_debug_entity_created_es", "prog/gameLibs/ecs/debug/ecsDebug.cpp.inl", - ecs::EntitySystemOps(nullptr, ecs_debug_entity_created_es_event_handler_all_events), + ecs::EntitySystemOps(nullptr, ecs_debug_entity_created_es_all_events), + empty_span(), + make_span(ecs_debug_entity_created_es_comps+0, 4)/*ro*/, empty_span(), - make_span(ecs_debug_entity_created_es_event_handler_comps+0, 3)/*ro*/, empty_span(), - make_span(ecs_debug_entity_created_es_event_handler_comps+3, 1)/*no*/, ecs::EventSetBuilder::build(), 0 ,"ecsDebug",nullptr,"__first_sync_point"); -static constexpr ecs::ComponentDesc ecs_debug_entity_recreated_es_event_handler_comps[] = +static constexpr ecs::ComponentDesc ecs_debug_entity_recreated_es_comps[] = { -//start of 1 ro components at [0] +//start of 2 ro components at [0] {ECS_HASH("eid"), ecs::ComponentTypeInfo()}, -//start of 1 no components at [1] - {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo()} + {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo(), ecs::CDF_OPTIONAL} }; -static void ecs_debug_entity_recreated_es_event_handler_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) +static void ecs_debug_entity_recreated_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) { G_FAST_ASSERT(evt.is()); auto comp = components.begin(), compE = components.end(); G_ASSERT(comp!=compE); do - ecs_debug_entity_recreated_es_event_handler(static_cast(evt) - , ECS_RO_COMP(ecs_debug_entity_recreated_es_event_handler_comps, "eid", ecs::EntityId) + ecs_debug_entity_recreated_es(static_cast(evt) + , components.manager() + , ECS_RO_COMP(ecs_debug_entity_recreated_es_comps, "eid", ecs::EntityId) + , ECS_RO_COMP_PTR(ecs_debug_entity_recreated_es_comps, "noECSDebug", ecs::Tag) ); while (++comp != compE); } -static ecs::EntitySystemDesc ecs_debug_entity_recreated_es_event_handler_es_desc +static ecs::EntitySystemDesc ecs_debug_entity_recreated_es_es_desc ( "ecs_debug_entity_recreated_es", "prog/gameLibs/ecs/debug/ecsDebug.cpp.inl", - ecs::EntitySystemOps(nullptr, ecs_debug_entity_recreated_es_event_handler_all_events), + ecs::EntitySystemOps(nullptr, ecs_debug_entity_recreated_es_all_events), + empty_span(), + make_span(ecs_debug_entity_recreated_es_comps+0, 2)/*ro*/, empty_span(), - make_span(ecs_debug_entity_recreated_es_event_handler_comps+0, 1)/*ro*/, empty_span(), - make_span(ecs_debug_entity_recreated_es_event_handler_comps+1, 1)/*no*/, ecs::EventSetBuilder::build(), 0 ,"ecsDebug",nullptr,"__first_sync_point"); -static constexpr ecs::ComponentDesc ecs_debug_entity_destroyed_es_event_handler_comps[] = +static constexpr ecs::ComponentDesc ecs_debug_entity_destroyed_es_comps[] = { -//start of 1 ro components at [0] +//start of 2 ro components at [0] {ECS_HASH("eid"), ecs::ComponentTypeInfo()}, -//start of 1 no components at [1] - {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo()} + {ECS_HASH("noECSDebug"), ecs::ComponentTypeInfo(), ecs::CDF_OPTIONAL} }; -static void ecs_debug_entity_destroyed_es_event_handler_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) +static void ecs_debug_entity_destroyed_es_all_events(const ecs::Event &__restrict evt, const ecs::QueryView &__restrict components) { G_FAST_ASSERT(evt.is()); auto comp = components.begin(), compE = components.end(); G_ASSERT(comp!=compE); do - ecs_debug_entity_destroyed_es_event_handler(static_cast(evt) - , ECS_RO_COMP(ecs_debug_entity_destroyed_es_event_handler_comps, "eid", ecs::EntityId) + ecs_debug_entity_destroyed_es(static_cast(evt) + , components.manager() + , ECS_RO_COMP(ecs_debug_entity_destroyed_es_comps, "eid", ecs::EntityId) + , ECS_RO_COMP_PTR(ecs_debug_entity_destroyed_es_comps, "noECSDebug", ecs::Tag) ); while (++comp != compE); } -static ecs::EntitySystemDesc ecs_debug_entity_destroyed_es_event_handler_es_desc +static ecs::EntitySystemDesc ecs_debug_entity_destroyed_es_es_desc ( "ecs_debug_entity_destroyed_es", "prog/gameLibs/ecs/debug/ecsDebug.cpp.inl", - ecs::EntitySystemOps(nullptr, ecs_debug_entity_destroyed_es_event_handler_all_events), + ecs::EntitySystemOps(nullptr, ecs_debug_entity_destroyed_es_all_events), + empty_span(), + make_span(ecs_debug_entity_destroyed_es_comps+0, 2)/*ro*/, empty_span(), - make_span(ecs_debug_entity_destroyed_es_event_handler_comps+0, 1)/*ro*/, empty_span(), - make_span(ecs_debug_entity_destroyed_es_event_handler_comps+1, 1)/*no*/, ecs::EventSetBuilder::build(), 0 ,"ecsDebug",nullptr,"__first_sync_point"); diff --git a/prog/gameLibs/ecs/debug/ecsDebug.cpp.inl b/prog/gameLibs/ecs/debug/ecsDebug.cpp.inl index 53bc7ac9f..42cf5d778 100644 --- a/prog/gameLibs/ecs/debug/ecsDebug.cpp.inl +++ b/prog/gameLibs/ecs/debug/ecsDebug.cpp.inl @@ -4,43 +4,62 @@ #include #include #include +#include +#include #define debug(...) logmessage(_MAKE4C('ECS '), __VA_ARGS__) ECS_DEF_PULL_VAR(ecs_debug); static bool should_log_destroy = true; +static int8_t force_ecs_debug_state = -1; +static inline bool force_ecs_debug() +{ + if (DAGOR_UNLIKELY(force_ecs_debug_state < 0)) + force_ecs_debug_state = dgs_get_settings()->getBool("forceEcsDebug", false); + return force_ecs_debug_state > 0; +} ECS_TAG(ecsDebug) ECS_BEFORE(__first_sync_point) ECS_ON_EVENT(ecs::EventEntityManagerBeforeClear, ecs::EventEntityManagerAfterClear) -static inline void ecs_debug_entity_clear_es(const ecs::Event &e) { should_log_destroy = e.is(); } +static inline void ecs_debug_entity_clear_es(const ecs::Event &evt) +{ + // Do not log destroy on Emgr's clear + should_log_destroy = evt.is(); +} ECS_TAG(ecsDebug) ECS_BEFORE(__first_sync_point) -ECS_REQUIRE_NOT(ecs::Tag noECSDebug) -static inline void ecs_debug_entity_created_es_event_handler(const ecs::EventEntityCreated &, ecs::EntityId eid, - const TMatrix *transform, const Point3 *position) +static inline void ecs_debug_entity_created_es(const ecs::EventEntityCreated &, ecs::EntityManager &manager, ecs::EntityId eid, + const TMatrix *transform, const Point3 *position, const ecs::Tag *noECSDebug) { - if (const Point3 *pos = transform ? &transform->getcol(3) : position) - debug("%d: created <%s> at %@", ecs::entity_id_t(eid), g_entity_mgr->getEntityTemplateName(eid), *pos); + if (noECSDebug && !force_ecs_debug()) + ; // no-op + else if (const Point3 *pos = transform ? &transform->getcol(3) : position) + debug("%d: created <%s> at %@", ecs::entity_id_t(eid), manager.getEntityTemplateName(eid), *pos); else - debug("%d: created <%s>", ecs::entity_id_t(eid), g_entity_mgr->getEntityTemplateName(eid)); + debug("%d: created <%s>", ecs::entity_id_t(eid), manager.getEntityTemplateName(eid)); } ECS_TAG(ecsDebug) ECS_BEFORE(__first_sync_point) -ECS_REQUIRE_NOT(ecs::Tag noECSDebug) -static inline void ecs_debug_entity_recreated_es_event_handler(const ecs::EventEntityRecreated &, ecs::EntityId eid) +static inline void ecs_debug_entity_recreated_es(const ecs::EventEntityRecreated &, ecs::EntityManager &manager, ecs::EntityId eid, + const ecs::Tag *noECSDebug) { - debug("%d: recreated as <%s>", ecs::entity_id_t(eid), g_entity_mgr->getEntityTemplateName(eid)); + if (noECSDebug && !force_ecs_debug()) + ; // no-op + else + debug("%d: recreated as <%s>", ecs::entity_id_t(eid), manager.getEntityTemplateName(eid)); } ECS_TAG(ecsDebug) ECS_BEFORE(__first_sync_point) -ECS_REQUIRE_NOT(ecs::Tag noECSDebug) -static void inline ecs_debug_entity_destroyed_es_event_handler(const ecs::EventEntityDestroyed &, ecs::EntityId eid) +static inline void ecs_debug_entity_destroyed_es(const ecs::EventEntityDestroyed &, ecs::EntityManager &manager, ecs::EntityId eid, + const ecs::Tag *noECSDebug) { - if (should_log_destroy) - debug("%d: destroyed <%s>", ecs::entity_id_t(eid), g_entity_mgr->getEntityTemplateName(eid)); + if (noECSDebug && !force_ecs_debug()) + ; // no-op + else if (should_log_destroy) + debug("%d: destroyed <%s>", ecs::entity_id_t(eid), manager.getEntityTemplateName(eid)); } diff --git a/prog/gameLibs/ecs/game/generic/keyTrackAnimES.cpp.inl b/prog/gameLibs/ecs/game/generic/keyTrackAnimES.cpp.inl index 15756c547..a1dff715e 100644 --- a/prog/gameLibs/ecs/game/generic/keyTrackAnimES.cpp.inl +++ b/prog/gameLibs/ecs/game/generic/keyTrackAnimES.cpp.inl @@ -233,35 +233,35 @@ __forceinline void add_key(const Key &key, float time, bool isAdditional, T &tra track.insertKey(key, time + (isAdditional ? track.getLastTime() : 0)); } -inline void key_track_change_anim_es_event_handler(const CmdResetPosAnim &evt, AnimKeyTrackTransform &anim_key_track, +inline void key_track_change_anim_es_event_handler(const key_track_anim::CmdResetPosAnim &evt, AnimKeyTrackTransform &anim_key_track, bool &anim_track_on) { reset_anim(evt.get<0>(), evt.get<1>(), evt.get<2>(), anim_key_track.pos); anim_track_on = true; } -inline void key_track_change_anim_es_event_handler(const CmdResetRotAnim &evt, AnimKeyTrackTransform &anim_key_track, +inline void key_track_change_anim_es_event_handler(const key_track_anim::CmdResetRotAnim &evt, AnimKeyTrackTransform &anim_key_track, bool &anim_track_on) { reset_anim(v_ldu(&evt.get<0>().x), evt.get<1>(), evt.get<2>(), anim_key_track.rot); anim_track_on = true; } -inline void key_track_change_anim_es_event_handler(const CmdAddPosAnim &evt, AnimKeyTrackTransform &anim_key_track, +inline void key_track_change_anim_es_event_handler(const key_track_anim::CmdAddPosAnim &evt, AnimKeyTrackTransform &anim_key_track, bool &anim_track_on) { add_key(evt.get<0>(), evt.get<1>(), evt.get<2>(), anim_key_track.pos); anim_track_on = true; } -inline void key_track_change_anim_es_event_handler(const CmdAddRotAnim &evt, AnimKeyTrackTransform &anim_key_track, +inline void key_track_change_anim_es_event_handler(const key_track_anim::CmdAddRotAnim &evt, AnimKeyTrackTransform &anim_key_track, bool &anim_track_on) { add_key(v_ldu(&evt.get<0>().x), evt.get<1>(), evt.get<2>(), anim_key_track.rot); anim_track_on = true; } -inline void key_track_change_anim_es_event_handler(const CmdStopAnim &, bool &anim_track_on) { anim_track_on = false; } +inline void key_track_change_anim_es_event_handler(const key_track_anim::CmdStopAnim &, bool &anim_track_on) { anim_track_on = false; } template struct AttrKeyTrack @@ -300,7 +300,7 @@ static __forceinline void attr_float_track_anim_es(const ecs::UpdateStageInfoAct anim_float_attr.animate(info, eid); } -inline void attr_float_key_track_change_anim_es_event_handler(const CmdResetAttrFloatAnim &evt, ecs::EntityId eid, +inline void attr_float_key_track_change_anim_es_event_handler(const key_track_anim::CmdResetAttrFloatAnim &evt, ecs::EntityId eid, AttrAnimKeyTrackFloat &anim_float_attr) { anim_float_attr.setName(evt.get<0>()); @@ -311,7 +311,7 @@ inline void attr_float_key_track_change_anim_es_event_handler(const CmdResetAttr } } -inline void attr_float_key_track_change_anim_es_event_handler(const CmdAddAttrFloatAnim &evt, ecs::EntityId eid, +inline void attr_float_key_track_change_anim_es_event_handler(const key_track_anim::CmdAddAttrFloatAnim &evt, ecs::EntityId eid, AttrAnimKeyTrackFloat &anim_float_attr) { if (g_entity_mgr->is(eid, anim_float_attr.getCompName())) // we assume component can be removed. May be better listen for diff --git a/prog/gameLibs/ecs/phys/animCharFastPhysES.cpp.inl b/prog/gameLibs/ecs/phys/animCharFastPhysES.cpp.inl index 53916db48..67a27e4ef 100644 --- a/prog/gameLibs/ecs/phys/animCharFastPhysES.cpp.inl +++ b/prog/gameLibs/ecs/phys/animCharFastPhysES.cpp.inl @@ -74,7 +74,7 @@ ECS_AUTO_REGISTER_COMPONENT_DEPS(FastPhysTag, "animchar_fast_phys", nullptr, 0, ECS_ON_EVENT(on_appear) // todo: add wind change event, if happen ECS_REQUIRE(FastPhysTag animchar_fast_phys) -static inline void animchar_fast_phys_es_event_handler(const ecs::Event &, AnimcharBaseComponent &animchar) +static inline void animchar_fast_phys_es_event_handler(const ecs::Event &, AnimV20::AnimcharBaseComponent &animchar) { if (!animchar.getFastPhysSystem()) return; @@ -88,7 +88,7 @@ static inline void animchar_fast_phys_es_event_handler(const ecs::Event &, Animc ECS_REQUIRE(FastPhysTag animchar_fast_phys) ECS_ON_EVENT(on_disappear) -static void animchar_fast_phys_destroy_es_event_handler(const ecs::Event &, AnimcharBaseComponent &animchar) +static void animchar_fast_phys_destroy_es_event_handler(const ecs::Event &, AnimV20::AnimcharBaseComponent &animchar) { if (FastPhysSystem *fastPhys = animchar.getFastPhysSystem()) { @@ -172,7 +172,7 @@ static void resetDebugAnimChars() ECS_NO_ORDER ECS_REQUIRE(FastPhysTag animchar_fast_phys, ecs::Tag animchar_fast_phys_debug_render) ECS_TAG(dev, render) -static void debug_draw_fast_phys_es(const UpdateStageInfoRenderDebug &, AnimcharBaseComponent &animchar) +static void debug_draw_fast_phys_es(const UpdateStageInfoRenderDebug &, AnimV20::AnimcharBaseComponent &animchar) { FastPhysSystem *fastPhys = animchar.getFastPhysSystem(); if (!fastPhys) diff --git a/prog/gameLibs/ecs/rendInst/rendinstES.cpp.gen.es.cpp b/prog/gameLibs/ecs/rendInst/rendinstES.cpp.gen.es.cpp index eaa6d8821..11da614e4 100644 --- a/prog/gameLibs/ecs/rendInst/rendinstES.cpp.gen.es.cpp +++ b/prog/gameLibs/ecs/rendInst/rendinstES.cpp.gen.es.cpp @@ -2,6 +2,37 @@ ECS_DEF_PULL_VAR(rendinst); //built with ECS codegen version 1.0 #include +static constexpr ecs::ComponentDesc rendinst_ruler_es_comps[] = +{ +//start of 2 ro components at [0] + {ECS_HASH("transform"), ecs::ComponentTypeInfo()}, + {ECS_HASH("camera__active"), ecs::ComponentTypeInfo()} +}; +static void rendinst_ruler_es_all(const ecs::UpdateStageInfo &__restrict info, const ecs::QueryView & __restrict components) +{ + auto comp = components.begin(), compE = components.end(); G_ASSERT(comp!=compE); + do + { + if ( !(ECS_RO_COMP(rendinst_ruler_es_comps, "camera__active", bool)) ) + continue; + rendinst_ruler_es(*info.cast() + , ECS_RO_COMP(rendinst_ruler_es_comps, "transform", TMatrix) + ); + } + while (++comp != compE); +} +static ecs::EntitySystemDesc rendinst_ruler_es_es_desc +( + "rendinst_ruler_es", + "prog/gameLibs/ecs/rendInst/./rendinstES.cpp.inl", + ecs::EntitySystemOps(rendinst_ruler_es_all), + empty_span(), + make_span(rendinst_ruler_es_comps+0, 2)/*ro*/, + empty_span(), + empty_span(), + ecs::EventSetBuilder<>::build(), + (1< #include #include +#include #include #include #include @@ -38,6 +39,7 @@ ECS_REGISTER_EVENT(EventRendinstImpulse); ECS_REGISTER_EVENT(EventOnRendinstDamage); static CONSOLE_BOOL_VAL("rendinst", debug_movement, false); +static CONSOLE_BOOL_VAL("rendinst", ruler, false); static CONSOLE_BOOL_VAL("rigrid", debug_draw, false); static const bbox3f RENDINST_WORLD_BBOX = {v_make_vec4f(-1e4f, -1e4f, -1e4f, 0.f), v_make_vec4f(1e4f, 1e4f, 1e4f, 0.f)}; @@ -550,6 +552,20 @@ bool replace_ri_extra_res(ecs::EntityId eid, const char *res_name, bool destroy, return riExtra->handle != rendinst::RIEX_HANDLE_NULL; } +ECS_NO_ORDER +ECS_TAG(render, dev) +ECS_REQUIRE(eastl::true_type camera__active) +static void rendinst_ruler_es(const ecs::UpdateStageInfoRenderDebug &, const TMatrix &transform) +{ + if (!ruler.get()) + return; + + float t = 1000.f; + rendinst::RendInstDesc traceDesc; + dacoll::traceray_normalized(transform.getcol(3), transform.getcol(2), t, nullptr, nullptr, dacoll::ETF_DEFAULT, &traceDesc); + rendinst::draw_rendinst_info(transform.getcol(3) + transform.getcol(2) * t, transform, traceDesc); +} + ECS_NO_ORDER ECS_TAG(render, dev) ECS_REQUIRE(eastl::true_type camera__active) diff --git a/prog/gameLibs/ecs/terraform/terraform.cpp b/prog/gameLibs/ecs/terraform/terraform.cpp index 2e1980d9a..4fb400ff3 100644 --- a/prog/gameLibs/ecs/terraform/terraform.cpp +++ b/prog/gameLibs/ecs/terraform/terraform.cpp @@ -9,7 +9,7 @@ #include #include -struct TerraformSerializer final : public ecs::ComponentSerializer +static struct TerraformSerializer final : public ecs::ComponentSerializer { void serialize(ecs::SerializerCb &cb, const void *data, size_t, ecs::component_type_t hint) override { @@ -44,7 +44,7 @@ struct TerraformSerializer final : public ecs::ComponentSerializer } } terraform_serializer; -struct TerraformConstruct : public TerraformComponent +struct TerraformConstruct final : public TerraformComponent { bool operator==(const TerraformConstruct &rhs) const { return isEqual(rhs); } diff --git a/prog/gameLibs/gamePhys/collision/rendinst/rendinstCollisionUserInfo.cpp b/prog/gameLibs/gamePhys/collision/rendinst/rendinstCollisionUserInfo.cpp index 781d079b6..1b8d199a0 100644 --- a/prog/gameLibs/gamePhys/collision/rendinst/rendinstCollisionUserInfo.cpp +++ b/prog/gameLibs/gamePhys/collision/rendinst/rendinstCollisionUserInfo.cpp @@ -80,7 +80,7 @@ RendinstCollisionUserInfo::TreeRendinstImpulseThresholdData::~TreeRendinstImpuls { const rendinstdestr::TreeDestr &treeDestr = rendinstdestr::get_tree_destr(); rendinstdestr::create_tree_rend_inst_destr(riDesc, true, finalPos, finalImpulse, true, lastPointVel < treeDestr.minSpeed, - lastOmega, atTime, &collInfo, true); + lastOmega, atTime, &collInfo, true, false); } } diff --git a/prog/gameLibs/gamePhys/collision/rendinst/rendinstContactResultWrapper.cpp b/prog/gameLibs/gamePhys/collision/rendinst/rendinstContactResultWrapper.cpp index 3babc333a..d4fa6e322 100644 --- a/prog/gameLibs/gamePhys/collision/rendinst/rendinstContactResultWrapper.cpp +++ b/prog/gameLibs/gamePhys/collision/rendinst/rendinstContactResultWrapper.cpp @@ -32,7 +32,7 @@ void WrapperRendinstContactResultCB::addSingleResult(contact_data_t &cp, obj_use if (!forceTreeBehaviour && (isSecondLayer || isSmallTree || forceBushBehaviour) && processTreeBehaviour) { rendinstdestr::create_tree_rend_inst_destr(userInfo->desc, true, Point3(0.f, 0.f, 0.f), Point3(0.f, 0.f, 0.f), false, false, 0.f, - 0.f, NULL, true); + 0.f, NULL, true, false); } else { diff --git a/prog/gameLibs/gamePhys/phys/destrRender/destructablesRender.cpp b/prog/gameLibs/gamePhys/phys/destrRender/destructablesRender.cpp index 413e2d4a7..8f1cf5049 100644 --- a/prog/gameLibs/gamePhys/phys/destrRender/destructablesRender.cpp +++ b/prog/gameLibs/gamePhys/phys/destrRender/destructablesRender.cpp @@ -99,7 +99,7 @@ void destructables::render(dynrend::ContextId inst_ctx, const Frustum &frustum, } } -destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *phys_obj) +destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *phys_obj, bool is_fully_deformed) { DestrRendData *rdata = new DestrRendData(); clear_and_resize(rdata->rendData, phys_obj->getModelCount()); @@ -112,7 +112,7 @@ destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectCla } // TODO: pass true to a sec arg if it needs to be fully deformed (i.e. - by explosion) - rdata->deformationId = deform_create_instance_cb ? deform_create_instance_cb(rdata, false) : -1; + rdata->deformationId = deform_create_instance_cb ? deform_create_instance_cb(rdata, is_fully_deformed) : -1; return rdata; } diff --git a/prog/gameLibs/gamePhys/phys/destrRenderStub/destructablesStub.cpp b/prog/gameLibs/gamePhys/phys/destrRenderStub/destructablesStub.cpp index 32b1fba0e..095843a46 100644 --- a/prog/gameLibs/gamePhys/phys/destrRenderStub/destructablesStub.cpp +++ b/prog/gameLibs/gamePhys/phys/destrRenderStub/destructablesStub.cpp @@ -6,7 +6,7 @@ #include void destructables::DestrRendDataDeleter::operator()(destructables::DestrRendData *) {} -destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *) { return nullptr; } +destructables::DestrRendData *destructables::init_rend_data(DynamicPhysObjectClass *, bool) { return nullptr; } void destructables::clear_rend_data(destructables::DestrRendData *) {} void destructables::before_render(const Point3 &, bool) {} void destructables::render(dynrend::ContextId, const Frustum &, float) {} diff --git a/prog/gameLibs/gamePhys/phys/destructableObject.cpp b/prog/gameLibs/gamePhys/phys/destructableObject.cpp index 710f33ac8..2cada0578 100644 --- a/prog/gameLibs/gamePhys/phys/destructableObject.cpp +++ b/prog/gameLibs/gamePhys/phys/destructableObject.cpp @@ -52,10 +52,11 @@ DestructableObject::DestructableObject(const destructables::DestructableCreation defaultTimeToLive = params.defaultTimeToLive; if (params.timeToKinematic >= 0.0f) timeToKinematic = params.timeToKinematic; + clear_and_resize(ttlBodies, physObj->getPhysSys()->getBodyCount()); for (int i = 0; i < ttlBodies.size(); ++i) ttlBodies[i] = defaultTimeToLive; - rendData.reset(destructables::init_rend_data(physObj.get())); + rendData.reset(destructables::init_rend_data(physObj.get(), params.isDestroyedByExplosion)); } int DestructableObject::getNumActiveBodies() const { return ttlBodies.size(); } @@ -239,7 +240,13 @@ static float distForScaleDtSq; static float maxScaleDt; float minDestrRadiusSq; static float overflowReportTimeout = 0.0f; -static bool errorOnBodiesOverflow = true; +#if DAGOR_DBGLEVEL > 0 +static bool errorOnBodiesOverflow = false; +static unsigned minBodyCountForOverflowError = 10; +#else +static constexpr bool errorOnBodiesOverflow = false; +static constexpr unsigned minBodyCountForOverflowError = ~0u; +#endif void init(const DataBlock *blk, int fgroup) { @@ -249,7 +256,10 @@ void init(const DataBlock *blk, int fgroup) distForScaleDtSq = sqr(destrBlk->getReal("distForScaleDt", 100.f)); maxScaleDt = destrBlk->getReal("maxScaleDt", 3.f); minDestrRadiusSq = sqr(destrBlk->getReal("minDestrRadius", 40.f)); - errorOnBodiesOverflow = destrBlk->getBool("errorOnBodiesOverflow", true); +#if DAGOR_DBGLEVEL > 0 + errorOnBodiesOverflow = destrBlk->getBool("errorOnBodiesOverflow", false); + minBodyCountForOverflowError = destrBlk->getInt("minBodyCountForOverflowError", 10); +#endif default_fgroup = fgroup; if (!destructablesListAllocator.isInited()) destructablesListAllocator.init(sizeof(DestructableObject), (4096 * 2 - 16) / sizeof(DestructableObject)); @@ -312,26 +322,16 @@ void removeDestructableById(id_t id) static_cast(id)->markForDelete(); } -void overflowHandler() +static void overflow_handler() { - String msg(framemem_ptr()); - msg.printf(0, "destructables::update: too many destructable bodies %d, max - %d", numActiveBodies, maxNumberOfDestructableBodies); - -#if DAGOR_DBGLEVEL > 0 - const bool forceErrorOnOverflow = errorOnBodiesOverflow; -#else - const bool forceErrorOnOverflow = false; -#endif - - if (!forceErrorOnOverflow) + if (!errorOnBodiesOverflow || destructablesList.size() > minBodyCountForOverflowError) //-V560 { - logwarn(msg.c_str()); + logwarn("destructables::update: too many destructable bodies %d, max - %d", numActiveBodies, maxNumberOfDestructableBodies); return; } - #if DAGOR_DBGLEVEL > 0 - String fullMsg(framemem_ptr()); - fullMsg.append(msg); + String msg(framemem_ptr()); + msg.printf(0, "destructables::update: too many destructable bodies %d, max - %d", numActiveBodies, maxNumberOfDestructableBodies); for (const auto &i : destructablesList) { const auto *physObj = i->getPhysObj(); @@ -346,10 +346,10 @@ void overflowHandler() String resMsg(framemem_ptr()); resolve_game_resource_name(name, lods); resMsg.printf(0, "\n res: %s, active bodies: %d", name.c_str(), i->getNumActiveBodies()); - fullMsg.append(resMsg); + msg.append(resMsg); } } - logerr(fullMsg.c_str()); + logerr("%s", msg.c_str()); #endif } @@ -382,7 +382,7 @@ void update(float dt) if (overflowReportTimeout <= 0.0f) { overflowReportTimeout = 1.0f; - overflowHandler(); + overflow_handler(); } // Cleanup first those bodies that are falling through, then all old ones diff --git a/prog/gameLibs/gamePhys/phys/rendinstDestr.cpp b/prog/gameLibs/gamePhys/phys/rendinstDestr.cpp index 7595d2033..5fa2bd09d 100644 --- a/prog/gameLibs/gamePhys/phys/rendinstDestr.cpp +++ b/prog/gameLibs/gamePhys/phys/rendinstDestr.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -288,7 +289,8 @@ void rendinstdestr::init_ex(rendinstdestr::on_destr_changed_callback on_destr_cb get_current_camera_pos = get_current_camera_pos_; rendinst::registerRIGenExtraInvalidateHandleCb(invalidate_handle_cb); rendinst::do_delayed_ri_extra_destruction = do_delayed_ri_extra_destruction_impl; - debugTreeInstData.branchDestr = get_tree_destr().branchDestr; + debugTreeInstData.branchDestrFromDamage = get_tree_destr().branchDestrFromDamage; + debugTreeInstData.branchDestrOther = get_tree_destr().branchDestrOther; } void rendinstdestr::init(rendinstdestr::on_destr_changed_callback on_destr_cb, bool apply_pending, @@ -308,7 +310,8 @@ void rendinstdestr::init(rendinstdestr::on_destr_changed_callback on_destr_cb, b apex_force_remove_actor_cb = nullptr; get_current_camera_pos = get_camera_pos_cb; - debugTreeInstData.branchDestr = get_tree_destr().branchDestr; + debugTreeInstData.branchDestrFromDamage = get_tree_destr().branchDestrFromDamage; + debugTreeInstData.branchDestrOther = get_tree_destr().branchDestrOther; } @@ -447,7 +450,7 @@ static void findRendinstNeighbors(rendinst::RendInstDesc desc, int destroy_neigh void rendinstdestr::fill_ri_destructable_params(destructables::DestructableCreationParams ¶ms, const rendinst::RendInstDesc &desc, - DynamicPhysObjectData *po_data, const TMatrix &tm) + DynamicPhysObjectData *po_data, const TMatrix &tm, rendinst::DestrOptionFlags flags) { params.physObjData = po_data; params.tm = tm; @@ -459,6 +462,7 @@ void rendinstdestr::fill_ri_destructable_params(destructables::DestructableCreat params.timeToLive = riexHandle != rendinst::RIEX_HANDLE_NULL ? rendinst::get_riextra_destr_time_to_live(riexHandle) : 15.0f; params.timeToKinematic = riexHandle != rendinst::RIEX_HANDLE_NULL ? rendinst::get_riextra_destr_time_to_kinematic(riexHandle) : -1.0f; + params.isDestroyedByExplosion = bool(flags & rendinst::DestrOptionFlag::DestroyedByExplosion); } static rendinst::RendInstDesc destroyRendinstInternal(rendinst::RendInstDesc desc, bool add_restorable, const Point3 &pos, @@ -565,15 +569,15 @@ static rendinst::RendInstDesc destroyRendinstInternal(rendinst::RendInstDesc des rendinstdestr::call_on_rendinst_destroyed_cb(desc.getRiExtraHandle(), mainTm, bbox); destructables::id_t destrId = destructables::INVALID_ID; - if (!apex_asset_created && poData && create_destr_effects) //-V560 + if (!apex_asset_created && poData && create_destr_effects && rendinstdestr::get_destr_settings().createDestr) //-V560 { destructables::DestructableCreationParams params; - rendinstdestr::fill_ri_destructable_params(params, desc, poData, mainTm); + rendinstdestr::fill_ri_destructable_params(params, desc, poData, mainTm, flags); gamephys::DestructableObject *destr = nullptr; destrId = destructables::addDestructable(&destr, params, phys_world); if (destr) //-V1051 { - if (impulse != ZERO()) + if (impulse.lengthSq() > 0.f) destr->addImpulse(*phys_world, pos, impulse); } } @@ -670,15 +674,16 @@ rendinst::RendInstDesc rendinstdestr::destroyRendinst(rendinst::RendInstDesc des } void rendinstdestr::destroyRiExtra(rendinst::riex_handle_t riex_handle, const TMatrix &transform, const Point3 &impulse, - const Point3 &impulse_pos) + const Point3 &impulse_pos, rendinst::DestrOptionFlags flags) { - if (DynamicPhysObjectData *poData = rendinst::doRIExGenDestrEx(riex_handle, ri_effect_cb)) + if (DynamicPhysObjectData *poData = rendinst::doRIExGenDestrEx(riex_handle, ri_effect_cb); + poData != nullptr && rendinstdestr::get_destr_settings().createDestr) { destructables::DestructableCreationParams params; - fill_ri_destructable_params(params, rendinst::RendInstDesc(riex_handle), poData, transform); + fill_ri_destructable_params(params, rendinst::RendInstDesc(riex_handle), poData, transform, flags); gamephys::DestructableObject *destr = nullptr; destructables::addDestructable(&destr, params, phys_world); - if (destr && impulse != ZERO()) + if (destr && impulse.lengthSq() > 0.f) { G_ASSERTF(lengthSq(impulse) < sqr(MAX_RI_DESTROY_IMPULSE), "Bad destroy rendInst impulse %@", impulse); destr->addImpulse(*phys_world, impulse_pos, impulse); @@ -686,6 +691,12 @@ void rendinstdestr::destroyRiExtra(rendinst::riex_handle_t riex_handle, const TM } } +void rendinstdestr::update_paused(const Frustum *frustum) +{ + if (useDebugTreeInstData) + update(0.f, frustum); +} + void rendinstdestr::update(float dt, const Frustum *frustum) { TIME_PROFILE(rendinstdestr_update); @@ -800,6 +811,7 @@ void rendinstdestr::update(float dt, const Frustum *frustum) del_it(phys.additionalBody); phys.ttl = 15.f; phys.maxTtl = 15.f; + phys.treeInstData.disappearStartTime = phys.treeInstData.timer; } else if (phys.physBody) { @@ -890,6 +902,11 @@ void rendinstdestr::update(float dt, const Frustum *frustum) if (!updateList.empty()) { TIME_PROFILE(rendinstDestrTmUpdate); + + vec3f frustumPoints[8]; + frustum->generateAllPointFrustm(frustumPoints); + Point3 nearPlaneCenter = (as_point3(&frustumPoints[2]) + as_point3(&frustumPoints[4])) * 0.5f; + rendinst::ScopedRIExtraWriteLock wr; for (int i = 0; i < updateList.size(); i++) { @@ -902,7 +919,8 @@ void rendinstdestr::update(float dt, const Frustum *frustum) v_mat44_transpose_to_mat43(m43, m44); rendinst::moveRIGenExtra43(l.id, m43, l.moved, true); - rendinst::updateTreeDestrRenderData(l.originalTm, l.id, l.treeInstData, useDebugTreeInstData ? &debugTreeInstData : nullptr); + if ((l.originalTm.col[3] - nearPlaneCenter).lengthSq() < sqr(l.treeInstData.branchDestr.maxVisibleDistance)) + rendinst::updateTreeDestrRenderData(l.originalTm, l.id, l.treeInstData, useDebugTreeInstData ? &debugTreeInstData : nullptr); } } } @@ -1182,7 +1200,7 @@ static bool destroy_rend_inst_from_net(rendinst::RendInstDesc &restorable_desc, { float s, c; sincos(angle, s, c); - create_tree_cb(restorable_desc, false, local_impulse_pos, Point3(c, 0.f, s), true, true, 0.5f, 0.f, NULL, create_destr); + create_tree_cb(restorable_desc, false, local_impulse_pos, Point3(c, 0.f, s), true, true, 0.5f, 0.f, NULL, create_destr, false); } } else @@ -1596,8 +1614,12 @@ static void do_delayed_ri_extra_destruction_impl() if (destrCnt > 0) debug("delayed rend inst net destr: version:%llu->%llu destroyed:%i pending:%i", g_delayed_net_destr_list.lastUpdatedWorldVersion, version, destrCnt, int(g_delayed_net_destr_list.list.size())); - g_delayed_net_destr_list.lastUpdatedWorldVersion = version; - g_delayed_net_destr_list.isForcedUpdatePending = false; + + { + rendinst::ScopedRIExtraReadLock riVersionLock; + g_delayed_net_destr_list.lastUpdatedWorldVersion = version; + g_delayed_net_destr_list.isForcedUpdatePending = false; + } } @@ -1994,7 +2016,7 @@ int rendinstdestr::test_dynobj_to_ri_phys_collision(const CollisionObject &coA, void rendinstdestr::create_tree_rend_inst_destr(const rendinst::RendInstDesc &desc, bool add_restorable, const Point3 &impactPos, const Point3 &_impulse, bool create_phys, bool constrained_phys, float wanted_omega, float at_time, - const rendinst::CollisionInfo *coll_info, bool create_destr) + const rendinst::CollisionInfo *coll_info, bool create_destr, bool from_damage) { G_UNUSED(impactPos); Point3 impulse = _impulse; @@ -2224,11 +2246,15 @@ void rendinstdestr::create_tree_rend_inst_destr(const rendinst::RendInstDesc &de if (!constrained_phys && (coll_info->destrFxId >= 0 || !coll_info->destrFxTemplate.empty()) && ri_effect_cb) ri_effect_cb(coll_info->destrFxId, TMatrix::IDENT, tm, coll_info->desc.pool, false, nullptr, coll_info->destrFxTemplate.c_str()); - if (treeDestr.branchDestr.enableBranchDestruction) + const rendinstdestr::TreeDestr::BranchDestr &branchDestr = + from_damage ? treeDestr.branchDestrFromDamage : treeDestr.branchDestrOther; + if (branchDestr.enableBranchDestruction) { - phys.treeInstData.branchDestr = treeDestr.branchDestr; - if (!rendinst::fillTreeInstData(desc, impulseDir * vel, phys.treeInstData)) + phys.treeInstData.branchDestr = branchDestr; + if (!rendinst::fillTreeInstData(desc, impulseDir * vel, from_damage, phys.treeInstData)) phys.treeInstData.branchDestr.enableBranchDestruction = false; + else + debugTreeInstData.last_object_was_from_damage = from_damage; } } else @@ -2258,9 +2284,16 @@ void rendinstdestr::perform_delayed_destruction(int quota_usec) TIME_PROFILE(doDeferredRiDestruction); const auto start_time = ref_time_ticks(); - if (g_delayed_net_destr_list.isForcedUpdatePending || - g_delayed_net_destr_list.lastUpdatedWorldVersion != rendinst::getRIExtraGlobalWorldVersion(true, false)) - do_delayed_ri_extra_destruction_impl(); // will set lastUpdatedWorldVersion and isForcedUpdatePending + if (!g_delayed_net_destr_list.list.empty()) + { + uint64_t riExtraGlobalVersion; + { + rendinst::ScopedRIExtraReadLock riVersionLock; + riExtraGlobalVersion = rendinst::getRIExtraGlobalWorldVersion(true, false); + } + if (g_delayed_net_destr_list.isForcedUpdatePending || g_delayed_net_destr_list.lastUpdatedWorldVersion != riExtraGlobalVersion) + do_delayed_ri_extra_destruction_impl(); // will set lastUpdatedWorldVersion and isForcedUpdatePending + } while (!g_deferred_ri_destr_list.list.empty()) { @@ -2398,12 +2431,18 @@ static void imguiWindow() { static bool isPlaying = false; - ImGui::Checkbox("Enable Branch Destruction", &get_tree_destr_mutable().branchDestr.enableBranchDestruction); + auto &globalBranchDestr = debugTreeInstData.last_object_was_from_damage ? get_tree_destr_mutable().branchDestrFromDamage + : get_tree_destr_mutable().branchDestrOther; + + rendinstdestr::TreeDestr::BranchDestr &branchDestr = + debugTreeInstData.last_object_was_from_damage ? debugTreeInstData.branchDestrFromDamage : debugTreeInstData.branchDestrOther; + + ImGui::Checkbox("Enable Branch Destruction", &globalBranchDestr.enableBranchDestruction); ImGui::Checkbox("Use Debug Values", &useDebugTreeInstData); if (ImGui::Button("Reset Debug Values")) { debugTreeInstData.timer_offset = 0.0f; - debugTreeInstData.branchDestr = get_tree_destr().branchDestr; + branchDestr = globalBranchDestr; } static float maxTime = 3.0f; @@ -2417,33 +2456,36 @@ static void imguiWindow() debugTreeInstData.timer_offset = 0.0f; } - rendinstdestr::TreeDestr::BranchDestr &branchDestr = debugTreeInstData.branchDestr; ImGui::SliderFloat("Timer Offset", &debugTreeInstData.timer_offset, -2.0f, maxTime, "%0.2f"); ImGui::SliderFloat("Timer Max (For Play)", &maxTime, 0.0, 15.0f, "%0.2f"); ImGui::Spacing(); ImGui::SliderFloat("Impulse Mul", &branchDestr.impulseMul, 0, 15.0f, "%0.2f"); - ImGui::SliderFloat("Impulse Threshold", &branchDestr.impulseMaxLength, 0, 1000.0f, "%0.1f", ImGuiSliderFlags_Logarithmic); - ImGui::SliderFloat("Branch Size Threshold", &branchDestr.branchSizeMax, 0, 50.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Impulse Min", &branchDestr.impulseMin, 0, 100.0f, "%0.1f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Impulse Max", &branchDestr.impulseMax, 0, 100.0f, "%0.1f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Start keeping bigger branches than", &branchDestr.branchSizeMin, 0, 100.0f, "%0.2f", + ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Keep all branches bigger than", &branchDestr.branchSizeMax, 0, 100.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Rotate Speed X", &branchDestr.rotateRandomSpeedMulX, 0, 10.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Rotate Speed Y", &branchDestr.rotateRandomSpeedMulY, 0, 10.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Rotate Speed Z", &branchDestr.rotateRandomSpeedMulZ, 0, 10.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); - ImGui::SliderFloat("Angle Spread", &branchDestr.rotateRandomAngleSpread, 0, 7.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Angle Spread", &branchDestr.rotateRandomAngleSpread, 0, 10.0f, "%0.2f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Branch Size Slow Down", &branchDestr.branchSizeSlowDown, 0, 1.0f, "%0.3f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Falling Speed", &branchDestr.fallingSpeedMul, 0, 2.0f, "%0.3f", ImGuiSliderFlags_Logarithmic); ImGui::SliderFloat("Falling Speed Rnd", &branchDestr.fallingSpeedRnd, 0, 1.0f, "%0.3f", ImGuiSliderFlags_Logarithmic); - ImGui::SliderFloat("Horizontal Speed", &branchDestr.horizontalSpeedMul, 0, 10.0f, "%0.3f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderFloat("Horizontal Speed", &branchDestr.horizontalSpeedMul, 0, 20.0f, "%0.3f", ImGuiSliderFlags_Logarithmic); - if (get_tree_destr().branchDestr.enableBranchDestruction) + float lastImpulse = -1.0f; + float chance = 0.0f; + if (riPhys.size()) { - for (int i = 0; i < riPhys.size(); ++i) - { - RendInstPhys &phys = riPhys[i]; - - rendinst::updateTreeDestrRenderData(phys.originalTm, phys.ri->riHandle, phys.treeInstData, - useDebugTreeInstData ? &debugTreeInstData : nullptr); - } + lastImpulse = riPhys[riPhys.size() - 1].treeInstData.impactXZ.length(); + chance = + clamp((lastImpulse - branchDestr.impulseMin) / max(branchDestr.impulseMax - branchDestr.impulseMin, 0.01f), 0.0f, 1.0f) * 100.0f; } + + ImGui::Text("Last impulse: %.2f. Chance: %.2f%% (%s)", lastImpulse, chance, + debugTreeInstData.last_object_was_from_damage ? "From damage" : "Non-damage"); } REGISTER_IMGUI_WINDOW("Render", "Tree Destruction", imguiWindow); diff --git a/prog/gameLibs/gamePhys/phys/walker/humanPhys.cpp b/prog/gameLibs/gamePhys/phys/walker/humanPhys.cpp index b0e519186..971b4c51b 100644 --- a/prog/gameLibs/gamePhys/phys/walker/humanPhys.cpp +++ b/prog/gameLibs/gamePhys/phys/walker/humanPhys.cpp @@ -2495,19 +2495,22 @@ void HumanPhys::updatePhys(float at_time, float dt, bool /*is_for_real*/) // So recalc all relative things into their absolute versions, change vertDir and recalc relative things back Point3 vertBefore = currentState.vertDirection; Point3 rootBefore = get_some_normal(currentState.vertDirection); - Point3 sideDirBefore = normalize(cross(currentState.vertDirection, rootBefore)); + Point3 sideDirBefore = normalize(cross(rootBefore, currentState.vertDirection)); Point2 gunAnglesBefore = currentState.gunAngles; Point3 gunDirBefore = basis_aware_angles_to_dir(gunAnglesBefore, vertBefore, rootBefore); Point3 body3DDirBefore = relative_2d_dir_to_absolute_3d_dir(currentState.bodyOrientDir, rootBefore, sideDirBefore); Point3 walk3DDirBefore = relative_2d_dir_to_absolute_3d_dir(currentState.walkDir, rootBefore, sideDirBefore); - currentState.vertDirection = normalize(approach(dir_and_up_to_quat(currentState.vertDirection, rotAxisVert), - dir_and_up_to_quat(wishVertDirection, rotAxisVert), dt, 0.2f) - .getForward()); + if (currentState.vertDirection * wishVertDirection > 0.999) + currentState.vertDirection = wishVertDirection; + else + currentState.vertDirection = normalize(approach(dir_and_up_to_quat(currentState.vertDirection, rotAxisVert), + dir_and_up_to_quat(wishVertDirection, rotAxisVert), dt, 0.2f) + .getForward()); Quat changeInVert = quat_rotation_arc(vertBefore, currentState.vertDirection); Point3 newRoot = get_some_normal(currentState.vertDirection); - Point3 newSide = normalize(cross(currentState.vertDirection, newRoot)); + Point3 newSide = normalize(cross(newRoot, currentState.vertDirection)); currentState.gunDir = changeInVert * gunDirBefore; currentState.gunAngles = basis_aware_dir_to_angles(currentState.gunDir, currentState.vertDirection, newRoot); diff --git a/prog/gameLibs/gpuObjects/gpuObjects.cpp b/prog/gameLibs/gpuObjects/gpuObjects.cpp index cb6e54a37..7c346b980 100644 --- a/prog/gameLibs/gpuObjects/gpuObjects.cpp +++ b/prog/gameLibs/gpuObjects/gpuObjects.cpp @@ -652,8 +652,29 @@ void GpuObjects::update(const Point3 &origin) if (!objects.empty()) { + auto bvhConnectionLocal = bvhConnection; // to please the analyzer + const bool useBvhConnection = bvhConnectionLocal && bvhConnectionLocal->isReady() && gpu_objects_use_bvhVarId > -1; + + if (useBvhConnection && bvhConnectionLocal->prepare()) + { + ShaderGlobal::set_int(gpu_objects_bvh_max_countVarId, + bvhConnectionLocal->getInstancesBuffer() ? bvhConnectionLocal->getInstancesBuffer()->getNumElements() : 0); + ShaderGlobal::set_buffer(gpu_objects_bvh_counterVarId, bvhConnectionLocal->getInstanceCounter()); + ShaderGlobal::set_buffer(gpu_objects_bvh_instancesVarId, bvhConnectionLocal->getInstancesBuffer()); + } + for (ObjectManager &object : objects) + { + D3DRESID mappingId; + bool useBvh = useBvhConnection ? bvhConnectionLocal->translateObjectId(object.getRiId(), mappingId) : false; + ShaderGlobal::set_int(gpu_objects_use_bvhVarId, useBvh ? 1 : 0); + ShaderGlobal::set_buffer(gpu_objects_bvh_mappingsVarId, mappingId); + object.update(origin); + } + + if (useBvhConnection) + bvhConnectionLocal->done(); for (int i = 0; i < countof(gatherBuffersJobs); ++i) { diff --git a/prog/gameLibs/gpuObjects/volumePlacerES.cpp.inl b/prog/gameLibs/gpuObjects/volumePlacerES.cpp.inl index e73270edc..e22d35912 100644 --- a/prog/gameLibs/gpuObjects/volumePlacerES.cpp.inl +++ b/prog/gameLibs/gpuObjects/volumePlacerES.cpp.inl @@ -213,8 +213,9 @@ void VolumePlacer::performPlacing(const Point3 &camera_pos) float gpu_object_placer__distance_to_rotation_to, const Point3 &gpu_object_placer__distance_to_scale_pow, float gpu_object_placer__distance_to_rotation_pow, bool gpu_object_placer__use_distance_emitter, bool gpu_object_placer__distance_affect_decals, bool gpu_object_placer__distance_out_of_range, - riex_handles &gpu_object_placer__surface_riex_handles, TMatrix transform, const Point2 *gpu_object_placer__boxBorderX, - const Point2 *gpu_object_placer__boxBorderY, const Point2 *gpu_object_placer__boxBorderZ ECS_REQUIRE(ecs::Tag box_zone)) { + gpu_objects::riex_handles &gpu_object_placer__surface_riex_handles, TMatrix transform, + const Point2 *gpu_object_placer__boxBorderX, const Point2 *gpu_object_placer__boxBorderY, + const Point2 *gpu_object_placer__boxBorderZ ECS_REQUIRE(ecs::Tag box_zone)) { G_ASSERT(!(gpu_object_placer__filled && gpu_object_placer__buffer_offset == -1)); adjust_transform_to_border_offset(gpu_object_placer__boxBorderX, 0, transform); adjust_transform_to_border_offset(gpu_object_placer__boxBorderY, 1, transform); @@ -1197,4 +1198,4 @@ static bool volume_placer_console_handler(const char *argv[], int argc) REGISTER_CONSOLE_HANDLER(volume_placer_console_handler); #include -REGISTER_D3D_AFTER_RESET_FUNC(gpu_objects::volume_placer_after_reset); \ No newline at end of file +REGISTER_D3D_AFTER_RESET_FUNC(gpu_objects::volume_placer_after_reset); diff --git a/prog/gameLibs/hudprim/hudPrimitives.cpp b/prog/gameLibs/hudprim/hudPrimitives.cpp index c65d6d74b..4b0c15681 100644 --- a/prog/gameLibs/hudprim/hudPrimitives.cpp +++ b/prog/gameLibs/hudprim/hudPrimitives.cpp @@ -56,7 +56,8 @@ static inline float scaleByAspect(float aspect, int width) static ShaderVariableInfo maskMatrixLine0VarId("mask_matrix_line_0", true), maskMatrixLine1VarId("mask_matrix_line_1", true), textureVarId("tex", true), maskTexVarId("mask_tex", true), guiTextDepthVarId("gui_text_depth", true), - writeToZVarId("gui_write_to_z", true), testDepthVarId("gui_test_depth", true), blueToAlphaVarId("blue_to_alpha_mul", true); + texSamplerVarId("tex_samplerstate", true), maskSamplerVarId("mask_tex_samplerstate", true), writeToZVarId("gui_write_to_z", true), + testDepthVarId("gui_test_depth", true), blueToAlphaVarId("blue_to_alpha_mul", true); static int renderModeVarId = -1; static int guiAcesObjectBlockId = -1; @@ -88,6 +89,8 @@ void HudShader::cleanup() return; ShaderGlobal::set_texture(textureVarId, BAD_TEXTUREID); ShaderGlobal::set_texture(maskTexVarId, BAD_TEXTUREID); + texSamplerVarId.set_sampler(d3d::INVALID_SAMPLER_HANDLE); + maskSamplerVarId.set_sampler(d3d::INVALID_SAMPLER_HANDLE); } void HudShader::setStates(const float viewport[5], const GuiState &guiState, const ExtState *extState, bool viewport_changed, @@ -106,6 +109,7 @@ void HudShader::setStates(const float viewport[5], const GuiState &guiState, con if (st.maskEnable) { ShaderGlobal::set_texture(maskTexVarId, st.maskTexId); + maskSamplerVarId.set_sampler(st.maskSampler); ShaderGlobal::set_color4(maskMatrixLine0VarId, st.maskMatrix0.x, st.maskMatrix0.y, st.maskMatrix0.z, 0.f); @@ -114,12 +118,14 @@ void HudShader::setStates(const float viewport[5], const GuiState &guiState, con else { ShaderGlobal::set_texture(maskTexVarId, BAD_TEXTUREID); + maskSamplerVarId.set_sampler(d3d::INVALID_SAMPLER_HANDLE); } ShaderGlobal::set_int(writeToZVarId, fontAttr.writeToZ); ShaderGlobal::set_int(testDepthVarId, fontAttr.testDepth); ShaderGlobal::set_texture(textureVarId, st.currentTexture); + texSamplerVarId.set_sampler(st.currentSampler); ShaderGlobal::set_color4(blueToAlphaVarId, st.currentBlueToAlpha); mat->set_int_param(renderModeVarId, st.renderMode); @@ -221,6 +227,7 @@ void HudPrimitives::loadFromBlk(const DataBlock *blk) E3DCOLOR *HudPrimitives::getColorForModify(int color_id) { return safe_at(colorCodes, color_id); } TEXTUREID HudPrimitives::getWhiteTexId() { return get_white_on_demand().getTexId(); } Texture *HudPrimitives::getWhiteTex() { return get_white_on_demand().getTex2D(); } +d3d::SamplerHandle HudPrimitives::getWhiteSampler() const { return get_white_sampler_on_demand(); } void HudPrimitives::saveViewport() { @@ -340,6 +347,7 @@ void HudPrimitives::beginRender() updateViewFromContext(); guiContext->start_raw_layer(); state().currentTexture = BAD_TEXTUREID; + state().currentSampler = d3d::INVALID_SAMPLER_HANDLE; state().currentBlueToAlpha = Color4(0.f, 0.f, 0.f, 1.f); setState(); guiContext->setBuffer(1); @@ -400,17 +408,21 @@ void HudPrimitives::setStencil(int stencil_ref_value) } } -void HudPrimitives::updateState(TEXTUREID texture_id) +void HudPrimitives::updateState(TEXTUREID texture_id, d3d::SamplerHandle smp_id) { if (texture_id != state().currentTexture) { if (texture_id == BAD_TEXTUREID) + { texture_id = getWhiteTexId(); + smp_id = getWhiteSampler(); + } if (texture_id != state().currentTexture) state().currentBlueToAlpha = Color4(0.f, 0.f, 0.f, 1.f); state().currentTexture = texture_id; + state().currentSampler = smp_id; setState(); } } @@ -458,13 +470,13 @@ void HudPrimitives::updateProjectedQuadVB(HudVertex *data, const E3DCOLOR &color #undef SET_GUI_VTX } -void HudPrimitives::renderQuadScreenSpaceDeprecated(TEXTUREID texture_id, E3DCOLOR color, const Point4 &p0, const Point4 &p1, - const Point4 &p2, const Point4 &p3, const Point2 &tc0, const Point2 &tc1, const Point2 &tc2, const Point2 &tc3, +void HudPrimitives::renderQuadScreenSpaceDeprecated(TEXTUREID texture_id, d3d::SamplerHandle smp, E3DCOLOR color, const Point4 &p0, + const Point4 &p1, const Point4 &p2, const Point4 &p3, const Point2 &tc0, const Point2 &tc1, const Point2 &tc2, const Point2 &tc3, const E3DCOLOR *vertex_colors) { G_ASSERT(isInHudRender); - updateState(texture_id); + updateState(texture_id, smp); HudVertex *vtx = guiContext->qCacheAllocT(1); #define FILL_GUIVTX42(data, idx, p, t, stereo_depth, cc) FILL_GUIVTX(data, idx, p.x, p.y, p.z, p.w, t.x, t.y, stereo_depth, cc) @@ -481,7 +493,7 @@ void HudPrimitives::renderQuadScreenSpace3d(TEXTUREID texture_id, E3DCOLOR color { G_ASSERT(isInHudRender); - updateState(texture_id); + updateState(texture_id, d3d::INVALID_SAMPLER_HANDLE); // TODO: Use actual sampler IDs HudVertex *vtx = guiContext->qCacheAllocT(1); #define FILL_GUIVTX42(data, idx, p, t, cc) \ @@ -505,7 +517,7 @@ void HudPrimitives::renderQuad(const HudTexElem &elem, const E3DCOLOR color, dag const Coords coords, const float depth_2d) { G_ASSERT(isInHudRender); - updateState(elem.skinTex); + updateState(elem.skinTex, elem.smp); HudVertex *vtx = guiContext->qCacheAllocT(1); Point4 p[4]; @@ -651,7 +663,7 @@ void HudPrimitives::renderPoly(TEXTUREID texture_id, E3DCOLOR color, dag::ConstS G_ASSERT(isInHudRender); G_ASSERT(p.size() == tc.size()); - updateState(texture_id); + updateState(texture_id, d3d::INVALID_SAMPLER_HANDLE); // TODO: Use actual sampler IDs flush(); Tab vtx(framemem_ptr()); @@ -675,13 +687,14 @@ void HudPrimitives::renderPoly(TEXTUREID texture_id, E3DCOLOR color, dag::ConstS guiContext->draw_faces(&vtx[0], p.size(), &ind[0], ind.size() / 3); } -void HudPrimitives::renderTriFan(TEXTUREID texture_id, E3DCOLOR color, dag::ConstSpan p, dag::ConstSpan tc) +void HudPrimitives::renderTriFan(TEXTUREID texture_id, d3d::SamplerHandle smp, E3DCOLOR color, dag::ConstSpan p, + dag::ConstSpan tc) { G_ASSERT(isInHudRender); G_ASSERT(p.size() == tc.size()); G_ASSERTF(p.size() >= 3, "Trifan is built of at least three vertices"); - updateState(texture_id); + updateState(texture_id, smp); flush(); int numTris = p.size() - 2; @@ -875,6 +888,7 @@ void HudPrimitives::renderText(int x, int y, int font_no, E3DCOLOR color, const if (texture_id != state().currentTexture) { state().currentTexture = texture_id; + state().currentSampler = d3d::INVALID_SAMPLER_HANDLE; // TODO: Use actual sampler IDs state().currentBlueToAlpha = Color4(1.f, 0.f, 0.f, 0.f); setState(); } @@ -1034,6 +1048,7 @@ void HudPrimitives::setMask(TEXTUREID texture_id, const Point3 &matrix_line_0, c const Point2 &tc1) { state().maskTexId = texture_id; + state().maskSampler = d3d::INVALID_SAMPLER_HANDLE; // TODO: Use actual sampler IDs Point3 matrixLine0 = matrix_line_0 * (tc1.x - tc0.x); Point3 matrixLine1 = matrix_line_1 * (tc1.y - tc0.y); @@ -1050,6 +1065,7 @@ void HudPrimitives::setMask(TEXTUREID texture_id, const Point2 ¢er_pos, floa const Point2 &tc1) { state().maskTexId = texture_id; + state().maskSampler = d3d::INVALID_SAMPLER_HANDLE; // TODO: Use actual sampler IDs Point2 centerPos((center_pos.x - viewX) * viewWidthRcp2 - 1.f, 1.f - (center_pos.y - viewY) * viewHeightRcp2); @@ -1139,8 +1155,8 @@ void HudPrimitives::renderLine(E3DCOLOR color, const Point2 &p0, const Point2 &p ofs.normalize(); ofs *= width; - renderQuad(HudTexElem(getWhiteTexId()), color, Point2(p0.x - ofs.x, p0.y - ofs.y), Point2(p1.x - ofs.x, p1.y - ofs.y), - Point2(p1.x + ofs.x, p1.y + ofs.y), Point2(p0.x + ofs.x, p0.y + ofs.y)); + renderQuad(HudTexElem(getWhiteTexId(), getWhiteSampler()), color, Point2(p0.x - ofs.x, p0.y - ofs.y), + Point2(p1.x - ofs.x, p1.y - ofs.y), Point2(p1.x + ofs.x, p1.y + ofs.y), Point2(p0.x + ofs.x, p0.y + ofs.y)); } bool HudPrimitives::getScreenPos(const Point3 &world_pos, IPoint2 &screen_pos) const diff --git a/prog/gameLibs/pathFinder/customNav.cpp b/prog/gameLibs/pathFinder/customNav.cpp index 5798274c2..4595a27b5 100644 --- a/prog/gameLibs/pathFinder/customNav.cpp +++ b/prog/gameLibs/pathFinder/customNav.cpp @@ -105,6 +105,8 @@ void CustomNav::areaUpdateCylinder(uint32_t area_id, const BBox3 &aabb, float w1 void CustomNav::areaUpdate(const Area &area, float posThreshold, float angCosThreshold) { + restoreLostTiles(); + dtNavMesh *navMesh = getNavMeshPtr(); if (!navMesh || (area.id == 0)) return; @@ -152,6 +154,23 @@ void CustomNav::areaUpdate(const Area &area, float posThreshold, float angCosThr } } +class CustomNavHelper +{ +public: + static EASTL_FORCE_INLINE bool isAreaTile(const dtMeshTile *tile, const BBox3 &aabb, const CustomNav::Area &area) + { + BBox3 tileAABB(Point3(&tile->header->bmin[0], Point3::CTOR_FROM_PTR), Point3(&tile->header->bmax[0], Point3::CTOR_FROM_PTR)); + if (!(aabb & tileAABB)) + return false; + if (area.isCylinder) + { + Point3 sz = area.oobb.width(); + return testCircleAABB(tileAABB, area.oobb.center(), sz.x * sz.z); + } + return check_bbox_intersection(area.oobb, area.tm, tileAABB, TMatrix::IDENT); + } +}; + template void CustomNav::walkAreaTiles(const Area &area, T cb) { @@ -170,61 +189,100 @@ void CustomNav::walkAreaTiles(const Area &area, T cb) const int nneis = navMesh->getTilesAt(x, y, neis, MAX_NEIS); for (int j = 0; j < nneis; ++j) { - BBox3 tileAABB(Point3(&neis[j]->header->bmin[0], Point3::CTOR_FROM_PTR), - Point3(&neis[j]->header->bmax[0], Point3::CTOR_FROM_PTR)); - if (!(aabb & tileAABB)) - continue; - if (area.isCylinder) - { - Point3 sz = area.oobb.width(); - if (testCircleAABB(tileAABB, area.oobb.center(), sz.x * sz.z)) - cb(navMesh->decodePolyIdTile(navMesh->getTileRef(neis[j]))); - } - else if (check_bbox_intersection(area.oobb, area.tm, tileAABB, TMatrix::IDENT)) - cb(navMesh->decodePolyIdTile(navMesh->getTileRef(neis[j]))); + const dtMeshTile *tile = neis[j]; + if (CustomNavHelper::isAreaTile(tile, aabb, area)) + cb(navMesh->decodePolyIdTile(navMesh->getTileRef(tile))); } } } -void CustomNav::areaAddToTiles(Area &area) +void CustomNav::addAreaToTile(Area &area, uint32_t tile_id) { - walkAreaTiles(area, [this, &area](uint32_t tile_id) { - Tile &tile = tiles[tile_id]; - if (area.isCylinder) + Tile &tile = tiles[tile_id]; + if (area.isCylinder) + { + for (const Area &a : tile.cylinderAreas) { - for (const Area &a : tile.cylinderAreas) + if (DAGOR_UNLIKELY(a.id == area.id)) { - if (DAGOR_UNLIKELY(a.id == area.id)) - { - logerr("a.id == area.id %d == %d for cylinder area in %s", a.id, area.id, __FUNCTION__); - debug("tile count %d and gen %d", area.tileCount, area.generation); - BBox3 bbox = area.getAABB(); - debug("customNav area bbox %f %f %f %f %f %f", bbox.boxMin().x, bbox.boxMin().y, bbox.boxMin().z, bbox.boxMax().x, - bbox.boxMax().y, bbox.boxMax().z); - return; - } + logerr("a.id == area.id %d == %d for cylinder area in %s", a.id, area.id, __FUNCTION__); + debug("tile count %d and gen %d, tile_id %u", area.tileCount, area.generation, tile_id); + BBox3 bbox = area.getAABB(); + debug("customNav area bbox %f %f %f %f %f %f", bbox.boxMin().x, bbox.boxMin().y, bbox.boxMin().z, bbox.boxMax().x, + bbox.boxMax().y, bbox.boxMax().z); + return; } - tile.cylinderAreas.push_back(area); - ++area.tileCount; } - else + tile.cylinderAreas.push_back(area); + ++area.tileCount; + } + else + { + for (const Area &a : tile.boxAreas) { - for (const Area &a : tile.boxAreas) + if (DAGOR_UNLIKELY(a.id == area.id)) { - if (DAGOR_UNLIKELY(a.id == area.id)) - { - logerr("a.id == area.id %d == %d for box area in %s", a.id, area.id, __FUNCTION__); - debug("tile count %d and gen %d", area.tileCount, area.generation); - BBox3 bbox = area.getAABB(); - debug("customNav area bbox %f %f %f %f %f %f", bbox.boxMin().x, bbox.boxMin().y, bbox.boxMin().z, bbox.boxMax().x, - bbox.boxMax().y, bbox.boxMax().z); - return; - } + logerr("a.id == area.id %d == %d for box area in %s", a.id, area.id, __FUNCTION__); + debug("tile count %d and gen %d, tile_id %u", area.tileCount, area.generation, tile_id); + BBox3 bbox = area.getAABB(); + debug("customNav area bbox %f %f %f %f %f %f", bbox.boxMin().x, bbox.boxMin().y, bbox.boxMin().z, bbox.boxMax().x, + bbox.boxMax().y, bbox.boxMax().z); + return; } - tile.boxAreas.push_back(area); - ++area.tileCount; } - }); + tile.boxAreas.push_back(area); + ++area.tileCount; + } +} + +void CustomNav::areaAddToTiles(Area &area) +{ + walkAreaTiles(area, [this, &area](uint32_t tile_id) { addAreaToTile(area, tile_id); }); +} + +void CustomNav::invalidateTile(uint32_t tile_id, int tx, int ty, int tlayer) +{ + auto it = tiles.find(tile_id); + if (it == tiles.end()) + return; + + restoreLostTiles(); + + if (reTile.Init(tx, ty, tlayer, it->second)) + reTilePending = true; + + tiles.erase(tile_id); +} + +void CustomNav::restoreLostTiles() +{ + if (!reTilePending) + return; + reTilePending = false; + + const dtNavMesh *navMesh = getNavMeshPtr(); + if (!navMesh) + return; + + static const int MAX_NEIS = 32; + const dtMeshTile *neis[MAX_NEIS]; + const int numAreas = (int)reTile.areas.size(); + for (int k = 0; k < numAreas; ++k) + { + auto it = areas.find(reTile.areas[k]); + if (it == areas.end()) + continue; + Area &area = it->second; + BBox3 aabb = area.getAABB(); + int nneis = navMesh->getTilesAt(reTile.tx, reTile.ty, neis, MAX_NEIS); + for (int j = 0; j < nneis; ++j) + { + const dtMeshTile *tile = neis[j]; + if (tile->header->layer == reTile.tlayer) + if (CustomNavHelper::isAreaTile(tile, aabb, area)) + addAreaToTile(area, navMesh->decodePolyIdTile(navMesh->getTileRef(tile))); + } + } } void CustomNav::removeTile(uint32_t tile_id) { tiles.erase(tile_id); } @@ -267,6 +325,8 @@ void CustomNav::areaRemove(uint32_t area_id) auto it = areas.find(area_id); if (it != areas.end()) { + restoreLostTiles(); + Tab affectedTiles(framemem_ptr()); areaRemoveFromTiles(it->second, affectedTiles); for (uint32_t tile_id : affectedTiles) @@ -357,6 +417,8 @@ bool CustomNav::checkHashes(dag::ConstSpan poly_refs, const PolyHashes dtNavMesh *navMesh = getNavMeshPtr(); if (!navMesh) return true; + if (reTilePending) + return false; for (uint64_t polyRef : poly_refs) { auto it = hashes.find(polyRef); diff --git a/prog/gameLibs/pathFinder/pathFinder.cpp b/prog/gameLibs/pathFinder/pathFinder.cpp index 2cc0f3c5a..b98bcd90d 100644 --- a/prog/gameLibs/pathFinder/pathFinder.cpp +++ b/prog/gameLibs/pathFinder/pathFinder.cpp @@ -2859,13 +2859,15 @@ void mark_polygons_upper(float world_level, uint8_t area_id) bool find_nearest_ladder(const Point3 &pos, float radius, Point3 &out_pos, Point3 &out_forw, Point3 &out_along) { + const scene::TiledScene *ladders = get_nav_mesh_data(NM_MAIN).tcMeshProc.getLadders(); + if (!ladders) + return false; bool found = false; BBox3 box; box.boxMin().set(pos.x - radius, pos.y - radius, pos.z - radius); box.boxMax().set(pos.x + radius, pos.y + radius, pos.z + radius); bbox3f bbox = v_ldu_bbox3(box); float minDist = FLT_MAX; - const scene::TiledScene *ladders = get_nav_mesh_data(NM_MAIN).tcMeshProc.getLadders(); ladders->boxCull(bbox, 0, 0, [&](scene::node_index, mat44f_cref tm) { const Point3 ladderPos{v_extract_x(tm.col3), v_extract_y(tm.col3), v_extract_z(tm.col3)}; const Point3 dir = ladderPos - pos; diff --git a/prog/gameLibs/pathFinder/tileCache/rebuildNavMesh.cpp b/prog/gameLibs/pathFinder/tileCache/rebuildNavMesh.cpp index e5dadc1ed..39b9e9506 100644 --- a/prog/gameLibs/pathFinder/tileCache/rebuildNavMesh.cpp +++ b/prog/gameLibs/pathFinder/tileCache/rebuildNavMesh.cpp @@ -38,7 +38,6 @@ extern RiexHashMap riHandle2obstacle; void renderDebugReset(); -static Tab removedNavMeshTiles; static ska::flat_hash_set removedObstacles; static ska::flat_hash_set addedObstacles; @@ -752,8 +751,6 @@ void rebuildNavMesh_update_removeTiles() const int tlayer = tile->header->tlayer; dtTileRef tileRef = navMesh->getTileRefAt(tile->header->tx, tile->header->ty, tlayer); - removedNavMeshTiles.push_back(navMesh->decodePolyIdTile(tileRef)); - dtStatus status1 = navMesh->removeTile(tileRef, 0, 0); dtStatus status2 = tileCache->removeTile(tiles[i], NULL, NULL); @@ -1325,8 +1322,4 @@ bool patchedNavMesh_loadFromFile(const char *fileName, dtTileCache *tlCache, uin return true; } - -const Tab &get_removed_rebuild_tile_cache_tiles() { return removedNavMeshTiles; } - -void clear_removed_rebuild_tile_cache_tiles() { clear_and_shrink(removedNavMeshTiles); } } // namespace pathfinder \ No newline at end of file diff --git a/prog/gameLibs/pathFinder/tileCacheCommon.cpp b/prog/gameLibs/pathFinder/tileCacheCommon.cpp index ff7299354..df1e3bd10 100644 --- a/prog/gameLibs/pathFinder/tileCacheCommon.cpp +++ b/prog/gameLibs/pathFinder/tileCacheCommon.cpp @@ -19,10 +19,16 @@ static bool generateDynamicJumpLinks = true; static bool generateDynamicLadderLinks = true; static float maxDynamicJumpLinkDist = 2.5f; +static bool tileCacheRemoveCbEnabled = true; +static tile_remove_cb_t tileCacheRemoveCb = nullptr; + void tilecache_disable_dynamic_jump_links() { generateDynamicJumpLinks = false; } void tilecache_disable_dynamic_ladder_links() { generateDynamicLadderLinks = false; } bool tilecache_is_dynamic_ladder_links_enabled() { return generateDynamicLadderLinks; } +void tilecache_disable_tile_remove_cb() { tileCacheRemoveCbEnabled = false; } +void tilecache_set_tile_remove_cb(tile_remove_cb_t tile_remove_cb) { tileCacheRemoveCb = tile_remove_cb; } + static const float fastlzMaxCompressedSizeFactor = 1.05f; static const unsigned int staticJLBias = 1000; @@ -58,8 +64,6 @@ static int reservedSpace = 32; static float connectionRadius = 0.25f; static float invStepSize = 2.f; -static Tab removedNavMeshTiles; - static inline bool is_obstacle_in_tile(const dtCompressedTileRef *a, const int n, const dtCompressedTileRef v) { for (int i = 0; i < n; ++i) @@ -457,9 +461,6 @@ bool TileCacheMeshProcess::checkOverLink(const float *from, const float *to, uns void TileCacheMeshProcess::process(struct dtNavMeshCreateParams *params, unsigned char *polyAreas, unsigned short *polyFlags, dtCompressedTileRef ref) { - dtTileRef tileRef = mesh->getTileRefAt(params->tileX, params->tileY, params->tileLayer); - removedNavMeshTiles.push_back(mesh->decodePolyIdTile(tileRef)); - for (int i = 0; i < params->polyCount; ++i) { const auto area = polyAreas[i]; @@ -477,6 +478,12 @@ void TileCacheMeshProcess::process(struct dtNavMeshCreateParams *params, unsigne if (!tile) return; + if (tileCacheRemoveCbEnabled && tileCacheRemoveCb) + { + uint32_t tileId = mesh->decodePolyIdTile(mesh->getTileRef(tile)); + tileCacheRemoveCb(tileId, params->tileX, params->tileY, params->tileLayer); + } + Tab removedObstaclesId(framemem_ptr()); for (int i = 0; i < tc->getObstacleCount(); ++i) @@ -807,8 +814,4 @@ BBox3 tilecache_calc_tile_bounds(const dtTileCacheParams *params, const dtTileCa aabb.lim[1].z = header->bmin[2] + (header->maxy + 1) * cs; return aabb; } - -const Tab &get_removed_tile_cache_tiles() { return removedNavMeshTiles; } - -void clear_removed_tile_cache_tiles() { clear_and_shrink(removedNavMeshTiles); } } // namespace pathfinder diff --git a/prog/gameLibs/publicInclude/bvh/bvh.h b/prog/gameLibs/publicInclude/bvh/bvh.h index a52e7e90d..635237d84 100644 --- a/prog/gameLibs/publicInclude/bvh/bvh.h +++ b/prog/gameLibs/publicInclude/bvh/bvh.h @@ -404,6 +404,7 @@ struct MeshInfo bool isImpostor = false; bool isInterior = false; + bool isClipmap = false; bool hasInstanceColor = false; bool isCamo = false; bool isHeliRotor = false; @@ -441,6 +442,7 @@ static constexpr uint32_t bvhGroupRiExtra = 1 << 2; static constexpr uint32_t bvhGroupDynrend = 1 << 3; static constexpr uint32_t bvhGroupGrass = 1 << 4; static constexpr uint32_t bvhGroupImpostor = 1 << 5; +static constexpr uint32_t bvhGroupNoShadow = 1 << 6; enum Features { @@ -515,7 +517,7 @@ void set_ri_extra_range(ContextId context_id, float range); void prepare_ri_extra_instances(); void update_instances(ContextId bvh_context_id, const Point3 &view_position, const Frustum &frustum, - dynrend::ContextId *dynrend_context_id, RiGenVisibility *ri_gen_visibility); + dynrend::ContextId *dynrend_context_id, dynrend::ContextId *dynrend_plane_context_id, RiGenVisibility *ri_gen_visibility); // The upper 32 bits of the mesh_id are reserved for RI void add_mesh(ContextId context_id, uint64_t mesh_id, const MeshInfo &info); @@ -559,4 +561,6 @@ void finalize_async_atmosphere_update(ContextId context_id); bool is_building(ContextId context_id); +void set_grass_range(ContextId context_id, float range); + } // namespace bvh \ No newline at end of file diff --git a/prog/gameLibs/publicInclude/bvh/bvh_connection.h b/prog/gameLibs/publicInclude/bvh/bvh_connection.h index ef624558f..0aa3bee93 100644 --- a/prog/gameLibs/publicInclude/bvh/bvh_connection.h +++ b/prog/gameLibs/publicInclude/bvh/bvh_connection.h @@ -20,6 +20,7 @@ struct BVHConnection return false; } virtual void textureUsed(TEXTUREID texture_id) { G_UNUSED(texture_id); } + virtual float getMaxRange() const { return 1000000; } virtual const UniqueBuf &getInstanceCounter() = 0; virtual const UniqueBuf &getInstancesBuffer() = 0; virtual const UniqueBuf &getMappingsBuffer() = 0; diff --git a/prog/gameLibs/publicInclude/daECS/net/netEvents.h b/prog/gameLibs/publicInclude/daECS/net/netEvents.h index 730197ec0..8001cebae 100644 --- a/prog/gameLibs/publicInclude/daECS/net/netEvents.h +++ b/prog/gameLibs/publicInclude/daECS/net/netEvents.h @@ -18,7 +18,7 @@ class Connection; // server events #define NET_ECS_EVENTS \ NET_ECS_EVENT(EventOnClientConnected, int /*connection_id*/, matching::UserId, eastl::string /*user_name*/, int64_t /*group_id*/, \ - int64_t /*orig_group_id*/, uint16_t /*client_flags*/, eastl::string /*platform_user_id*/, eastl::string /*platform*/, \ + uint16_t /*client_flags*/, eastl::string /*platform_user_id*/, eastl::string /*platform*/, \ int /*mteam team assigned by matching*/, int /*appId*/) \ NET_ECS_EVENT(EventOnClientDisconnected, int /*connection_id*/, DisconnectionCause) \ NET_ECS_EVENT(EventOnDisconnectedFromServer, DisconnectionCause) \ diff --git a/prog/gameLibs/publicInclude/daGI2/treesAboveDepth.h b/prog/gameLibs/publicInclude/daGI2/treesAboveDepth.h index 1a3c4bfa2..d9d3e4a3d 100644 --- a/prog/gameLibs/publicInclude/daGI2/treesAboveDepth.h +++ b/prog/gameLibs/publicInclude/daGI2/treesAboveDepth.h @@ -35,6 +35,6 @@ class TreesAboveDepth TextureIDHolderWithVar trees2d; TextureIDHolderWithVar trees2dDepth, trees2dDepthMin; float trees2dDist = 384; - PostFxRenderer writeDepthToAlpha; + PostFxRenderer writeDepthToAlpha, clearRegions; Tab regionsToClear, regionsToUpdate; }; diff --git a/prog/gameLibs/publicInclude/dasModules/aotPathFinder.h b/prog/gameLibs/publicInclude/dasModules/aotPathFinder.h index 731835d47..ab6d49505 100644 --- a/prog/gameLibs/publicInclude/dasModules/aotPathFinder.h +++ b/prog/gameLibs/publicInclude/dasModules/aotPathFinder.h @@ -168,32 +168,6 @@ inline bool tilecache_ri_obstacle_remove(rendinst::riex_handle_t ri_handle) { return pathfinder::tilecache_ri_obstacle_remove(ri_handle); } -inline void walk_removed_tile_cache_tiles(const das::TBlock>> &block, - das::Context *context, das::LineInfoArg *at) -{ - const Tab &removedTiles = pathfinder::get_removed_tile_cache_tiles(); - das::Array arr; - arr.data = (char *)removedTiles.data(); - arr.size = uint32_t(removedTiles.size()); - arr.capacity = arr.size; - arr.lock = 1; - arr.flags = 0; - vec4f arg = das::cast::from(&arr); - context->invoke(block, &arg, nullptr, at); -} -inline void walk_removed_rebuild_tile_cache_tiles(const das::TBlock>> &block, - das::Context *context, das::LineInfoArg *at) -{ - const Tab &removedTiles = pathfinder::get_removed_rebuild_tile_cache_tiles(); - das::Array arr; - arr.data = (char *)removedTiles.data(); - arr.size = uint32_t(removedTiles.size()); - arr.capacity = arr.size; - arr.lock = 1; - arr.flags = 0; - vec4f arg = das::cast::from(&arr); - context->invoke(block, &arg, nullptr, at); -} inline bool query_navmesh_projections(const Point3 &pos, das::float3 extents, int points_num, const das::TBlock>> &block, das::Context *context, das::LineInfoArg *at) { diff --git a/prog/gameLibs/publicInclude/ecs/core/utility/ecsBlkUtils.h b/prog/gameLibs/publicInclude/ecs/core/utility/ecsBlkUtils.h index 15dfba35f..2311ebcbd 100644 --- a/prog/gameLibs/publicInclude/ecs/core/utility/ecsBlkUtils.h +++ b/prog/gameLibs/publicInclude/ecs/core/utility/ecsBlkUtils.h @@ -27,6 +27,7 @@ namespace ecs #define LIST_TYPES \ LIST_TYPE(i, int, Int, ) \ + LIST_TYPE(u8, uint8_t, Int, ) \ LIST_TYPE(u16, uint16_t, Int, ) \ LIST_TYPE(t, ecs::string, Str, .c_str()) \ LIST_TYPE(r, float, Real, ) \ diff --git a/prog/gameLibs/publicInclude/ecs/terraform/terraform.h b/prog/gameLibs/publicInclude/ecs/terraform/terraform.h index fd39dfd42..ea619516b 100644 --- a/prog/gameLibs/publicInclude/ecs/terraform/terraform.h +++ b/prog/gameLibs/publicInclude/ecs/terraform/terraform.h @@ -7,7 +7,8 @@ #include #include -ECS_DECLARE_RELOCATABLE_TYPE(TerraformComponent); +// It's boxed since it's register pointer to itself in terraform (`registerListener()`) +ECS_DECLARE_BOXED_TYPE(TerraformComponent); class DataBlock; class HeightmapHandler; diff --git a/prog/gameLibs/publicInclude/gamePhys/phys/destructableObject.h b/prog/gameLibs/publicInclude/gamePhys/phys/destructableObject.h index fba8c1555..cdd8b9159 100644 --- a/prog/gameLibs/publicInclude/gamePhys/phys/destructableObject.h +++ b/prog/gameLibs/publicInclude/gamePhys/phys/destructableObject.h @@ -40,6 +40,7 @@ struct DestructableCreationParams float timeToLive = -1.0f; float defaultTimeToLive = -1.0f; float timeToKinematic = -1.0f; + bool isDestroyedByExplosion = false; }; } // namespace destructables diff --git a/prog/gameLibs/publicInclude/gamePhys/phys/destructableRendObject.h b/prog/gameLibs/publicInclude/gamePhys/phys/destructableRendObject.h index dfbefe143..2b60d2dde 100644 --- a/prog/gameLibs/publicInclude/gamePhys/phys/destructableRendObject.h +++ b/prog/gameLibs/publicInclude/gamePhys/phys/destructableRendObject.h @@ -27,7 +27,7 @@ struct DestrRendData int deformationId; }; -DestrRendData *init_rend_data(DynamicPhysObjectClass *phys_obj); +DestrRendData *init_rend_data(DynamicPhysObjectClass *phys_obj, bool is_fully_deformed); void clear_rend_data(DestrRendData *data); struct DestrRendDataDeleter diff --git a/prog/gameLibs/publicInclude/gamePhys/phys/rendinstDestr.h b/prog/gameLibs/publicInclude/gamePhys/phys/rendinstDestr.h index 2385be488..161359288 100644 --- a/prog/gameLibs/publicInclude/gamePhys/phys/rendinstDestr.h +++ b/prog/gameLibs/publicInclude/gamePhys/phys/rendinstDestr.h @@ -33,7 +33,7 @@ enum RestorableRendinstState typedef void (*create_tree_rend_inst_destr_cb)(const rendinst::RendInstDesc &desc, bool add_restorable, const Point3 &impactPos, const Point3 &impulse, bool create_phys, bool constrained_phys, float omega, float at_time, const rendinst::CollisionInfo *coll_info, - bool create_destr); + bool create_destr, bool from_damage); typedef void (*remove_tree_rendinst_destr_cb)(const rendinst::RendInstDesc &desc); typedef void (*remove_physx_collision_object_callback)(const rendinst::RendInstDesc &desc); typedef int (*create_apex_actors_callback)(const char *name, const TMatrix &normalized_tm, const Point3 &scale, const Point3 &pos, @@ -163,10 +163,12 @@ rendinst::RendInstDesc destroyRendinst(rendinst::RendInstDesc desc, bool add_res float at_time, const rendinst::CollisionInfo *coll_info, bool create_destr_effects, ApexDmgInfo *apex_dmg_info = NULL, int destroy_neighbour_recursive_depth = 1, float impulse_mult_for_child = 1.f, on_destr_callback on_destr_cb = nullptr, rendinst::DestrOptionFlags flags = rendinst::DestrOptionFlag::AddDestroyedRi | rendinst::DestrOptionFlag::ForceDestroy); -void destroyRiExtra(rendinst::riex_handle_t riex_handle, const TMatrix &transform, const Point3 &impulse, const Point3 &impulse_pos); +void destroyRiExtra(rendinst::riex_handle_t riex_handle, const TMatrix &transform, const Point3 &impulse, const Point3 &impulse_pos, + rendinst::DestrOptionFlags flags = {}); void update(float dt, const Frustum *frustum); +void update_paused(const Frustum *frustum); void fill_ri_destructable_params(destructables::DestructableCreationParams ¶ms, const rendinst::RendInstDesc &desc, - DynamicPhysObjectData *po_data, const TMatrix &tm); + DynamicPhysObjectData *po_data, const TMatrix &tm, rendinst::DestrOptionFlags flags); bool apply_damage_to_riextra(rendinst::riex_handle_t handle, float dmg, const Point3 &pos, const Point3 &impulse, float at_time); void apply_damage_to_ri(const rendinst::RendInstDesc &desc, float dmg, float impulse_to_hp, const Point3 &pos, const Point3 &impulse, @@ -197,7 +199,7 @@ int test_dynobj_to_ri_phys_collision(const CollisionObject &coA, float max_rad); void remove_tree_rendinst_destr(const rendinst::RendInstDesc &desc); void create_tree_rend_inst_destr(const rendinst::RendInstDesc &desc, bool add_restorable, const Point3 &impactPos, const Point3 &impulse, bool create_phys, bool constrained_phys, float wanted_omega, float at_time, - const rendinst::CollisionInfo *coll_info, bool create_destr); + const rendinst::CollisionInfo *coll_info, bool create_destr, bool from_damage); void clear_phys_objs(); diff --git a/prog/gameLibs/publicInclude/hudprim/dag_hudPrimitives.h b/prog/gameLibs/publicInclude/hudprim/dag_hudPrimitives.h index e1b1133c2..01bda1940 100644 --- a/prog/gameLibs/publicInclude/hudprim/dag_hudPrimitives.h +++ b/prog/gameLibs/publicInclude/hudprim/dag_hudPrimitives.h @@ -76,18 +76,22 @@ struct BufferedText struct HudTexElem { TEXTUREID skinTex; + d3d::SamplerHandle smp; // lt, lb, rb, rt carray tc; - HudTexElem() : skinTex(BAD_TEXTUREID), tc() {} + HudTexElem() : skinTex(BAD_TEXTUREID), smp(d3d::INVALID_SAMPLER_HANDLE), tc() {} - HudTexElem(TEXTUREID skin_tex, const Point2 &tc_lt = Point2(0.f, 0.f), const Point2 &tc_rb = Point2(1.f, 1.f)) : skinTex(skin_tex) + HudTexElem(TEXTUREID skin_tex, d3d::SamplerHandle smp_id, const Point2 &tc_lt = Point2(0.f, 0.f), + const Point2 &tc_rb = Point2(1.f, 1.f)) : + skinTex(skin_tex), smp(smp_id) { setTc(tc_lt, tc_rb); } - HudTexElem(TEXTUREID skin_tex, const Point2 &tc_lt, const Point2 &tc_lb, const Point2 &tc_rb, const Point2 &tc_rt) : - skinTex(skin_tex) + HudTexElem(TEXTUREID skin_tex, d3d::SamplerHandle smp_id, const Point2 &tc_lt, const Point2 &tc_lb, const Point2 &tc_rb, + const Point2 &tc_rt) : + skinTex(skin_tex), smp(smp_id) { tc[0] = tc_lt; tc[1] = tc_lb; @@ -115,6 +119,8 @@ struct HudShader : StdGuiRender::GuiShader TEXTUREID currentTexture; TEXTUREID maskTexId; + d3d::SamplerHandle currentSampler; + d3d::SamplerHandle maskSampler; Point3 maskMatrix0; Point3 maskMatrix1; @@ -130,6 +136,8 @@ struct HudShader : StdGuiRender::GuiShader currentBlueToAlpha = Color4(0, 0, 0, 1); currentTexture = BAD_TEXTUREID; maskTexId = BAD_TEXTUREID; + currentSampler = d3d::INVALID_SAMPLER_HANDLE; + maskSampler = d3d::INVALID_SAMPLER_HANDLE; maskMatrix0 = Point3(0, 0, 0); maskMatrix1 = Point3(0, 0, 0); @@ -140,6 +148,7 @@ struct HudShader : StdGuiRender::GuiShader maskEnable = false; } }; + static_assert(sizeof(StdGuiRender::ExtState) == sizeof(ExtStateLocal), "ExtState size mismatch"); virtual void channels(const CompiledShaderChannelId *&channels, int &num_channels); virtual void link(); @@ -232,6 +241,7 @@ class HudPrimitives E3DCOLOR *getColorForModify(int color_id); TEXTUREID getWhiteTexId(); + d3d::SamplerHandle getWhiteSampler() const; static Texture *getWhiteTex(); void loadFromBlk(const DataBlock *blk); @@ -278,18 +288,18 @@ class HudPrimitives RenderMode setRenderMode(RenderMode mode); void setStencil(int stencil_ref_value); - void updateState(TEXTUREID texture_id); + void updateState(TEXTUREID texture_id, d3d::SamplerHandle smp_id); // Deprected drawing method without clipping, 3d, and stereo support so // do not use it anymore - void renderQuadScreenSpaceDeprecated(TEXTUREID texture_id, E3DCOLOR color, const Point4 &p0, const Point4 &p1, const Point4 &p2, - const Point4 &p3, const Point2 &tc0 = Point2(0.f, 0.f), const Point2 &tc1 = Point2(0.f, 1.f), const Point2 &tc2 = Point2(1.f, 1.f), - const Point2 &tc3 = Point2(1.f, 0.f), const E3DCOLOR *vertex_colors = NULL); + void renderQuadScreenSpaceDeprecated(TEXTUREID texture_id, d3d::SamplerHandle smp, E3DCOLOR color, const Point4 &p0, + const Point4 &p1, const Point4 &p2, const Point4 &p3, const Point2 &tc0 = Point2(0.f, 0.f), const Point2 &tc1 = Point2(0.f, 1.f), + const Point2 &tc2 = Point2(1.f, 1.f), const Point2 &tc3 = Point2(1.f, 0.f), const E3DCOLOR *vertex_colors = NULL); void renderQuadScreenSpaceDeprecated(const HudTexElem &elem, E3DCOLOR color, const Point4 &p0, const Point4 &p1, const Point4 &p2, const Point4 &p3, const E3DCOLOR *vertex_colors = NULL) { - renderQuadScreenSpaceDeprecated(elem.skinTex, color, p0, p1, p2, p3, elem.tc[0], elem.tc[1], elem.tc[2], elem.tc[3], + renderQuadScreenSpaceDeprecated(elem.skinTex, elem.smp, color, p0, p1, p2, p3, elem.tc[0], elem.tc[1], elem.tc[2], elem.tc[3], vertex_colors); } @@ -302,7 +312,7 @@ class HudPrimitives void renderPoly(TEXTUREID texture_id, E3DCOLOR color, dag::ConstSpan p, dag::ConstSpan tc); - void renderTriFan(TEXTUREID texture_id, E3DCOLOR color, dag::ConstSpan p, dag::ConstSpan tc); + void renderTriFan(TEXTUREID texture_id, d3d::SamplerHandle smp, E3DCOLOR color, dag::ConstSpan p, dag::ConstSpan tc); void drawPrims(int d3d_prim, int num_prim, const HudVertex *ptr) { diff --git a/prog/gameLibs/publicInclude/pathFinder/customNav.h b/prog/gameLibs/publicInclude/pathFinder/customNav.h index d4f35ba58..d0cd4511c 100644 --- a/prog/gameLibs/publicInclude/pathFinder/customNav.h +++ b/prog/gameLibs/publicInclude/pathFinder/customNav.h @@ -54,9 +54,13 @@ class CustomNav // used by the navigation code. bool checkHashes(dag::ConstSpan poly_refs, const PolyHashes &hashes) const; + void invalidateTile(uint32_t tile_id, int tx, int ty, int tlayer); + void restoreLostTiles(); + void removeTile(uint32_t tile_id); private: + friend class CustomNavHelper; struct Area { inline BBox3 getAABB() const { return isCylinder ? oobb : tm * oobb; } @@ -84,6 +88,7 @@ class CustomNav void areaUpdate(const Area &area, float posThreshold, float angCosThreshold); void areaAddToTiles(Area &area); + void addAreaToTile(Area &area, uint32_t tile_id); void areaRemoveFromTiles(Area &area, Tab &affected_tiles); @@ -92,5 +97,27 @@ class CustomNav ska::flat_hash_map areas; ska::flat_hash_map tiles; mutable Tab> tmpHashBuff; + + struct ReTile + { + int tx = 0, ty = 0, tlayer = 0; + eastl::fixed_vector areas; + bool Init(int _tx, int _ty, int _tlayer, const Tile &from) + { + if (from.cylinderAreas.empty() && from.boxAreas.empty()) + return false; + tx = _tx; + ty = _ty; + tlayer = _tlayer; + areas.clear(); + for (auto jt = from.boxAreas.begin(); jt != from.boxAreas.end(); ++jt) + areas.push_back(jt->id); + for (auto jt = from.cylinderAreas.begin(); jt != from.cylinderAreas.end(); ++jt) + areas.push_back(jt->id); + return true; + } + }; + bool reTilePending = false; + ReTile reTile; }; }; // namespace pathfinder diff --git a/prog/gameLibs/publicInclude/pathFinder/pathFinder.h b/prog/gameLibs/publicInclude/pathFinder/pathFinder.h index 8c79b7aa4..f9f96d868 100644 --- a/prog/gameLibs/publicInclude/pathFinder/pathFinder.h +++ b/prog/gameLibs/publicInclude/pathFinder/pathFinder.h @@ -40,6 +40,7 @@ enum NavMeshID class CustomNav; using tile_check_cb_t = eastl::fixed_function<2 * sizeof(void *), bool(const BBox3 &)>; +using tile_remove_cb_t = eastl::fixed_function<4 * sizeof(void *), void(uint32_t tile_id, int tx, int ty, int tlayer)>; using ri_obstacle_cb_t = eastl::fixed_function<4 * sizeof(void *), void(rendinst::riex_handle_t ri_handle, const TMatrix &tm, const BBox3 &oobb)>; @@ -285,6 +286,9 @@ void tilecache_sync(); void tilecache_update(float dt); void tilecache_stop(); +void tilecache_disable_tile_remove_cb(); +void tilecache_set_tile_remove_cb(tile_remove_cb_t tile_remove_cb = nullptr); + void tilecache_disable_dynamic_jump_links(); void tilecache_disable_dynamic_ladder_links(); bool tilecache_is_dynamic_ladder_links_enabled(); diff --git a/prog/gameLibs/publicInclude/rendInst/constants.h b/prog/gameLibs/publicInclude/rendInst/constants.h index c52972268..68e184d77 100644 --- a/prog/gameLibs/publicInclude/rendInst/constants.h +++ b/prog/gameLibs/publicInclude/rendInst/constants.h @@ -68,7 +68,8 @@ enum class DestrOptionFlag : uint32_t { ForceDestroy = 1 << 0, AddDestroyedRi = 1 << 1, - UseFullBbox = 1 << 2 + UseFullBbox = 1 << 2, + DestroyedByExplosion = 1 << 3 }; using DestrOptionFlags = BitFlagsMask; BITMASK_DECLARE_FLAGS_OPERATORS(DestrOptionFlag); diff --git a/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h b/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h index b836a91b8..8373af75a 100644 --- a/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h +++ b/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h @@ -10,6 +10,7 @@ #include #include +#include // This is actually private data, potential leak of abstraction here @@ -194,3 +195,5 @@ bool checkCachedRiData(const TraceMeshFaces *ri_cache); bool initializeCachedRiData(TraceMeshFaces *ri_cache); } // namespace rendinst + +DAG_DECLARE_RELOCATABLE(rendinst::CollisionInfo); diff --git a/prog/gameLibs/publicInclude/rendInst/rendInstDebris.h b/prog/gameLibs/publicInclude/rendInst/rendInstDebris.h index c08135b3a..d19089c96 100644 --- a/prog/gameLibs/publicInclude/rendInst/rendInstDebris.h +++ b/prog/gameLibs/publicInclude/rendInst/rendInstDebris.h @@ -59,6 +59,8 @@ riex_handle_t restoreRiGenDestr(const RendInstDesc &desc, const RendInstBufferDa struct TreeInstData { float timer = 0.0f; + float disappearStartTime = -1.0f; + float maxDistanceSq = 0.0f; int rndSeed = 0; Point2 impactXZ = Point2(0.0f, 0.0f); rendinstdestr::TreeDestr::BranchDestr branchDestr; @@ -66,8 +68,10 @@ struct TreeInstData struct TreeInstDebugData { - rendinstdestr::TreeDestr::BranchDestr branchDestr; + rendinstdestr::TreeDestr::BranchDestr branchDestrFromDamage; + rendinstdestr::TreeDestr::BranchDestr branchDestrOther; float timer_offset = 0.0f; + bool last_object_was_from_damage = false; }; struct DestroyedRi @@ -92,7 +96,7 @@ struct DestroyedRi }; DestroyedRi *doRIGenExternalControl(const RendInstDesc &desc, bool rem_rendinst = true); -bool fillTreeInstData(const RendInstDesc &desc, const Point2 &impact_velocity_xz, TreeInstData &out_data); +bool fillTreeInstData(const RendInstDesc &desc, const Point2 &impact_velocity_xz, bool from_damage, TreeInstData &out_data); void updateTreeDestrRenderData(const TMatrix &original_tm, riex_handle_t ri_handle, TreeInstData &tree_inst_data, const TreeInstDebugData *tree_inst_debug_data = nullptr); diff --git a/prog/gameLibs/publicInclude/rendInst/rendInstDebug.h b/prog/gameLibs/publicInclude/rendInst/rendInstDebug.h new file mode 100644 index 000000000..d126079c6 --- /dev/null +++ b/prog/gameLibs/publicInclude/rendInst/rendInstDebug.h @@ -0,0 +1,15 @@ +// +// Dagor Engine 6.5 - Game Libraries +// Copyright (C) Gaijin Games KFT. All rights reserved. +// +#pragma once + +class Point3; +class TMatrix; + +namespace rendinst +{ +struct RendInstDesc; + +void draw_rendinst_info(const Point3 &intersection_pos, const TMatrix &cam_tm, const RendInstDesc &desc); +} // namespace rendinst diff --git a/prog/gameLibs/publicInclude/rendInst/treeDestr.h b/prog/gameLibs/publicInclude/rendInst/treeDestr.h index 7fe353f91..bcff725bf 100644 --- a/prog/gameLibs/publicInclude/rendInst/treeDestr.h +++ b/prog/gameLibs/publicInclude/rendInst/treeDestr.h @@ -39,9 +39,11 @@ struct TreeDestr { bool enableBranchDestruction = false; bool multiplierMode = false; // if false, overrides default values - float impulseMul = 4.0f; - float impulseMaxLength = 3.5f; - float branchSizeMax = 8.0f; + float impulseMul = 1.0f; // multiplies the incoming impulse + float impulseMin = 0.0f; // if the impulse is lower than this, the falling chance will be 0% + float impulseMax = 6.0f; // if the impulse is higher than this, the falling chance will be 100% + float branchSizeMin = 3.0f; // if the branch size is lower than this, the falling chance will not be decreased + float branchSizeMax = 20.0f; // if the branch size if higher than this, the falling chance will be 0% float rotateRandomSpeedMulX = 0.5f; float rotateRandomSpeedMulY = 1.5f; float rotateRandomSpeedMulZ = 0.5f; @@ -50,9 +52,10 @@ struct TreeDestr float fallingSpeedMul = 0.7f; float fallingSpeedRnd = 0.4f; float horizontalSpeedMul = 1.0f; + float maxVisibleDistance = 100.0f; void apply(const BranchDestr &other); - } branchDestr; + } branchDestrFromDamage, branchDestrOther; InterpolateTabFloat radiusToImpulse; float getRadiusToImpulse(float radius) const; diff --git a/prog/gameLibs/publicInclude/render/bigLightsShadows.h b/prog/gameLibs/publicInclude/render/bigLightsShadows.h index 9e9668a00..349017feb 100644 --- a/prog/gameLibs/publicInclude/render/bigLightsShadows.h +++ b/prog/gameLibs/publicInclude/render/bigLightsShadows.h @@ -10,5 +10,5 @@ class Point4; BigLightsShadows *create_big_lights_shadows(int w, int h, unsigned int maxCnt, const char *prefix); void destroy_big_lights_shadows(BigLightsShadows *&r); -void render_big_lights_shadows(BigLightsShadows *r, const Point4 *pos_rad, uint32_t cnt, const DPoint3 *world_pos); +void render_big_lights_shadows(BigLightsShadows *r, const Point4 *pos_rad, uint32_t cnt); void set_big_lights_shadows(BigLightsShadows *r, int reg); diff --git a/prog/gameLibs/publicInclude/render/cascadeShadows.h b/prog/gameLibs/publicInclude/render/cascadeShadows.h index d807846ae..8df6eaaff 100644 --- a/prog/gameLibs/publicInclude/render/cascadeShadows.h +++ b/prog/gameLibs/publicInclude/render/cascadeShadows.h @@ -89,7 +89,7 @@ class CascadeShadows CascadeShadows(ICascadeShadowsClient *in_client, const Settings &in_settings); public: - static CascadeShadows *make(ICascadeShadowsClient *in_client, const Settings &in_settings); + static CascadeShadows *make(ICascadeShadowsClient *in_client, const Settings &in_settings, String &&res_postfix = String()); ~CascadeShadows(); void prepareShadowCascades(const CascadeShadows::ModeSettings &mode_settings, const Point3 &dir_to_sun, const TMatrix &view_matrix, diff --git a/prog/gameLibs/publicInclude/render/denoiser.h b/prog/gameLibs/publicInclude/render/denoiser.h index cf398b668..41348ffdc 100644 --- a/prog/gameLibs/publicInclude/render/denoiser.h +++ b/prog/gameLibs/publicInclude/render/denoiser.h @@ -54,6 +54,7 @@ struct ShadowDenoiser Texture *denoisedShadowMap = nullptr; Texture *shadowValue = nullptr; Texture *shadowTranslucency = nullptr; + Texture *csmTexture = nullptr; }; struct AODenoiser diff --git a/prog/gameLibs/publicInclude/render/dynmodelRenderer.h b/prog/gameLibs/publicInclude/render/dynmodelRenderer.h index 7977ab2db..3eb865012 100644 --- a/prog/gameLibs/publicInclude/render/dynmodelRenderer.h +++ b/prog/gameLibs/publicInclude/render/dynmodelRenderer.h @@ -27,6 +27,7 @@ class DynamicRenderableSceneResource; class BaseTexture; class GeomNodeTree; class ShaderElement; +class ShaderMaterial; #ifndef INVALID_INST_NODE_ID #define INVALID_INST_NODE_ID 0 @@ -152,6 +153,14 @@ struct ReplacedShaderScope ~ReplacedShaderScope() { replace_shader(nullptr); } }; +// scoped material filtering +void set_material_filters_by_name(Tab &&material_names); +struct MaterialFilterScope +{ + MaterialFilterScope(Tab &&material_names) { set_material_filters_by_name(std::move(material_names)); } + ~MaterialFilterScope() { set_material_filters_by_name({}); } +}; + ContextId create_context(const char *name); void delete_context(ContextId context_id); @@ -183,6 +192,6 @@ Statistics &get_statistics(); void reset_statistics(); using InstanceIterator = void(ContextId, const DynamicRenderableSceneResource &, const DynamicRenderableSceneInstance &, - const Tab &, int, float, int, int, int, void *); + const dynrend::PerInstanceRenderData &, const Tab &, int, float, int, int, void *); void iterate_instances(dynrend::ContextId context_id, InstanceIterator iter, void *user_data); } // namespace dynrend diff --git a/prog/gameLibs/publicInclude/render/mobile_ssao.h b/prog/gameLibs/publicInclude/render/mobile_ssao.h index c9e068de0..2408d3d77 100644 --- a/prog/gameLibs/publicInclude/render/mobile_ssao.h +++ b/prog/gameLibs/publicInclude/render/mobile_ssao.h @@ -26,7 +26,7 @@ class MobileSSAORenderer : public ISSAORenderer TEXTUREID getSSAOTexId() override; private: - void render(const TMatrix &view_tm, const TMatrix4 &proj_tm, BaseTexture *depth_tex_to_use, const ManagedTex *ssaoTex, + void render(const TMatrix &, const TMatrix4 &, BaseTexture *depth_tex_to_use, const ManagedTex *ssaoTex, const ManagedTex *prevSsaoTex, const ManagedTex *tmpTex, const DPoint3 *, SubFrameSample sub_sample = SubFrameSample::Single) override; @@ -35,7 +35,6 @@ class MobileSSAORenderer : public ISSAORenderer void applyBlur(); void setFactor(); - void setReprojection(const TMatrix &view_tm, const TMatrix4 &proj_tm); static constexpr const char *ssao_sh_name = "mobile_ssao"; static constexpr const char *blur_sh_name = "mobile_ssao_blur"; @@ -48,10 +47,4 @@ class MobileSSAORenderer : public ISSAORenderer eastl::array ssaoTex; eastl::unique_ptr ssaoBlurRenderer{nullptr}; - - struct - { - TMatrix4 prevGlobTm; - DPoint3 prevWorldPos; - } reprojectionData; }; diff --git a/prog/gameLibs/publicInclude/render/rtsm.h b/prog/gameLibs/publicInclude/render/rtsm.h index a3b067ad4..0c3e3cb9a 100644 --- a/prog/gameLibs/publicInclude/render/rtsm.h +++ b/prog/gameLibs/publicInclude/render/rtsm.h @@ -33,7 +33,7 @@ void initialize(int width, int height, RenderMode render_mode, bool dynamic_ligh void teardown(); void render(bvh::ContextId context_id, const Point3 &view_pos, const TMatrix4 &proj_tm, bool has_nuke = false, - bool has_dynamic_lights = false); + bool has_dynamic_lights = false, Texture *csm_texture = nullptr); void render_dynamic_light_shadows(bvh::ContextId context_id, const Point3 &view_pos, bool has_nuke = false); diff --git a/prog/gameLibs/publicInclude/render/volumetricLights/volumetricLights.h b/prog/gameLibs/publicInclude/render/volumetricLights/volumetricLights.h index 8b86a5061..3466d3cc6 100644 --- a/prog/gameLibs/publicInclude/render/volumetricLights/volumetricLights.h +++ b/prog/gameLibs/publicInclude/render/volumetricLights/volumetricLights.h @@ -101,7 +101,6 @@ class VolumeLight void resetDistantFog(); void initVolfogShadow(); void resetVolfogShadow(); - void initExperimentalFeatures(); int getBlendedSliceCnt() const; float calcBlendedStartDepth(int blended_slice_cnt) const; @@ -182,6 +181,4 @@ class VolumeLight bool enableVolfogShadows = false; bool enableDistantFog = false; - - bool useExperimentalOffscreenReprojection = false; }; diff --git a/prog/gameLibs/publicInclude/render/whiteTex.h b/prog/gameLibs/publicInclude/render/whiteTex.h index b9994b05c..13a2182b1 100644 --- a/prog/gameLibs/publicInclude/render/whiteTex.h +++ b/prog/gameLibs/publicInclude/render/whiteTex.h @@ -5,7 +5,9 @@ #pragma once #include <3d/dag_resPtr.h> +#include class BaseTexture; const UniqueTex &get_white_on_demand(); BaseTexture *get_white_tex_on_demand(); +d3d::SamplerHandle get_white_sampler_on_demand(); diff --git a/prog/gameLibs/publicInclude/terraform/terraform.h b/prog/gameLibs/publicInclude/terraform/terraform.h index 1094857be..ed5296fcc 100644 --- a/prog/gameLibs/publicInclude/terraform/terraform.h +++ b/prog/gameLibs/publicInclude/terraform/terraform.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include #include @@ -368,7 +369,7 @@ class Terraform final Tab patchChanges; Renderer *renderer = NULL; - Tab listeners; + dag::RelocatableFixedVector listeners; }; template diff --git a/prog/gameLibs/publicInclude/terraform/terraformComponent.h b/prog/gameLibs/publicInclude/terraform/terraformComponent.h index dfd5aa921..e98604ee7 100644 --- a/prog/gameLibs/publicInclude/terraform/terraformComponent.h +++ b/prog/gameLibs/publicInclude/terraform/terraformComponent.h @@ -55,8 +55,9 @@ class TerraformComponent : public Terraform::Listener float getHmapHeightOrigValAtPos(const Point2 &pos) const; protected: - virtual void allocPatch(int patch_no); - virtual void storePatchAlt(const Pcd &pcd, uint8_t alt); + // Terraform::Listener + virtual void allocPatch(int patch_no) override; + virtual void storePatchAlt(const Pcd &pcd, uint8_t alt) override; void changeTForm(Terraform *in_tform); void changeGen() { ++gen; } diff --git a/prog/gameLibs/quirrel/bindQuirrelEx/dagorSystem.cpp b/prog/gameLibs/quirrel/bindQuirrelEx/dagorSystem.cpp index 8398af116..fbf67ef99 100644 --- a/prog/gameLibs/quirrel/bindQuirrelEx/dagorSystem.cpp +++ b/prog/gameLibs/quirrel/bindQuirrelEx/dagorSystem.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #if _TARGET_PC_WIN #include @@ -137,7 +138,17 @@ void register_dagor_system(SqModules *module_mgr) /// @skipline .SetValue("DBGLEVEL", DAGOR_DBGLEVEL) - /// @const DBGLEVEL + /// @const DBGLEVEL + + /// @skipline +#if DAGOR_ADDRESS_SANITIZER + .SetValue("SANITIZER", "address") +#elif DAGOR_THREAD_SANITIZER + .SetValue("SANITIZER", "thread") +#else + .SetValue("SANITIZER", /*null*/ Sqrat::Object{}) +#endif + /// @const SANITIZER /// @skipline .SetValue("ARCH_BITS", targetArch) diff --git a/prog/gameLibs/rendInst/debug/rendinstRulerDebug.cpp b/prog/gameLibs/rendInst/debug/rendinstRulerDebug.cpp new file mode 100644 index 000000000..1b2288e0f --- /dev/null +++ b/prog/gameLibs/rendInst/debug/rendinstRulerDebug.cpp @@ -0,0 +1,53 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. + +#include +#include +#include "../riGen/riGenData.h" +#include "../riGen/riGenExtra.h" +#include +#include +#include + +void rendinst::draw_rendinst_info(const Point3 &intersection_pos, const TMatrix &cam_tm, const rendinst::RendInstDesc &desc) +{ + begin_draw_cached_debug_lines(); + + float dist = length(cam_tm.getcol(3) - intersection_pos); + draw_cached_debug_line(cam_tm.getcol(3) - Point3(0.0, 0.05, -0.075), intersection_pos, E3DCOLOR(0xFFFF2020)); + float hitRad = pow(dist / 300.0f, 0.8f); + draw_cached_debug_sphere(intersection_pos, hitRad, E3DCOLOR(0xFFFFFF00), 24); + + // draw_cached_debug_sphere(collres.boundingSphereCenter, collres.boundingSphereRad, E3DCOLOR(0xFFBBBB00), 24); + + if (desc.isValid() && desc.isRiExtra()) + { + AutoLockReadPrimaryAndExtra lock; + TMatrix tm = rendinst::getRIGenMatrixNoLock(desc); + const char *name = rendinst::getRIGenResName(desc); + G_UNUSED(tm); + + RendInstGenData *rgl = RendInstGenData::getGenDataByLayer(desc); + int riPoolRef = rendinst::riExtra[desc.pool].riPoolRef; + + char buf[1024]; + snprintf(buf, sizeof(buf), "%s: %s", desc.isRiExtra() ? "RiExtra" : "RiGen", name); + buf[sizeof(buf) - 1] = '\0'; + float markOffsetScale = dist * 0.22f; + Point3 markPos = intersection_pos + cam_tm.getcol(0) * markOffsetScale + cam_tm.getcol(1) * markOffsetScale * 0.75f; + add_debug_text_mark(markPos, buf); + + snprintf(buf, sizeof(buf), "riExtra.initialHP: %.1f", rendinst::riExtra[desc.pool].initialHP); + buf[sizeof(buf) - 1] = '\0'; + add_debug_text_mark(markPos, buf, -1, 1.2f); + + snprintf(buf, sizeof(buf), "riExtra.immortal: %i", rendinst::riExtra[desc.pool].immortal); + buf[sizeof(buf) - 1] = '\0'; + add_debug_text_mark(markPos, buf, -1, 2.4f); + + snprintf(buf, sizeof(buf), "riProperties.immortal: %i", rgl->rtData->riProperties[riPoolRef].immortal); + buf[sizeof(buf) - 1] = '\0'; + add_debug_text_mark(markPos, buf, -1, 3.6f); + } + + end_draw_cached_debug_lines(); +} diff --git a/prog/gameLibs/rendInst/jamfile b/prog/gameLibs/rendInst/jamfile index 99e84db3e..51faec8a1 100644 --- a/prog/gameLibs/rendInst/jamfile +++ b/prog/gameLibs/rendInst/jamfile @@ -50,6 +50,7 @@ Sources = visibility/extraVisibility.cpp debug/collisionVisualization.cpp + debug/rendinstRulerDebug.cpp ; if $(HaveRenderer) = yes { diff --git a/prog/gameLibs/rendInst/rendInstGen.cpp b/prog/gameLibs/rendInst/rendInstGen.cpp index 260f7e269..9c7960f58 100644 --- a/prog/gameLibs/rendInst/rendInstGen.cpp +++ b/prog/gameLibs/rendInst/rendInstGen.cpp @@ -2417,7 +2417,7 @@ void rendinst::setLoadingState(bool is_loading) rendinst::gpuobjects::flush_pending(); } }; - execute_delayed_action_on_main_thread(new ChangeLoadingState(is_loading), true); + execute_delayed_action_on_main_thread(new ChangeLoadingState(is_loading)); } bool rendinst::isRiExtraLoaded() { return !RendInstGenData::isLoading && !riExtra.empty(); } diff --git a/prog/gameLibs/rendInst/rendInstGenCollision.cpp b/prog/gameLibs/rendInst/rendInstGenCollision.cpp index 80fccd7b2..e0d39ad11 100644 --- a/prog/gameLibs/rendInst/rendInstGenCollision.cpp +++ b/prog/gameLibs/rendInst/rendInstGenCollision.cpp @@ -1884,17 +1884,26 @@ CollisionInfo getRiGenDestrInfo(const RendInstDesc &desc) struct CallbackAddStrat : public MaterialRayStrat { rendinst::RendInstCollisionCB *callback; + dag::RelocatableFixedVector, TraceMeshFaces::RendinstCache::MAX_ENTRIES> collInfoQueue; + bool useQueue; - CallbackAddStrat(rendinst::RendInstCollisionCB *cb, PhysMat::MatID ray_mat = PHYSMAT_INVALID) : - MaterialRayStrat(ray_mat, true), callback(cb) + // set use_queue to true if you want unlock ri mutexes before callback processing + CallbackAddStrat(rendinst::RendInstCollisionCB *cb, bool use_queue, PhysMat::MatID ray_mat = PHYSMAT_INVALID) : + MaterialRayStrat(ray_mat, true), callback(cb), useQueue(use_queue) {} + ~CallbackAddStrat() { processQueue(); } + CheckBoxRIResultFlags executeForPos(RendInstGenData *rgl, const rendinst::RendInstDesc &ri_desc, const TMatrix &tm, const BBox3 &bbox) { - rendinst::CollisionInfo collInfo(ri_desc); - fill_collision_info(rgl, ri_desc, tm, bbox, collInfo); - callback->addTreeCheck(collInfo); + collInfoQueue.emplace_back(eastl::make_pair(false /*is_tm*/, rendinst::CollisionInfo(ri_desc))); + fill_collision_info(rgl, ri_desc, tm, bbox, collInfoQueue.back().second); + if (!useQueue) + { + callback->addTreeCheck(collInfoQueue.back().second); + collInfoQueue.clear(); + } return {}; } @@ -1903,9 +1912,13 @@ struct CallbackAddStrat : public MaterialRayStrat { DECL_ALIGN16(TMatrix, tm); v_mat_43ca_from_mat44(&tm[0][0], v_tm); - rendinst::CollisionInfo collInfo(ri_desc); - fill_collision_info(rgl, ri_desc, tm, bbox, collInfo); - callback->addCollisionCheck(collInfo); + collInfoQueue.emplace_back(eastl::make_pair(true /*is_tm*/, rendinst::CollisionInfo(ri_desc))); + fill_collision_info(rgl, ri_desc, tm, bbox, collInfoQueue.back().second); + if (!useQueue) + { + callback->addCollisionCheck(collInfoQueue.back().second); + collInfoQueue.clear(); + } return {}; } @@ -1916,6 +1929,18 @@ struct CallbackAddStrat : public MaterialRayStrat v_mat_43ca_from_mat44(&tm[0][0], v_tm); return executeForPos(rgl, ri_desc, tm, bbox); } + + void processQueue() + { + for (auto &q : collInfoQueue) + { + if (q.first) + callback->addCollisionCheck(q.second); + else + callback->addTreeCheck(q.second); + } + collInfoQueue.clear(); + } }; struct CheckIntersectionStrat : public MaterialRayStrat @@ -2455,7 +2480,7 @@ void clipCapsuleRI(const ::Capsule &c, Point3 &lpt, Point3 &wpt, real &md, const else { RiClipCapsuleCallback callback(c, lpt, wpt, md, movedirNormalized); - CallbackAddStrat strat(&callback, -1); + CallbackAddStrat strat(&callback, false /*use_queue*/, -1); BBox3 wbb = c.getBoundingBoxScalar(); FOR_EACH_RG_LAYER_DO (rgl) @@ -2559,9 +2584,9 @@ void testObjToRIGenIntersection(const BBox3 &obj_box, const TMatrix &obj_tm, ren BBox3 aabb; v_stu_bbox3(aabb, objFullBBox); - CallbackAddStrat strat(&callback, ray_mat); + CallbackAddStrat strat(&callback, unlock_in_cb, ray_mat); // strat callback should be always executed with lock FOR_EACH_RG_LAYER_DO (rgl) - testObjToRIGenIntersectionNoCache(_layer, obj_box, aabb, obj_tm, ri_types, strat, unlock_in_cb); + testObjToRIGenIntersectionNoCache(_layer, obj_box, aabb, obj_tm, ri_types, strat, false /*unlock_in_cb*/); } CheckBoxRIResultFlags checkBoxToRIGenIntersection(const BBox3 &box) diff --git a/prog/gameLibs/rendInst/rendInstGenDebris.cpp b/prog/gameLibs/rendInst/rendInstGenDebris.cpp index d68e8e2b7..5786acd1d 100644 --- a/prog/gameLibs/rendInst/rendInstGenDebris.cpp +++ b/prog/gameLibs/rendInst/rendInstGenDebris.cpp @@ -328,31 +328,33 @@ rendinst::DestroyedRi *rendinst::doRIGenExternalControl(const rendinst::RendInst return ri; } -bool rendinst::fillTreeInstData(const RendInstDesc &desc, const Point2 &impact_velocity_xz, TreeInstData &out_data) +bool rendinst::fillTreeInstData(const RendInstDesc &desc, const Point2 &impact_velocity_xz, bool from_damage, TreeInstData &out_data) { + RendInstGenData *rgl = nullptr; + int pool = -1; + rendinstdestr::TreeDestr::BranchDestr *branchDestr = nullptr; if (desc.isRiExtra()) { - const int pool = rendinst::riExtra[desc.pool].riPoolRef; + pool = rendinst::riExtra[desc.pool].riPoolRef; if (pool < 0) return false; - RendInstGenData *rgl = rendinst::getRgLayer(rendinst::riExtra[desc.pool].riPoolRefLayer); + rgl = rendinst::getRgLayer(rendinst::riExtra[desc.pool].riPoolRefLayer); G_ASSERT(rgl && pool < rgl->rtData->riProperties.size()); - - if (rgl) - branchDestr = &rgl->rtData->riProperties[pool].treeBranchDestr; } else { - RendInstGenData *rgl = RendInstGenData::getGenDataByLayer(desc); - if (rgl) - branchDestr = &rgl->rtData->riProperties[desc.pool].treeBranchDestr; + rgl = RendInstGenData::getGenDataByLayer(desc); + pool = desc.pool; } - if (!branchDestr) + if (!rgl) return false; + branchDestr = + from_damage ? &rgl->rtData->riProperties[pool].treeBranchDestrFromDamage : &rgl->rtData->riProperties[pool].treeBranchDestrOther; + out_data.rndSeed = _rnd(rendinstTreeRndSeed); out_data.impactXZ = impact_velocity_xz; out_data.branchDestr.apply(*branchDestr); @@ -365,26 +367,50 @@ void rendinst::updateTreeDestrRenderData(const TMatrix &original_tm, riex_handle if (!tree_inst_data.branchDestr.enableBranchDestruction && !tree_inst_debug_data) return; - int timerMs = (int)((tree_inst_data.timer + (tree_inst_debug_data ? tree_inst_debug_data->timer_offset : 0.0f)) * 1000.0); - int randSeed = tree_inst_data.rndSeed % (1 << 8); - int timer_seed = (timerMs << 8) | randSeed; + auto &branch = tree_inst_debug_data + ? (tree_inst_debug_data->last_object_was_from_damage ? tree_inst_debug_data->branchDestrFromDamage + : tree_inst_debug_data->branchDestrOther) + : tree_inst_data.branchDestr; - auto &branch = tree_inst_debug_data ? tree_inst_debug_data->branchDestr : tree_inst_data.branchDestr; Point2 impulseXZ = tree_inst_data.impactXZ * branch.impulseMul; + Point4 perInstanceData[5]; + + auto fnPack = [](float v, float maxValue, int bits, int offset) -> int { + return clamp((int)(v / maxValue * ((1 << bits) - 1)), 0, (1 << bits) - 1) << offset; + }; + + float impulseMagnitude = impulseXZ.length(); + float branchFallingChance = (impulseMagnitude - branch.impulseMin) / max(0.01f, branch.impulseMax - branch.impulseMin); + if (branchFallingChance <= 0.0f) + return; + + int randSeed = tree_inst_data.rndSeed % (1 << 8); + int randSeed_branchFallingChance = randSeed << 16 | fnPack(branchFallingChance, 1.0f, 16, 0); + + float branchRangeInv = 1.0f / (branch.branchSizeMax - branch.branchSizeMin); + int branchSizeData = + fnPack(branch.branchSizeSlowDown, 1.0f, 8, 16) | fnPack(branch.branchSizeMin, 100.0f, 8, 8) | fnPack(branchRangeInv, 5.0f, 8, 0); + + perInstanceData[0] = {(float &)randSeed_branchFallingChance, (float &)branchSizeData, impulseXZ.x, impulseXZ.y}; + + float timerSec = (tree_inst_data.timer + (tree_inst_debug_data ? tree_inst_debug_data->timer_offset : 0.0f)); + float disappearTimerSec = tree_inst_data.disappearStartTime < 0.0f ? timerSec : (int)tree_inst_data.disappearStartTime; + + int timersData = fnPack(timerSec, 50.0f, 16, 16) | fnPack(disappearTimerSec, 50.0f, 16, 0); + + int rotationData = fnPack(branch.rotateRandomAngleSpread, 10.0f, 8, 24) | fnPack(branch.rotateRandomSpeedMulX, 10.0f, 8, 16) | + fnPack(branch.rotateRandomSpeedMulY, 10.0f, 8, 8) | fnPack(branch.rotateRandomSpeedMulZ, 10.0f, 8, 0); + + int speedData = fnPack(branch.fallingSpeedMul, 2.0f, 8, 16) | fnPack(branch.fallingSpeedRnd, 1.0f, 8, 8) | + fnPack(branch.horizontalSpeedMul, 20.0f, 8, 0); - int rotateSpeedMulCoded = clamp((int)(branch.rotateRandomSpeedMulX * 25.0f), 0, 255) << 16 | - clamp((int)(branch.rotateRandomSpeedMulY * 25.0f), 0, 255) << 8 | - clamp((int)(branch.rotateRandomSpeedMulZ * 25.0f), 0, 255); + perInstanceData[1] = {(float &)timersData, (float &)speedData, (float &)rotationData, 0.0f}; - Point4 perInstanceData[6]; - perInstanceData[0] = {0.0f, (float &)(timer_seed), impulseXZ.x, impulseXZ.y}; - perInstanceData[1] = {branch.impulseMaxLength, branch.branchSizeMax, (float &)rotateSpeedMulCoded, branch.rotateRandomAngleSpread}; - perInstanceData[2] = {branch.branchSizeSlowDown, branch.fallingSpeedMul, branch.fallingSpeedRnd, branch.horizontalSpeedMul}; - perInstanceData[3] = {original_tm.m[0][0], original_tm.m[0][1], original_tm.m[0][2], original_tm.m[1][0]}; - perInstanceData[4] = {original_tm.m[1][1], original_tm.m[1][2], original_tm.m[2][0], original_tm.m[2][1]}; - perInstanceData[5] = {original_tm.m[2][2], original_tm.m[3][0], original_tm.m[3][1], original_tm.m[3][2]}; + perInstanceData[2] = {original_tm.m[0][0], original_tm.m[0][1], original_tm.m[0][2], original_tm.m[1][0]}; + perInstanceData[3] = {original_tm.m[1][1], original_tm.m[1][2], original_tm.m[2][0], original_tm.m[2][1]}; + perInstanceData[4] = {original_tm.m[2][2], original_tm.m[3][0], original_tm.m[3][1], original_tm.m[3][2]}; - uint32_t perInstanceDataSize = 6; + uint32_t perInstanceDataSize = countof(perInstanceData); rendinst::setRiExtraPerInstanceRenderData(ri_handle, perInstanceData, perInstanceDataSize); } @@ -1072,8 +1098,12 @@ void RendInstGenData::RtData::initDebris(const DataBlock &ri_blk, int (*get_fx_t objectDmgBlk->paramExists("canopyTriangle") || objectDmgBlk->paramExists("canopyTopOffset"); riProperties[i].canopyOpacity = objectDmgBlk->getReal("canopyOpacity", useCanopy ? 1.0f : 0.f); - riProperties[i].treeBranchDestr = treeDestr.branchDestr; - rendinstdestr::branch_destr_load_from_blk(riProperties[i].treeBranchDestr, objectDmgBlk->getBlockByNameEx("branchDestr")); + riProperties[i].treeBranchDestrFromDamage = treeDestr.branchDestrFromDamage; + rendinstdestr::branch_destr_load_from_blk(riProperties[i].treeBranchDestrFromDamage, + objectDmgBlk->getBlockByNameEx("branchDestr")); + riProperties[i].treeBranchDestrOther = treeDestr.branchDestrOther; + rendinstdestr::branch_destr_load_from_blk(riProperties[i].treeBranchDestrOther, + objectDmgBlk->getBlockByNameEx("branchDestrOther")); riDestr[i].destrFxName = objectDmgBlk->getStr("destrFx", ""); riDestr[i].destrFxTemplate = objectDmgBlk->getStr("destrFxTemplate", nullptr); diff --git a/prog/gameLibs/rendInst/render/extra/riExtraRendererT.h b/prog/gameLibs/rendInst/render/extra/riExtraRendererT.h index c1835fbd1..cbf05f05e 100644 --- a/prog/gameLibs/rendInst/render/extra/riExtraRendererT.h +++ b/prog/gameLibs/rendInst/render/extra/riExtraRendererT.h @@ -296,7 +296,7 @@ class RiExtraRendererT : public DynamicVariantsPolicy //-V730 #endif shaders::RenderStateId curRstate = shaders::RenderStateId(); - shaders::TexStateIdx curTstate = shaders::TexStateIdx(); + uint32_t curState = 0xFFFFFFFF; bool currentTessellationState = !list[0].isTessellated; for (auto &rl : list) @@ -324,12 +324,12 @@ class RiExtraRendererT : public DynamicVariantsPolicy //-V730 bool skipApply = false; if (optimizeDepthPass && rl.drawOrder_stage->stage == ShaderMesh::STG_opaque && curRstate == rl.rstate && !(rl.state & RIExRenderRecord::DISABLE_OPTIMIZATION_BIT_STATE) && - (rl.isTessellated == currentTessellationState && (!rl.isTessellated || curTstate == rl.tstate))) + (rl.isTessellated == currentTessellationState && (!rl.isTessellated || curState == rl.state))) { skipApply = true; // we only switch renderstate - zbias,culling, etc } curRstate = rl.rstate; - curTstate = rl.tstate; + curState = rl.state; currentTessellationState = rl.isTessellated; RiExtraPool &riPool = riExtra[riResOrder[rl.poolOrder] & RI_RES_ORDER_COUNT_MASK]; @@ -391,7 +391,7 @@ class RiExtraRendererT : public DynamicVariantsPolicy //-V730 if (rl.state & RIExRenderRecord::DISABLE_OPTIMIZATION_BIT_STATE) { curRstate = shaders::RenderStateId(); - curTstate = shaders::TexStateIdx(); + curState = 0xFFFFFFFF; } } #if USE_DEPTH_PREPASS_FOR_TREES diff --git a/prog/gameLibs/rendInst/riGen/riGenData.h b/prog/gameLibs/rendInst/riGen/riGenData.h index 2514c59d7..6a3026dac 100644 --- a/prog/gameLibs/rendInst/riGen/riGenData.h +++ b/prog/gameLibs/rendInst/riGen/riGenData.h @@ -180,7 +180,8 @@ struct RendInstGenData float canopyTopPart; float canopyWidthPart; float canopyOpacity; - rendinstdestr::TreeDestr::BranchDestr treeBranchDestr; + rendinstdestr::TreeDestr::BranchDestr treeBranchDestrFromDamage; + rendinstdestr::TreeDestr::BranchDestr treeBranchDestrOther; }; struct ElemMask diff --git a/prog/gameLibs/rendInst/treeDestr.cpp b/prog/gameLibs/rendInst/treeDestr.cpp index 9dc3d5154..aa9d9510d 100644 --- a/prog/gameLibs/rendInst/treeDestr.cpp +++ b/prog/gameLibs/rendInst/treeDestr.cpp @@ -30,7 +30,9 @@ void rendinstdestr::tree_destr_load_from_blk(const DataBlock &blk) tree_destr.constraintLimitY = blk.getPoint2("constraintLimitY", Point2(0.f, 0.f)); tree_destr.canopyLinearDamping = blk.getReal("canopyLinearDamping", 0.9f); tree_destr.canopyAngularDamping = blk.getReal("canopyAngularDamping", 0.9f); - branch_destr_load_from_blk(tree_destr.branchDestr, blk.getBlockByNameEx("branchDestr")); + branch_destr_load_from_blk(tree_destr.branchDestrFromDamage, blk.getBlockByNameEx("branchDestr")); + tree_destr.branchDestrOther = tree_destr.branchDestrFromDamage; + branch_destr_load_from_blk(tree_destr.branchDestrOther, blk.getBlockByNameEx("branchDestrOther")); read_interpolate_tab_float_p2(tree_destr.radiusToImpulse, *blk.getBlockByNameEx("radiusToImpulse")); } @@ -44,7 +46,9 @@ void rendinstdestr::branch_destr_load_from_blk(TreeDestr::BranchDestr &target, c target.enableBranchDestruction = blk->getBool("enable", loadingMultipliers ? true : target.enableBranchDestruction); target.impulseMul = blk->getReal("impulseMul", loadingMultipliers ? 1.0f : target.impulseMul); - target.impulseMaxLength = blk->getReal("impulseMaxLength", loadingMultipliers ? 1.0f : target.impulseMaxLength); + target.impulseMin = blk->getReal("impulseMin", loadingMultipliers ? 1.0f : target.impulseMin); + target.impulseMax = blk->getReal("impulseMax", loadingMultipliers ? 1.0f : target.impulseMax); + target.branchSizeMin = blk->getReal("branchSizeMin", loadingMultipliers ? 1.0f : target.branchSizeMin); target.branchSizeMax = blk->getReal("branchSizeMax", loadingMultipliers ? 1.0f : target.branchSizeMax); target.rotateRandomSpeedMulX = blk->getReal("rotateSpeedMul", loadingMultipliers ? 1.0f : target.rotateRandomSpeedMulX); target.rotateRandomSpeedMulY = blk->getReal("rotateSpeedMulY", loadingMultipliers ? 1.0f : target.rotateRandomSpeedMulY); @@ -54,6 +58,7 @@ void rendinstdestr::branch_destr_load_from_blk(TreeDestr::BranchDestr &target, c target.fallingSpeedMul = blk->getReal("fallingSpeedMul", loadingMultipliers ? 1.0f : target.fallingSpeedMul); target.fallingSpeedRnd = blk->getReal("fallingSpeedRnd", loadingMultipliers ? 1.0f : target.fallingSpeedRnd); target.horizontalSpeedMul = blk->getReal("horizontalSpeedMul", loadingMultipliers ? 1.0f : target.horizontalSpeedMul); + target.maxVisibleDistance = blk->getReal("maxVisibleDistance", loadingMultipliers ? 1.0f : target.maxVisibleDistance); } const rendinstdestr::TreeDestr &rendinstdestr::get_tree_destr() { return tree_destr; } @@ -65,7 +70,9 @@ void rendinstdestr::TreeDestr::BranchDestr::apply(const BranchDestr &other) { enableBranchDestruction = enableBranchDestruction && other.enableBranchDestruction; impulseMul *= other.impulseMul; - impulseMaxLength *= other.impulseMaxLength; + impulseMin *= other.impulseMin; + impulseMax *= other.impulseMax; + branchSizeMin *= other.branchSizeMin; branchSizeMax *= other.branchSizeMax; rotateRandomSpeedMulX *= other.rotateRandomSpeedMulX; rotateRandomSpeedMulY *= other.rotateRandomSpeedMulY; @@ -75,12 +82,15 @@ void rendinstdestr::TreeDestr::BranchDestr::apply(const BranchDestr &other) fallingSpeedMul *= other.fallingSpeedMul; fallingSpeedRnd *= other.fallingSpeedRnd; horizontalSpeedMul *= other.horizontalSpeedMul; + maxVisibleDistance *= other.maxVisibleDistance; } else { enableBranchDestruction = other.enableBranchDestruction; impulseMul = other.impulseMul; - impulseMaxLength = other.impulseMaxLength; + impulseMin = other.impulseMin; + impulseMax = other.impulseMax; + branchSizeMin = other.branchSizeMin; branchSizeMax = other.branchSizeMax; rotateRandomSpeedMulX = other.rotateRandomSpeedMulX; rotateRandomSpeedMulY = other.rotateRandomSpeedMulY; @@ -90,5 +100,6 @@ void rendinstdestr::TreeDestr::BranchDestr::apply(const BranchDestr &other) fallingSpeedMul = other.fallingSpeedMul; fallingSpeedRnd = other.fallingSpeedRnd; horizontalSpeedMul = other.horizontalSpeedMul; + maxVisibleDistance = other.maxVisibleDistance; } } diff --git a/prog/gameLibs/render/bigLightsShadows.cpp b/prog/gameLibs/render/bigLightsShadows.cpp index bf8907a27..4c392bd4f 100644 --- a/prog/gameLibs/render/bigLightsShadows.cpp +++ b/prog/gameLibs/render/bigLightsShadows.cpp @@ -35,12 +35,6 @@ static int big_light_posVarIds[MAX_COUNT] = {-1, -1, -1, -1}; class BigLightsShadows { public: - TMatrix4 prevGlobTm = TMatrix4::IDENT, prevProjTm = TMatrix4::IDENT; - Point4 prevViewVecLT; - Point4 prevViewVecRT; - Point4 prevViewVecLB; - Point4 prevViewVecRB; - DPoint3 prevWorldPos; unsigned int frame = 0; unsigned resetGen = 0; carray targetTex; @@ -48,11 +42,10 @@ class BigLightsShadows int w = 0, h = 0; uint32_t maxCnt = 0; PostFxRenderer render_big_light_shadows, temporal_big_light_shadows; - void render(const DPoint3 *world_pos); void init(int w, int h, unsigned int max_lights_count, const char *prefix); void close(); - void render(const DPoint3 *world_pos, const Point4 *pos_rad, uint32_t cnt); + void render(const Point4 *pos_rad, uint32_t cnt); const UniqueTex &get() const; void setTex(int reg); }; @@ -85,13 +78,6 @@ void BigLightsShadows::init(int w_, int h_, unsigned int maxCnt_, const char *pr render_big_light_shadows.init("render_big_light_shadows"); temporal_big_light_shadows.init("temporal_big_light_shadows"); - prevGlobTm = TMatrix4::IDENT; - prevProjTm = TMatrix4::IDENT; - prevViewVecLT = Point4(0, 0, 0, 0); - prevViewVecRT = Point4(0, 0, 0, 0); - prevViewVecLB = Point4(0, 0, 0, 0); - prevViewVecRB = Point4(0, 0, 0, 0); - prevWorldPos = DPoint3(0, 0, 0); } void BigLightsShadows::close() @@ -100,7 +86,7 @@ void BigLightsShadows::close() i.close(); } -void BigLightsShadows::render(const DPoint3 *world_pos, const Point4 *pos_rad, uint32_t cnt) +void BigLightsShadows::render(const Point4 *pos_rad, uint32_t cnt) { cnt = min(cnt, maxCnt); TIME_D3D_PROFILE(big_shadows_total); @@ -120,12 +106,6 @@ void BigLightsShadows::render(const DPoint3 *world_pos, const Point4 *pos_rad, u ShaderGlobal::set_int(shadow_frameVarId, frame); - TMatrix viewTm; - TMatrix4 projTm; - d3d::gettm(TM_VIEW, viewTm); - d3d::gettm(TM_PROJ, &projTm); - set_reprojection(viewTm, projTm, prevProjTm, prevWorldPos, prevGlobTm, prevViewVecLT, prevViewVecRT, prevViewVecLB, prevViewVecRB, - world_pos); if (cnt == 0) { d3d::set_render_target(targetTex[current].getTex2D(), 0); @@ -172,10 +152,10 @@ void destroy_big_lights_shadows(BigLightsShadows *&r) del_it(r); } -void render_big_lights_shadows(BigLightsShadows *r, const Point4 *pos_rad, uint32_t cnt, const DPoint3 *world_pos) +void render_big_lights_shadows(BigLightsShadows *r, const Point4 *pos_rad, uint32_t cnt) { if (r) - r->render(world_pos, pos_rad, cnt); + r->render(pos_rad, cnt); } void set_big_lights_shadows(BigLightsShadows *r, int reg) diff --git a/prog/gameLibs/render/cascadeShadows.cpp b/prog/gameLibs/render/cascadeShadows.cpp index b2479b0f1..c1d8e7500 100644 --- a/prog/gameLibs/render/cascadeShadows.cpp +++ b/prog/gameLibs/render/cascadeShadows.cpp @@ -67,6 +67,7 @@ static int csmShadowFadeOutVarId = -1, shadowCascadeDepthRangeVarId = -1, deferr VAR(csm_uv_minmax_cascade_0) \ VAR(csm_uv_minmax_cascade_1) \ VAR(csm_uv_minmax_cascade_2) \ + VAR(shadow_cascade_data) \ VAR(shadow_cascade_tm_transp) \ VAR(shadow_cascade_tc_mul_offset) \ VAR(csm_culling_near_planes) @@ -84,7 +85,8 @@ GLOBAL_CONST_LIST class CascadeShadowsPrivate { public: - CascadeShadowsPrivate(ICascadeShadowsClient *in_client, const CascadeShadows::Settings &in_settings); + String resPostfix; + CascadeShadowsPrivate(ICascadeShadowsClient *in_client, const CascadeShadows::Settings &in_settings, String &&res_postfix); ~CascadeShadowsPrivate(); @@ -120,6 +122,7 @@ class CascadeShadowsPrivate void setNearCullingNearPlaneToShader(); void disable() { numCascadesToRender = 0; } bool isEnabled() const { return numCascadesToRender != 0; } + void uploadCSMBuffer(const Color4 *tm, const Color4 *off); void invalidate() { for (unsigned int cascadeNo = 0; cascadeNo < shadowSplits.size(); cascadeNo++) @@ -227,7 +230,7 @@ class CascadeShadowsPrivate const TMatrix4 &projtm, float z_near, float z_far, float next_z_far, const Point3 &anchor, float anchor_radius, ShadowSplit &split); - UniqueBufHolder csmBuffer; + UniqueBuf csmBuffer; bool needSsss = false; int maxCascadesPossible = CascadeShadows::MAX_CASCADES; }; @@ -259,8 +262,9 @@ void CascadeShadowsPrivate::createOverrides() } -CascadeShadowsPrivate::CascadeShadowsPrivate(ICascadeShadowsClient *in_client, const CascadeShadows::Settings &in_settings) : - client(in_client), settings(in_settings), dbgModeSettings(false), mobileAreaUpdateRP(nullptr) +CascadeShadowsPrivate::CascadeShadowsPrivate(ICascadeShadowsClient *in_client, const CascadeShadows::Settings &in_settings, + String &&res_postfix) : + client(in_client), settings(in_settings), dbgModeSettings(false), mobileAreaUpdateRP(nullptr), resPostfix(std::move(res_postfix)) { G_ASSERT(client); @@ -341,6 +345,10 @@ void CascadeShadowsPrivate::createDepthShadow(int splits_w, int splits_h, int wi "shadow_cascade_depth_tex"); createMobileRP(format, rtFmt); } + + if (shadow_cascade_dataVarId != -1) + csmBuffer = dag::buffers::create_one_frame_cb(CascadeShadows::MAX_CASCADES * 4 + CascadeShadows::MAX_CASCADES, + String(0, "shadow_cascade_data%s", resPostfix.c_str()).c_str()); } @@ -355,6 +363,7 @@ void CascadeShadowsPrivate::closeDepthShadow() { internalCascades.close(); shadowCascadesFakeRT.close(); + csmBuffer.close(); if (mobileAreaUpdateRP) { @@ -995,6 +1004,23 @@ carray CascadeShadowsPrivate::getTrans return transposed; } +void CascadeShadowsPrivate::uploadCSMBuffer(const Color4 *tm, const Color4 *off) +{ + if (csmBuffer) + { + Color4 uploadData[CascadeShadows::MAX_CASCADES * 4 + CascadeShadows::MAX_CASCADES]; + memcpy(uploadData, tm, sizeof(Color4) * CascadeShadows::MAX_CASCADES * 4); + memcpy(uploadData + CascadeShadows::MAX_CASCADES * 4, off, sizeof(Color4) * CascadeShadows::MAX_CASCADES); + + G_ASSERT_RETURN(csmBuffer, ); + csmBuffer->updateData(0, sizeof(uploadData), uploadData, VBLOCK_DISCARD); + ShaderGlobal::set_buffer(shadow_cascade_dataVarId, csmBuffer.getBufId()); + } + + ShaderGlobal::set_color4_array(shadow_cascade_tm_transpVarId, tm, maxCascadesPossible * 4); + ShaderGlobal::set_color4_array(shadow_cascade_tc_mul_offsetVarId, off, maxCascadesPossible); +} + void CascadeShadowsPrivate::setSamplingBiasToShader(float value) { carray transposed = getTransposedCSMTm(); @@ -1003,7 +1029,7 @@ void CascadeShadowsPrivate::setSamplingBiasToShader(float value) // z component of 4-th column of every matrix is resposible for cmp value transposed[i * 4 + 3].b += value; } - ShaderGlobal::set_color4_array(shadow_cascade_tm_transpVarId, transposed.data(), maxCascadesPossible * 4); + uploadCSMBuffer(transposed.data(), shadowCascadeTcMulOffset.data()); } void CascadeShadowsPrivate::setCascadesToShader() @@ -1012,8 +1038,7 @@ void CascadeShadowsPrivate::setCascadesToShader() const carray transposed = getTransposedCSMTm(); - ShaderGlobal::set_color4_array(shadow_cascade_tm_transpVarId, transposed.data(), maxCascadesPossible * 4); - ShaderGlobal::set_color4_array(shadow_cascade_tc_mul_offsetVarId, shadowCascadeTcMulOffset.data(), maxCascadesPossible); + uploadCSMBuffer(transposed.data(), shadowCascadeTcMulOffset.data()); ShaderGlobal::set_color4(csm_world_view_posVarId, P3D(shadowSplits[0].viewPos), 0); } @@ -1063,12 +1088,13 @@ CascadeShadows::ModeSettings::ModeSettings() } /*static*/ -CascadeShadows *CascadeShadows::make(ICascadeShadowsClient *in_client, const Settings &in_settings) +CascadeShadows *CascadeShadows::make(ICascadeShadowsClient *in_client, const Settings &in_settings, String &&res_postfix) { int cspalign = max((int)alignof(CascadeShadowsPrivate) - (int)sizeof(CascadeShadows), 0); char *m = (char *)memalloc(sizeof(CascadeShadows) + cspalign + sizeof(CascadeShadowsPrivate)); auto pSelf = (CascadeShadows *)m; - pSelf->d = new ((char *)(pSelf + 1) + cspalign, _NEW_INPLACE) CascadeShadowsPrivate(in_client, in_settings); + pSelf->d = + new ((char *)(pSelf + 1) + cspalign, _NEW_INPLACE) CascadeShadowsPrivate(in_client, in_settings, eastl::move(res_postfix)); return pSelf; } diff --git a/prog/gameLibs/render/denoiser/denoiser.cpp b/prog/gameLibs/render/denoiser/denoiser.cpp index 869f9382b..4407b0f3e 100644 --- a/prog/gameLibs/render/denoiser/denoiser.cpp +++ b/prog/gameLibs/render/denoiser/denoiser.cpp @@ -137,13 +137,16 @@ static int denoiser_spec_confidence_half_resVarId = -1; static int rtao_bindless_slotVarId = -1; static int rtsm_bindless_slotVarId = -1; +static int csm_bindless_slotVarId = -1; +static int csm_sampler_bindless_slotVarId = -1; static int rtr_bindless_slotVarId = -1; static int bindless_range = -1; static const int rtao_bindless_index = 0; static const int rtsm_bindless_index = 1; -static const int rtr_bindless_index = 2; +static const int csm_bindless_index = 2; +static const int rtr_bindless_index = 3; struct TransientKey { @@ -383,7 +386,6 @@ struct RelaxSharedConstants uint32_t diffMaterialMask; uint32_t specMaterialMask; uint32_t resetHistory; - uint32_t padding; }; static int divide_up(int x, int y) { return (x + y - 1) / y; } @@ -541,11 +543,13 @@ void initialize(int w, int h) rtao_bindless_slotVarId = get_shader_variable_id("rtao_bindless_slot"); rtsm_bindless_slotVarId = get_shader_variable_id("rtsm_bindless_slot"); + csm_bindless_slotVarId = get_shader_variable_id("csm_bindless_slot", true); + csm_sampler_bindless_slotVarId = get_shader_variable_id("csm_sampler_bindless_slot", true); rtr_bindless_slotVarId = get_shader_variable_id("rtr_bindless_slot"); ShaderGlobal::set_int4(denoiser_resolutionVarId, render_width, render_height, 0, 0); - bindless_range = d3d::allocate_bindless_resource_range(RES3D_TEX, 3); + bindless_range = d3d::allocate_bindless_resource_range(RES3D_TEX, 4); } #if ENABLE_NRD_INTEGRATION_TEST @@ -845,7 +849,7 @@ void teardown() if (bindless_range > 0) { - d3d::free_bindless_resource_range(RES3D_TEX, bindless_range, 1); + d3d::free_bindless_resource_range(RES3D_TEX, bindless_range, 4); bindless_range = -1; } @@ -1148,6 +1152,14 @@ void denoise_shadow(const ShadowDenoiser ¶ms) d3d::update_bindless_resource(bindless_range + rtsm_bindless_index, params.denoisedShadowMap); d3d::resource_barrier({params.denoisedShadowMap, RB_RO_SRV | RB_STAGE_ALL_SHADERS, 0, 0}); ShaderGlobal::set_int(rtsm_bindless_slotVarId, bindless_range + rtsm_bindless_index); + + if (params.csmTexture) + { + d3d::update_bindless_resource(bindless_range + csm_bindless_index, params.csmTexture); + ShaderGlobal::set_int(csm_bindless_slotVarId, bindless_range + csm_bindless_index); + auto samplerIx = d3d::register_bindless_sampler(params.csmTexture); + ShaderGlobal::set_int(csm_sampler_bindless_slotVarId, samplerIx); + } } static ReblurSharedConstants make_reblur_shared_constants(const Point4 &hit_dist_params, const Point4 &antilag_settings, @@ -2042,10 +2054,18 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { TIME_D3D_PROFILE(relax::classify_tiles); - static_assert(sizeof(relaxSharedConstants) % (4 * sizeof(float)) == 0, + struct PassData + { + RelaxSharedConstants relaxSharedConstants; + uint32_t padding; + } passData; + + passData.relaxSharedConstants = relaxSharedConstants; + + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); - d3d::set_cb0_data(STAGE_CS, (const float *)&relaxSharedConstants, divide_up(sizeof(relaxSharedConstants), 16)); + d3d::set_cb0_data(STAGE_CS, (const float *)&passData, divide_up(sizeof(passData), 16)); d3d::set_tex(STAGE_CS, 0, viewZ, false); d3d::set_rwtex(STAGE_CS, 0, tiles, 0, 0); @@ -2059,6 +2079,7 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { RelaxSharedConstants relaxSharedConstants; Point4 rotator; + uint32_t padding; } passData; float ca = cos(rndAngle.x); @@ -2067,6 +2088,9 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) passData.relaxSharedConstants = relaxSharedConstants; passData.rotator = Point4(ca, sa, -sa, ca) * rndScale.x; + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + d3d::set_sampler(STAGE_CS, 0, samplerNearestClamp); d3d::set_sampler(STAGE_CS, 1, samplerLinearClamp); @@ -2083,10 +2107,21 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { TIME_D3D_PROFILE(relax::temporal_accumulation); + struct PassData + { + RelaxSharedConstants relaxSharedConstants; + uint32_t padding; + } passData; + + passData.relaxSharedConstants = relaxSharedConstants; + + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + d3d::set_sampler(STAGE_CS, 0, samplerNearestClamp); d3d::set_sampler(STAGE_CS, 1, samplerLinearClamp); - d3d::set_cb0_data(STAGE_CS, (const float *)&relaxSharedConstants, divide_up(sizeof(relaxSharedConstants), 16)); + d3d::set_cb0_data(STAGE_CS, (const float *)&passData, divide_up(sizeof(passData), 16)); d3d::set_tex(STAGE_CS, 0, tiles, false); d3d::set_tex(STAGE_CS, 1, params.denoisedReflection, false); d3d::set_tex(STAGE_CS, 2, motionVectors, false); @@ -2119,10 +2154,21 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { TIME_D3D_PROFILE(relax::history_fix); + struct PassData + { + RelaxSharedConstants relaxSharedConstants; + uint32_t padding; + } passData; + + passData.relaxSharedConstants = relaxSharedConstants; + + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + d3d::set_sampler(STAGE_CS, 0, samplerNearestClamp); d3d::set_sampler(STAGE_CS, 1, samplerLinearClamp); - d3d::set_cb0_data(STAGE_CS, (const float *)&relaxSharedConstants, divide_up(sizeof(relaxSharedConstants), 16)); + d3d::set_cb0_data(STAGE_CS, (const float *)&passData, divide_up(sizeof(passData), 16)); d3d::set_tex(STAGE_CS, 0, tiles, false); d3d::set_tex(STAGE_CS, 1, specIllumPing, false); d3d::set_tex(STAGE_CS, 2, historyLength, false); @@ -2136,10 +2182,21 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { TIME_D3D_PROFILE(relax::history_clamping); + struct PassData + { + RelaxSharedConstants relaxSharedConstants; + uint32_t padding; + } passData; + + passData.relaxSharedConstants = relaxSharedConstants; + + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + d3d::set_sampler(STAGE_CS, 0, samplerNearestClamp); d3d::set_sampler(STAGE_CS, 1, samplerLinearClamp); - d3d::set_cb0_data(STAGE_CS, (const float *)&relaxSharedConstants, divide_up(sizeof(relaxSharedConstants), 16)); + d3d::set_cb0_data(STAGE_CS, (const float *)&passData, divide_up(sizeof(passData), 16)); d3d::set_tex(STAGE_CS, 0, tiles, false); d3d::set_tex(STAGE_CS, 1, params.denoisedReflection, false); d3d::set_tex(STAGE_CS, 2, specIllumPing, false); @@ -2157,13 +2214,16 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) RelaxSharedConstants relaxSharedConstants; uint32_t stepSize; uint32_t isLastPass; - uint32_t padding[2]; + uint32_t padding[3]; } atorusData; atorusData.relaxSharedConstants = relaxSharedConstants; atorusData.stepSize = 1; atorusData.isLastPass = 0; + static_assert(sizeof(atorusData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + for (int iter = 0; iter < 5; ++iter) { TIME_D3D_PROFILE(relax::a - torus); @@ -2216,7 +2276,18 @@ static void denoise_reflection_relax(const ReflectionDenoiser ¶ms) { TIME_D3D_PROFILE(relax::validation); - d3d::set_cb0_data(STAGE_CS, (const float *)&relaxSharedConstants, divide_up(sizeof(relaxSharedConstants), 16)); + struct PassData + { + RelaxSharedConstants relaxSharedConstants; + uint32_t padding; + } passData; + + passData.relaxSharedConstants = relaxSharedConstants; + + static_assert(sizeof(passData) % (4 * sizeof(float)) == 0, + "RelaxSharedConstants size must be multiple of sizeof(float4) for d3d::set_cb0_data"); + + d3d::set_cb0_data(STAGE_CS, (const float *)&passData, divide_up(sizeof(passData), 16)); d3d::set_tex(STAGE_CS, 0, normalRoughness, false); d3d::set_tex(STAGE_CS, 1, viewZ, false); d3d::set_tex(STAGE_CS, 2, motionVectors, false); diff --git a/prog/gameLibs/render/dynmodelRenderer/dynmodelRenderer.cpp b/prog/gameLibs/render/dynmodelRenderer/dynmodelRenderer.cpp index 7fcb66c49..7c6a30542 100644 --- a/prog/gameLibs/render/dynmodelRenderer/dynmodelRenderer.cpp +++ b/prog/gameLibs/render/dynmodelRenderer/dynmodelRenderer.cpp @@ -32,7 +32,6 @@ #include #include - namespace dynrend { struct InstanceData @@ -128,6 +127,7 @@ const int bigNodeChunkVecs = sizeof(NodeChunk) / sizeof(vec4f); const int smallNodeChunkVecs = bigNodeChunkVecs - 3; static ShaderElement *replacement_shader = nullptr; +static Tab filtered_material_names; #if _TARGET_C1 | _TARGET_C2 @@ -667,6 +667,12 @@ static void instanceToChunks(ContextData &ctx, const InstanceData &instance_data if (!elems[elemNo].e) // dont_render continue; + if (filtered_material_names.size() && eastl::find(filtered_material_names.begin(), filtered_material_names.end(), + elems[elemNo].mat->getShaderClassName()) == filtered_material_names.end()) + { + continue; + } + auto &dipChunks = ctx.dipChunksByStage[shaderMeshStages.front()]; DipChunk &dipChunk = dipChunks.push_back(); initDipChunk(dipChunk, node_id, elems[elemNo], shaderMeshStages.front()); @@ -745,6 +751,12 @@ static void instanceToChunks(ContextData &ctx, const InstanceData &instance_data if (!elems[elemNo].e) // dont_render continue; + if (filtered_material_names.size() && eastl::find(filtered_material_names.begin(), filtered_material_names.end(), + elems[elemNo].mat->getShaderClassName()) == filtered_material_names.end()) + { + continue; + } + DipChunk &dipChunk = ctx.dipChunksByStage[shaderMeshStages.front()].push_back(); initDipChunk(dipChunk, node_id, elems[elemNo], shaderMeshStages.front()); dipChunk.numBones = mesh->bonesCount(); @@ -1232,6 +1244,7 @@ void set_local_offset_hint(const Point3 &hint) { localOffsetHint = hint; } void enable_separate_atest_pass(bool enable) { separateAtestPass = enable; } void replace_shader(ShaderElement *element) { replacement_shader = element; } +void set_material_filters_by_name(Tab &&material_names) { filtered_material_names = std::move(material_names); } void render_one_instance(const DynamicRenderableSceneInstance *instance, RenderMode mode, TexStreamingContext texCtx, const InitialNodes *optional_initial_nodes, const dynrend::PerInstanceRenderData *optional_render_data) @@ -1332,8 +1345,8 @@ void iterate_instances(dynrend::ContextId context_id, InstanceIterator iter, voi auto &instance = *instanceData.instance; auto &sceneRes = *instanceData.sceneRes; int nodeChunkVecs = instanceData.initialNodes ? bigNodeChunkVecs : smallNodeChunkVecs; - iter(context_id, sceneRes, instance, ctx.allNodesVisibility, instanceData.indexToAllNodesVisibility, ctx.minElemRadius, - instanceData.baseOffsetRenderData, instanceData.indexToPerInstanceRenderData, nodeChunkVecs, user_data); + iter(context_id, sceneRes, instance, ctx.perInstanceRenderData[instanceData.indexToPerInstanceRenderData], ctx.allNodesVisibility, + instanceData.indexToAllNodesVisibility, ctx.minElemRadius, instanceData.baseOffsetRenderData, nodeChunkVecs, user_data); } } diff --git a/prog/gameLibs/render/mobile_ssao.cpp b/prog/gameLibs/render/mobile_ssao.cpp index f02f6d380..95a39fb08 100644 --- a/prog/gameLibs/render/mobile_ssao.cpp +++ b/prog/gameLibs/render/mobile_ssao.cpp @@ -8,16 +8,14 @@ #include #include #include -#include #include -#include + #define GLOBAL_VARS_LIST \ VAR(ssao_tex) \ VAR(ssao_radius_factor) \ - VAR(ssao_texel_offset) \ - VAR(ssao_gbuf_prev_globtm_no_ofs_psf) + VAR(ssao_texel_offset) #define VAR(a) static int a##VarId = -1; GLOBAL_VARS_LIST @@ -97,48 +95,8 @@ void MobileSSAORenderer::applyBlur() ssaoBlurRenderer->render(); } -void set_shadervars_for_reprojection(const TMatrix4 &prev_glob_tm, const DPoint3 &prev_world_pos, const DPoint3 &world_pos) -{ - const DPoint3 move = world_pos - prev_world_pos; - - double reprojected_world_pos_d[4] = {(double)prev_glob_tm[0][0] * move.x + (double)prev_glob_tm[0][1] * move.y + - (double)prev_glob_tm[0][2] * move.z + (double)prev_glob_tm[0][3], - prev_glob_tm[1][0] * move.x + (double)prev_glob_tm[1][1] * move.y + (double)prev_glob_tm[1][2] * move.z + - (double)prev_glob_tm[1][3], - prev_glob_tm[2][0] * move.x + (double)prev_glob_tm[2][1] * move.y + (double)prev_glob_tm[2][2] * move.z + - (double)prev_glob_tm[2][3], - prev_glob_tm[3][0] * move.x + (double)prev_glob_tm[3][1] * move.y + (double)prev_glob_tm[3][2] * move.z + - (double)prev_glob_tm[3][3]}; - - float reprojected_world_pos[4] = {(float)reprojected_world_pos_d[0], (float)reprojected_world_pos_d[1], - (float)reprojected_world_pos_d[2], (float)reprojected_world_pos_d[3]}; - - TMatrix4 prev_glob_tm_ofs = prev_glob_tm; - prev_glob_tm_ofs.setcol(3, reprojected_world_pos[0], reprojected_world_pos[1], reprojected_world_pos[2], reprojected_world_pos[3]); - - ShaderGlobal::set_float4x4(ssao_gbuf_prev_globtm_no_ofs_psfVarId, prev_glob_tm_ofs); -} - -void MobileSSAORenderer::setReprojection(const TMatrix &view_tm, const TMatrix4 &proj_tm) -{ - TMatrix4 viewRot = TMatrix4(view_tm); - - TMatrix4D viewRotInv; - double det; - inverse44(TMatrix4D(viewRot), viewRotInv, det); - const DPoint3 worldPos = DPoint3(viewRotInv.m[3][0], viewRotInv.m[3][1], viewRotInv.m[3][2]); - - set_shadervars_for_reprojection(reprojectionData.prevGlobTm, reprojectionData.prevWorldPos, worldPos); - - viewRot.setrow(3, 0.0f, 0.0f, 0.0f, 1.0f); - const TMatrix4 globTm = (viewRot * proj_tm).transpose(); - - reprojectionData.prevGlobTm = globTm; - reprojectionData.prevWorldPos = worldPos; -} - -void MobileSSAORenderer::render(const TMatrix &view_tm, const TMatrix4 &proj_tm, BaseTexture *ssaoDepthTexUse, - const ManagedTex *ssao_tex, const ManagedTex *prev_ssao_tex, const ManagedTex *tmp_tex, const DPoint3 *, SubFrameSample) +void MobileSSAORenderer::render(const TMatrix &, const TMatrix4 &, BaseTexture *ssaoDepthTexUse, const ManagedTex *ssao_tex, + const ManagedTex *prev_ssao_tex, const ManagedTex *tmp_tex, const DPoint3 *, SubFrameSample) { TIME_D3D_PROFILE(SSAO_total) SCOPE_RENDER_TARGET; @@ -155,8 +113,6 @@ void MobileSSAORenderer::render(const TMatrix &view_tm, const TMatrix4 &proj_tm, setFrameNo(); - set_viewvecs_to_shader(view_tm, proj_tm); - { TIME_D3D_PROFILE(SSAO_render) renderSSAO(ssaoDepthTexUse); @@ -175,8 +131,6 @@ void MobileSSAORenderer::render(const TMatrix &view_tm, const TMatrix4 &proj_tm, // Restore state ShaderGlobal::set_texture(ssao_texVarId, ssaoTex[g_ssao_blur ? blurId : renderId]); - - setReprojection(view_tm, proj_tm); } Texture *MobileSSAORenderer::getSSAOTex() diff --git a/prog/gameLibs/render/objectMotionBlur/objectMotionBlur.cpp b/prog/gameLibs/render/objectMotionBlur/objectMotionBlur.cpp index 4ce98ea46..81f91f8a8 100644 --- a/prog/gameLibs/render/objectMotionBlur/objectMotionBlur.cpp +++ b/prog/gameLibs/render/objectMotionBlur/objectMotionBlur.cpp @@ -24,6 +24,14 @@ namespace objectmotionblur { +struct ResContext +{ + UniqueTexHolder tileMaxTex; + UniqueTexHolder neightborMaxTex; + UniqueTexHolder resultTex; + UniqueTexHolder flattenedVelocityTex; +}; + struct Context { Context(); @@ -56,18 +64,11 @@ struct Context bool cancelCameraMotion = false; const float target_frame_rate = 60.0f; -}; -struct ResContext -{ - UniqueTexHolder tileMaxTex; - UniqueTexHolder neightborMaxTex; - UniqueTexHolder resultTex; - UniqueTexHolder flattenedVelocityTex; + eastl::unique_ptr resCtx; }; static eastl::unique_ptr g_ctx; -static eastl::unique_ptr g_resCtx; static MotionBlurSettings settingsFromConfig; static IPoint2 renderingResolution = IPoint2(0, 0); static int targetFormat = 0; @@ -134,8 +135,8 @@ static void initialize() if (!settingsFromConfig.externalTextures) { - if (!g_resCtx) - g_resCtx = eastl::make_unique(); + if (!g_ctx->resCtx) + g_ctx->resCtx = eastl::make_unique(); int width = renderingResolution.x; int height = renderingResolution.y; @@ -143,27 +144,36 @@ static void initialize() int tileCountX = ceilf((float)width / TILE_SIZE); int tileCountY = ceilf((float)height / TILE_SIZE); - if (g_resCtx->tileMaxTex) - g_resCtx->tileMaxTex.close(); + if (g_ctx->resCtx->tileMaxTex) + g_ctx->resCtx->tileMaxTex.close(); - if (g_resCtx->neightborMaxTex) - g_resCtx->neightborMaxTex.close(); + if (g_ctx->resCtx->neightborMaxTex) + g_ctx->resCtx->neightborMaxTex.close(); - if (g_resCtx->resultTex) - g_resCtx->resultTex.close(); + if (g_ctx->resCtx->resultTex) + g_ctx->resCtx->resultTex.close(); - if (g_resCtx->flattenedVelocityTex) - g_resCtx->flattenedVelocityTex.close(); + if (g_ctx->resCtx->flattenedVelocityTex) + g_ctx->resCtx->flattenedVelocityTex.close(); - g_resCtx->tileMaxTex = + g_ctx->resCtx->tileMaxTex = dag::create_tex(nullptr, tileCountX, tileCountY, TEXCF_UNORDERED | TEXFMT_G16R16F, 1, "object_motion_blur_tile_max_tex"); - g_resCtx->neightborMaxTex = + g_ctx->resCtx->neightborMaxTex = dag::create_tex(nullptr, tileCountX, tileCountY, TEXCF_UNORDERED | TEXFMT_G16R16F, 1, "object_motion_blur_neighbor_max"); - g_resCtx->resultTex = dag::create_tex(nullptr, width, height, TEXCF_UNORDERED | targetFormat, 1, "object_motion_blur_out_tex"); + g_ctx->resCtx->resultTex = + dag::create_tex(nullptr, width, height, TEXCF_UNORDERED | targetFormat, 1, "object_motion_blur_out_tex"); - g_resCtx->flattenedVelocityTex = + g_ctx->resCtx->flattenedVelocityTex = dag::create_tex(nullptr, width, height, TEXCF_UNORDERED | TEXFMT_R11G11B10F, 1, "object_motion_blur_flattened_vel_tex"); - g_resCtx->flattenedVelocityTex->texfilter(TEXFILTER_POINT); + g_ctx->resCtx->flattenedVelocityTex->texfilter(TEXFILTER_POINT); + + if (!g_ctx->resCtx->tileMaxTex || !g_ctx->resCtx->neightborMaxTex || !g_ctx->resCtx->resultTex || + !g_ctx->resCtx->flattenedVelocityTex) + { + logerr("Failed to create object motion blur textures!"); + g_ctx.reset(); + return; + } } } @@ -218,16 +228,16 @@ void on_render_resolution_changed(const IPoint2 &rendering_resolution, int forma void apply(Texture *source_tex, TEXTUREID source_id, float current_frame_rate) { - if (!g_resCtx || !source_tex) + if (!g_ctx || !g_ctx->resCtx || !source_tex) return; - if (g_resCtx->resultTex) + if (g_ctx->resCtx->resultTex) { TextureInfo sourceTextureInfo; source_tex->getinfo(sourceTextureInfo); TextureInfo resultTextureInfo; - g_resCtx->resultTex->getinfo(resultTextureInfo); + g_ctx->resCtx->resultTex->getinfo(resultTextureInfo); if (sourceTextureInfo.w != resultTextureInfo.w || sourceTextureInfo.h != resultTextureInfo.h || (sourceTextureInfo.cflg & TEXFMT_MASK) != (resultTextureInfo.cflg & TEXFMT_MASK)) { @@ -239,7 +249,7 @@ void apply(Texture *source_tex, TEXTUREID source_id, float current_frame_rate) } } - apply(source_tex, source_id, g_resCtx->resultTex, current_frame_rate); + apply(source_tex, source_id, g_ctx->resCtx->resultTex, current_frame_rate); } void apply(Texture *source_tex, TEXTUREID source_id, ManagedTexView resultTex, float current_frame_rate) diff --git a/prog/gameLibs/render/randomGrass.cpp b/prog/gameLibs/render/randomGrass.cpp index 3a2c38159..5acb91c9e 100644 --- a/prog/gameLibs/render/randomGrass.cpp +++ b/prog/gameLibs/render/randomGrass.cpp @@ -1152,10 +1152,12 @@ void RandomGrass::generateGPUGrass(const LandMask &land_mask, const Frustum &fru d3d::set_buffer(STAGE_CS, 8, layerDataVS.getBuf()); static int random_grass_use_bvhVarId = ::get_shader_variable_id("random_grass_use_bvh", true); + static int random_grass_bvh_rangeVarId = ::get_shader_variable_id("random_grass_bvh_range", true); static int random_grass_bvh_max_countVarId = ::get_shader_variable_id("random_grass_bvh_max_count", true); - bool useBvhConnection = bvhConnection && bvhConnection->isReady(); + bool useBvhConnection = bvhConnection && bvhConnection->isReady() && bvhConnection->getMaxRange() > 0; ShaderGlobal::set_int(random_grass_use_bvhVarId, useBvhConnection ? 1 : 0); + ShaderGlobal::set_real(random_grass_bvh_rangeVarId, useBvhConnection ? bvhConnection->getMaxRange() : 0); if (useBvhConnection && bvhConnection->prepare()) ShaderGlobal::set_int(random_grass_bvh_max_countVarId, diff --git a/prog/gameLibs/render/rtao/rtao.cpp b/prog/gameLibs/render/rtao/rtao.cpp index e8260725e..76fdd1af2 100644 --- a/prog/gameLibs/render/rtao/rtao.cpp +++ b/prog/gameLibs/render/rtao/rtao.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace rtao { @@ -36,9 +37,9 @@ static int rtao_res_mulVarId = -1; static int downsampled_close_depth_texVarId = -1; static float ray_length = 3; -static float distance_factor = 0; -static float scatter_factor = 0.16; -static float roughness_factor = 0; +static float distance_factor = 1; +static float scatter_factor = 20.0; +static float roughness_factor = -25.0; void initialize(bool half_res) { @@ -120,10 +121,15 @@ void render(bvh::ContextId context_id, const TMatrix4 &proj_tm, bool performance #if DAGOR_DBGLEVEL > 0 static void imguiWindow() { - ImGui::SliderFloat("Ray length", &ray_length, 0.01f, 5); - ImGui::SliderFloat("Distance factor", &distance_factor, 0, 1); - ImGui::SliderFloat("Scatter factor", &scatter_factor, 0, 2); - ImGui::SliderFloat("Roughness factor", &roughness_factor, 0, 10); + if (!denoised_ao) + return; + + ImGui::SliderFloat("Ray length", &ray_length, 0.01f, 10); + ImGui::SliderFloat("Distance factor", &distance_factor, 0.01, 5); + ImGui::SliderFloat("Scatter factor", &scatter_factor, 0, 50); + ImGui::SliderFloat("Roughness factor", &roughness_factor, -50, 0); + + ImGuiDagor::Image(denoised_ao.getTexId(), denoised_ao.getTex2D()); } REGISTER_IMGUI_WINDOW("Render", "RTAO", imguiWindow); diff --git a/prog/gameLibs/render/rtao/shaders/rtao.dshl b/prog/gameLibs/render/rtao/shaders/rtao.dshl index c8418deb3..adb0fa34b 100644 --- a/prog/gameLibs/render/rtao/shaders/rtao.dshl +++ b/prog/gameLibs/render/rtao/shaders/rtao.dshl @@ -16,8 +16,15 @@ int rtao_res_mul = 1; interval rtao_res_mul: off<2, on; +define_macro_if_not_defined USE_EMISSION_DECODE_COLOR_MAP(code) +endmacro + shader rt_ao { + if (compatibility_mode == compatibility_mode_on) + { + dont_render; + } ENABLE_ASSERT(cs) (cs) { @@ -41,6 +48,7 @@ shader rt_ao INIT_ZNZFAR_STAGE(cs) INIT_LOAD_DEPTH_GBUFFER_BASE(cs) USE_LOAD_DEPTH_GBUFFER_BASE(cs) + USE_EMISSION_DECODE_COLOR_MAP(cs) INIT_LOAD_GBUFFER_BASE(cs) INIT_LOAD_BVH_FLAGS_BASE(cs) USE_LOAD_GBUFFER_BASE(cs, 1) diff --git a/prog/gameLibs/render/rtr/rtr.cpp b/prog/gameLibs/render/rtr/rtr.cpp index 42edae99a..716d54481 100644 --- a/prog/gameLibs/render/rtr/rtr.cpp +++ b/prog/gameLibs/render/rtr/rtr.cpp @@ -86,6 +86,8 @@ static bool checkerboard = true; static bool show_validation = false; static bool use_nrd_lib = false; +static d3d::SamplerHandle linear_sampler = d3d::INVALID_SAMPLER_HANDLE; + static PostFxRenderer *validation_renderer; inline int divide_up(int x, int y) { return (x + y - 1) / y; } @@ -148,6 +150,13 @@ void initialize(bool half_res, bool checkerboard_) validation_texture = dag::create_tex(nullptr, ti.w, ti.h, TEXCF_UNORDERED, 1, "rtr_validation_texture"); is_half_res = half_res; + + d3d::SamplerInfo si; + si.mip_map_mode = d3d::MipMapMode::Point; + si.filter_mode = d3d::FilterMode::Linear; + si.address_mode_u = d3d::AddressMode::Clamp; + si.address_mode_v = d3d::AddressMode::Clamp; + linear_sampler = d3d::request_sampler(si); } template @@ -239,6 +248,7 @@ void render(bvh::ContextId context_id, const TMatrix4 &proj_tm, bool rt_shadow, TIME_D3D_PROFILE(rtr::classify); const uint32_t clear[] = {0, 0, 0, 0}; d3d::clear_rwtexi(reflection_value.getTex2D(), clear, 0, 0); + d3d::set_sampler(STAGE_CS, 5, linear_sampler); classify->dispatch(tiTiles.w, tiTiles.h, 1); } { diff --git a/prog/gameLibs/render/rtr/shaders/rtr.dshl b/prog/gameLibs/render/rtr/shaders/rtr.dshl index 568369502..6504a20b6 100644 --- a/prog/gameLibs/render/rtr/shaders/rtr.dshl +++ b/prog/gameLibs/render/rtr/shaders/rtr.dshl @@ -111,6 +111,8 @@ shader rt_reflection_classify groupshared uint maxSampleCount; + SamplerState rtsm_linear_sampler : register(s5); + [numthreads(8, 8, 1)] void rt_reflection_classify(uint2 dtid : SV_DispatchThreadID, uint2 gtid : SV_GroupThreadID, uint2 gid : SV_GroupID) { @@ -156,7 +158,7 @@ shader rt_reflection_classify half3 surfaceNormal = (half3)normalize(surfaceNormal_roughness.xyz); if (rtr_res_mul > 1) - gbuffer.albedo = tex2Dlod(albedo_gbuf_read, float4((float2(resolution * 2) + .5f) * inv_resolution * .5f, 0, 0)).rgb; + gbuffer.albedo = albedo_gbuf_read.SampleLevel(rtsm_linear_sampler, (rayIndex + .5f) * inv_resolution, 0).rgb; float3 worldPos = calc_world_pos(dtid, w, inv_resolution, world_view_pos); apply_env_wetness(worldPos, surfaceNormal, -toPoint, gbuffer.material, gbuffer.albedo, smoothness, surfaceNormal, gbuffer.reflectance); diff --git a/prog/gameLibs/render/rtsm/rtsm.cpp b/prog/gameLibs/render/rtsm/rtsm.cpp index 158406647..d12576b04 100644 --- a/prog/gameLibs/render/rtsm/rtsm.cpp +++ b/prog/gameLibs/render/rtsm/rtsm.cpp @@ -96,8 +96,10 @@ void initialize(int width, int height, RenderMode rm, bool dynamic_light_shadows break; } - shadowValueMap = eastl::move(shadowValueMapCreate); - shadowTranslucencyMap = eastl::move(shadowTranslucencyMapCreate); + if (shadowValueMapCreate) + shadowValueMap = eastl::move(shadowValueMapCreate); + if (shadowTranslucencyMapCreate) + shadowTranslucencyMap = eastl::move(shadowTranslucencyMapCreate); dynamicLightingTexture.setVar(); shadowValueMap.setVar(); @@ -153,7 +155,8 @@ void teardown() ShaderGlobal::set_int(rtsm_bindless_slotVarId, -1); } -void render(bvh::ContextId context_id, const Point3 &view_pos, const TMatrix4 &proj_tm, bool has_nuke, bool has_dynamic_lights) +void render(bvh::ContextId context_id, const Point3 &view_pos, const TMatrix4 &proj_tm, bool has_nuke, bool has_dynamic_lights, + Texture *csm_texture) { G_ASSERT(trace); G_ASSERT(finalShadowMap); @@ -186,6 +189,7 @@ void render(bvh::ContextId context_id, const Point3 &view_pos, const TMatrix4 &p params.denoisedShadowMap = finalShadowMap.getTex2D(); params.shadowValue = shadowValueMap.getTex2D(); params.shadowTranslucency = render_mode == RenderMode::DenoisedTranslucent ? shadowTranslucencyMap.getTex2D() : nullptr; + params.csmTexture = csm_texture; denoiser::denoise_shadow(params); } diff --git a/prog/gameLibs/render/rtsm/rtsm_stub.cpp b/prog/gameLibs/render/rtsm/rtsm_stub.cpp index f5232f8dd..3e86af6b9 100644 --- a/prog/gameLibs/render/rtsm/rtsm_stub.cpp +++ b/prog/gameLibs/render/rtsm/rtsm_stub.cpp @@ -8,7 +8,7 @@ namespace rtsm void initialize(int, int, RenderMode, bool) {} void teardown() {} -void render(bvh::ContextId, const Point3 &, const TMatrix4 &, bool, bool) {} +void render(bvh::ContextId, const Point3 &, const TMatrix4 &, bool, bool, Texture *) {} void render_dynamic_light_shadows(bvh::ContextId, const Point3 &, bool) {} diff --git a/prog/gameLibs/render/rtsm/shaders/rtsm.dshl b/prog/gameLibs/render/rtsm/shaders/rtsm.dshl index 160be71ca..c614f6d15 100644 --- a/prog/gameLibs/render/rtsm/shaders/rtsm.dshl +++ b/prog/gameLibs/render/rtsm/shaders/rtsm.dshl @@ -21,6 +21,8 @@ texture denoiser_view_z; texture rtsm_dynamic_lights; +texture perlin_noise3d; + float rtsm_sun_angle_multiplier = 0.5; int rtsm_frame_index; @@ -66,15 +68,25 @@ shader rt_shadows if (rtsm_render_mode == hard) { + hlsl(cs) { + #define TRACE_RAY_EXTRA_FLAGS RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH + #define BVH_TRANSLUCENCY_IS_DISSOLVE 1 + } (cs) { combined_shadows@uav = combined_shadows hlsl { RWTexture2D combined_shadows@uav; }; + perlin_noise3d@smp3d = perlin_noise3d; } } else if (rtsm_render_mode == denoised) { + hlsl (cs) { + #define TRACE_RAY_EXTRA_FLAGS RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH + #define BVH_TRANSLUCENCY_IS_DISSOLVE 1 + } (cs) { rtsm_value@uav = rtsm_value hlsl { RWTexture2D rtsm_value@uav; }; rtsm_denoised@uav = rtsm_denoised hlsl { RWTexture2D rtsm_denoised@uav; }; + perlin_noise3d@smp3d = perlin_noise3d; } } else if (rtsm_render_mode == denoised_translucent) @@ -89,6 +101,13 @@ shader rt_shadows hlsl(cs) { #define DISABLE_TOONSHADING 1 + #if BVH_TRANSLUCENCY_IS_DISSOLVE + float get_dissolve_value_from_world_position(float3 world_pos) + { + return tex3Dlod(perlin_noise3d, float4(frac(world_pos * 10), 0)).x; + } + #endif + #include #include } diff --git a/prog/gameLibs/render/rtsm/shaders/rtsm_use.dshl b/prog/gameLibs/render/rtsm/shaders/rtsm_use.dshl index ebd3c6d27..404367ba4 100644 --- a/prog/gameLibs/render/rtsm/shaders/rtsm_use.dshl +++ b/prog/gameLibs/render/rtsm/shaders/rtsm_use.dshl @@ -1,10 +1,14 @@ int rtsm_bindless_slot = -1; +int csm_bindless_slot = -1; +int csm_sampler_bindless_slot = -1; macro CHECKING_RTSM(stage) if (use_hw_raytracing) { (stage) { rtsm_bindless_slot@i1 = rtsm_bindless_slot; + csm_bindless_slot@i1 = csm_bindless_slot; + csm_sampler_bindless_slot@i1 = csm_sampler_bindless_slot; } hlsl (stage) { diff --git a/prog/gameLibs/render/shaderCacheWarmup/shaderCacheWarmup.cpp b/prog/gameLibs/render/shaderCacheWarmup/shaderCacheWarmup.cpp index c87854059..43c40d593 100644 --- a/prog/gameLibs/render/shaderCacheWarmup/shaderCacheWarmup.cpp +++ b/prog/gameLibs/render/shaderCacheWarmup/shaderCacheWarmup.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,55 @@ namespace { + +static String cache_UUID_as_str() +{ + uint32_t cacheUUID[4] = {}; + d3d::driver_command(Drv3dCommand::GET_SHADER_CACHE_UUID, &cacheUUID[0]); + String cacheUUIDstr(""); + for (uint32_t i : cacheUUID) + cacheUUIDstr += String(4, "%08lX", i); + return cacheUUIDstr; +} + +static const char *shader_warmup_status_file = "shader_warmup_status.blk"; + +static bool cache_already_warmed_up() +{ + DataBlock warmupStatus; + if (dd_file_exists(shader_warmup_status_file)) + warmupStatus.load(shader_warmup_status_file); + + const DataBlock *apiBlock = warmupStatus.getBlockByName(d3d::get_driver_name()); + if (!apiBlock) + return false; + + if (strcmp(apiBlock->getStr("UUID", ""), cache_UUID_as_str()) != 0) + return false; + + if (apiBlock->getInt("srcSize", 0) != shBinDumpOwner().getDumpSize()) + return false; + + if (apiBlock->getInt64("srcHash", 0) != shBinDumpOwner().getDumpHash()) + return false; + + return true; +} + +static void mark_cache_warmed_up() +{ + DataBlock warmupStatus; + if (dd_file_exists(shader_warmup_status_file)) + warmupStatus.load(shader_warmup_status_file); + + DataBlock *apiBlock = warmupStatus.addBlock(d3d::get_driver_name()); + apiBlock->setStr("UUID", cache_UUID_as_str()); + apiBlock->setInt("srcSize", shBinDumpOwner().getDumpSize()); + apiBlock->setInt64("srcHash", shBinDumpOwner().getDumpHash()); + + warmupStatus.saveToTextFile(shader_warmup_status_file); +} + struct SMProps : public ShaderMaterialProperties { Tab valStor; @@ -555,6 +605,14 @@ void shadercache::warmup_shaders(const Tab &graphics_shader_names, crashlytics::AppState appState("shader_warmup"); #endif + shader_warmup_status_file = ::dgs_get_settings()->getBlockByNameEx("shadersWarmup")->getStr("statusBlk", shader_warmup_status_file); + debug("shader warmup status file: %s", shader_warmup_status_file); + if (cache_already_warmed_up()) + { + debug("shaders cache up to date, skipping warmup"); + return; + } + compileTimeLimit = MS(::dgs_get_settings()->getBlockByNameEx("shadersWarmup")->getInt("compileTimeLimitMs", COMPILE_TIME_LIMIT_DEFAULT)); flushEveryNPipelines = ::dgs_get_settings()->getBlockByNameEx("shadersWarmup")->getInt("flushEveryNPipelines", 250); @@ -607,6 +665,8 @@ void shadercache::warmup_shaders(const Tab &graphics_shader_names, d3d::driver_command(Drv3dCommand::SAVE_PIPELINE_CACHE); } + mark_cache_warmed_up(); + time = profile_time_usec(time); // restrict precision to ms diff --git a/prog/gameLibs/render/shaders/adaptation/adaptation_cs.dshl b/prog/gameLibs/render/shaders/adaptation/adaptation_cs.dshl index 452985ce5..8c58789b5 100644 --- a/prog/gameLibs/render/shaders/adaptation/adaptation_cs.dshl +++ b/prog/gameLibs/render/shaders/adaptation/adaptation_cs.dshl @@ -199,6 +199,9 @@ float4 EyeAdaptationParams_1; float4 EyeAdaptationParams_2; float4 EyeAdaptationParams_3; +int has_pre_exposure = 1; +interval has_pre_exposure:no<1, yes; + shader AdaptExposureCS { (cs) { @@ -216,6 +219,11 @@ shader AdaptExposureCS }; } hlsl(cs) { + #if has_pre_exposure == yes + #define HAS_PRE_EXPOSURE 1 + #else + #define HAS_PRE_EXPOSURE 0 + #endif #include #include } diff --git a/prog/gameLibs/render/shaders/adaptation/exposure/AdaptExposureCS.hlsl b/prog/gameLibs/render/shaders/adaptation/exposure/AdaptExposureCS.hlsl index 7d54bc137..92bd5fee6 100644 --- a/prog/gameLibs/render/shaders/adaptation/exposure/AdaptExposureCS.hlsl +++ b/prog/gameLibs/render/shaders/adaptation/exposure/AdaptExposureCS.hlsl @@ -18,7 +18,7 @@ #include "PostEffectsRS.hlsli" #include "ShaderUtility.hlsli" -RWTexture2D exposureNormalizationFactor : register(u1); +RWTexture2D exposureTex : register(u1); #define HISTOGRAM_SIZE 256 @@ -143,14 +143,10 @@ void main( uint GI : SV_GroupIndex ) Exposure[8] = 1.0 / max(0.0001f, smoothedLuminance); // Current exposure without extra factors. Exposure[9] = 1.0 / max(0.0001f, autoLuminance); // Target exposure wiithout extra factors. - static const float midGray = 0.18; - const float normalizationFactor = midGray / (currentLuminance * (1 - midGray) * exposureScale); - -#if !_HARDWARE_METAL //due to compiler bug, Metal is unable to write to texture with if. - exposureNormalizationFactor[uint2(0,0)] = isfinite(normalizationFactor) ? normalizationFactor : 1.f; +#if HAS_PRE_EXPOSURE + exposureTex[uint2(0, 0)] = 1; #else - if (isfinite(normalizationFactor)) - exposureNormalizationFactor[uint2(0,0)] = normalizationFactor; + exposureTex[uint2(0, 0)] = exposureScale; #endif } } diff --git a/prog/gameLibs/render/shaders/antialiasing_fxaa.dshl b/prog/gameLibs/render/shaders/antialiasing_fxaa.dshl index a0994fd54..f9f3aa4a4 100644 --- a/prog/gameLibs/render/shaders/antialiasing_fxaa.dshl +++ b/prog/gameLibs/render/shaders/antialiasing_fxaa.dshl @@ -45,6 +45,10 @@ shader antialiasing z_test=false; } + hlsl(vs) { + #pragma spir-v no-base-vertex + } + USE_POSTFX_VERTEX_POSITIONS() INIT_ZNZFAR() INIT_READ_DEPTH_GBUFFER() diff --git a/prog/gameLibs/render/shaders/clustered/cull_out_of_frustum.dshl b/prog/gameLibs/render/shaders/clustered/cull_out_of_frustum.dshl index 048d71b9b..bd0dd67ea 100644 --- a/prog/gameLibs/render/shaders/clustered/cull_out_of_frustum.dshl +++ b/prog/gameLibs/render/shaders/clustered/cull_out_of_frustum.dshl @@ -42,7 +42,6 @@ hlsl(cs) { } float4 getBoundingSphere(float3 position, float3 direction, float lightRadius, float sinHalfAngle, float cosHalfAngle) { - // TODO: further vectorize this (incl getCosHalfAngle()/get_bounding_sphere_description()) float2 boundingDesc = lightRadius*get_bounding_sphere_description(sinHalfAngle, cosHalfAngle); return float4(direction*boundingDesc.y + position, boundingDesc.x); } @@ -73,6 +72,52 @@ shader cull_out_of_frustum_lights_cs return all(bool4(res03 >= 0)); } RWByteAddressBuffer oof_lights_full_grid : register(u0); + struct bbox3f + { + float3 bmin, bmax; + }; + void v_bbox3_init(inout bbox3f b, float3 v) {b.bmin = b.bmax = v;} + void v_bbox3_add_pt(inout bbox3f b, float3 v) {b.bmin = min(b.bmin, v); b.bmax = max(b.bmax, v);} + bbox3f v_bbox3_transform(float3 center, float3 ext, float4 boxR0, float4 boxR1, float4 boxR2) + { + float3 boxPos = float3(boxR0.w, boxR1.w, boxR2.w); + bbox3f b2; b2.bmin = center - boxPos; b2.bmax = center + boxPos; + bbox3f b; + // What we're doing here is this: + // xxxx*m0 + yyyy*m1 + zzzz*m2 + m3 + // xxxx*m0 + yyyy*m1 + ZZZZ*m2 + m3 + // xxxx*m0 + YYYY*m1 + zzzz*m2 + m3 + // xxxx*m0 + YYYY*m1 + ZZZZ*m2 + m3 + // XXXX*m0 + yyyy*m1 + zzzz*m2 + m3 + // XXXX*m0 + yyyy*m1 + ZZZZ*m2 + m3 + // XXXX*m0 + YYYY*m1 + zzzz*m2 + m3 + // XXXX*m0 + YYYY*m1 + ZZZZ*m2 + m3 + // Which we don't need to do at all as we just need to calculate 1/4 of this first and then summ up + float3 boxMulM_0_0 = (b2.bmin.x * boxR0.xyz); + float3 boxMulM_0_1 = (b2.bmax.x * boxR0.xyz); + float3 boxMulM_1_0 = (b2.bmin.y * boxR1.xyz); + float3 boxMulM_1_1 = (b2.bmax.y * boxR1.xyz); + float3 boxMulM_2_0 = (b2.bmin.z * boxR2.xyz); + float3 boxMulM_2_1 = (b2.bmax.z * boxR2.xyz); + + // Summing y and z + float3 boxSum_0_0 = (boxMulM_1_0 + boxMulM_2_0); + float3 boxSum_0_1 = (boxMulM_1_0 + boxMulM_2_1); + float3 boxSum_1_0 = (boxMulM_1_1 + boxMulM_2_0); + float3 boxSum_1_1 = (boxMulM_1_1 + boxMulM_2_1); + #define COMBINE_BOX(a,b,c) (boxMulM_0_##a + boxSum_##b##_##c) + v_bbox3_init( b, COMBINE_BOX(0, 0, 0)); + v_bbox3_add_pt(b, COMBINE_BOX(0, 0, 1)); + v_bbox3_add_pt(b, COMBINE_BOX(0, 1, 0)); + v_bbox3_add_pt(b, COMBINE_BOX(0, 1, 1)); + v_bbox3_add_pt(b, COMBINE_BOX(1, 0, 0)); + v_bbox3_add_pt(b, COMBINE_BOX(1, 0, 1)); + v_bbox3_add_pt(b, COMBINE_BOX(1, 1, 0)); + v_bbox3_add_pt(b, COMBINE_BOX(1, 1, 1)); + #undef COMBINE_BOX + return b; + } + [numthreads(8, 8, 1)] void cull_out_of_frustum_lights_cs(uint3 dtId:SV_DispatchThreadID, uint3 gtId:SV_GroupThreadID, uint3 gid:SV_GroupID, uint tid:SV_GroupIndex) { @@ -88,8 +133,12 @@ shader cull_out_of_frustum_lights_cs float3 gridPosCenter = out_of_frustum_grid_cull_box[0].xyz + (gridPos.xzy*2)*gridCellHalfSz; //if (any(abs(posRadius.xyz - gridPosCenter) > gridCellSz*0.5 + posRadius.w)) // return; - //if (!bbox_test_sph_intersect(gridPosCenter-gridCellHalfSz, gridPosCenter+gridCellHalfSz, posRadius.xyz, posRadius.w*posRadius.w)) - // return; + if (!bbox_test_sph_intersect(gridPosCenter-gridCellHalfSz, gridPosCenter+gridCellHalfSz, posRadius.xyz, posRadius.w*posRadius.w)) + return; + float4 boxR0 = omni_lights_cb[lightId].boxR0, boxR1 = omni_lights_cb[lightId].boxR1, boxR2 = omni_lights_cb[lightId].boxR2; + bbox3f lbox = v_bbox3_transform(gridPosCenter, gridCellHalfSz, boxR0, boxR1, boxR2); + if (any(or(lbox.bmin > 0.5, lbox.bmax < -0.5))) + return; uint gridCellIndex = (gridPos.z*OOF_GRID_W + gridPos.y)*OOF_GRID_W + gridPos.x; uint lightWordIndex = lightId>>5; ##assert(lightWordIndex < omni_lights_count.y, "[%s:%.f] Out of bounds: omni words count is (%.f), but access to (%.f)", _FILE_, __LINE__, omni_lights_count.y, lightWordIndex); diff --git a/prog/gameLibs/render/shaders/contrast_adaptive_sharpening.dshl b/prog/gameLibs/render/shaders/contrast_adaptive_sharpening.dshl index 14ae4c57c..8316b0951 100644 --- a/prog/gameLibs/render/shaders/contrast_adaptive_sharpening.dshl +++ b/prog/gameLibs/render/shaders/contrast_adaptive_sharpening.dshl @@ -1,6 +1,13 @@ include "shader_global.dshl" // this is an implementation of AMD's CAS with some minor tweaks +float contrast_adaptive_sharpening = -0.125; + +macro INIT_CONTRAST_ADAPTIVE_SHARPENING(code) + (code) { + contrast_adaptive_sharpening@f1 = contrast_adaptive_sharpening; + } +endmacro macro USE_CONTRAST_ADAPTIVE_SHARPENING(code) hlsl(code) { diff --git a/prog/gameLibs/render/shaders/csm.dshl b/prog/gameLibs/render/shaders/csm.dshl index d62e661e0..1575e5638 100644 --- a/prog/gameLibs/render/shaders/csm.dshl +++ b/prog/gameLibs/render/shaders/csm.dshl @@ -1,9 +1,10 @@ include "hardware_defines.dshl" -buffer csm_buffer; +buffer shadow_cascade_data; float4 shadow_cascade_tm_transp[24]; // max value of num_of_cascades (6) * 4 float4 shadow_cascade_tc_mul_offset[6]; + float4 csm_world_view_pos; macro INIT_CSM_SHADOW_STCODE(stage) @@ -13,6 +14,18 @@ macro INIT_CSM_SHADOW_STCODE(stage) } endmacro +macro INIT_CSM_SHADOW_STCODE_CBUF(stage) + (stage) { + shadow_cascade_data@cbuf = shadow_cascade_data hlsl { + cbuffer shadow_cascade_data@cbuf + { + float4 shadow_cascade_tm_transp[24]; + float4 shadow_cascade_tc_mul_offset[6]; + }; + } + } +endmacro + texture shadow_cascade_depth_tex; float4 pcf_lerp = (0, 0, 0, 0); float4 sc_pcf_lerp = (0, 0, 0, 0); diff --git a/prog/gameLibs/render/shaders/debugGbuffer.dshl b/prog/gameLibs/render/shaders/debugGbuffer.dshl index 5eead1c26..e5aa08c99 100644 --- a/prog/gameLibs/render/shaders/debugGbuffer.dshl +++ b/prog/gameLibs/render/shaders/debugGbuffer.dshl @@ -182,6 +182,8 @@ shader debug_final_gbuffer POSTFX_VS_TEXCOORD(1, texcoord) INIT_READ_MOTION_BUFFER() USE_READ_MOTION_BUFFER() + INIT_HDR(ps) + USE_HDR(ps) if (show_gbuffer >= debug_mesh) { @@ -296,7 +298,7 @@ shader debug_final_gbuffer half finalAO = gbuffer.ao*gbuffer.extracted_albedo_ao*ssao.x; return half4(finalAO.xxx,1); ##elif show_gbuffer == ssr - return half4(ApplySRGBCurve(getSSR(gbuffer.linearRoughness, input.texcoord, screenpos).rgb)*EnvBRDFApprox( gbuffer.specularColor, gbuffer.linearRoughness, NoV).x,1); + return half4(ApplySRGBCurve(pack_hdr(getSSR(gbuffer.linearRoughness, input.texcoord, screenpos).rgb)*EnvBRDFApprox( gbuffer.specularColor, gbuffer.linearRoughness, NoV).x),1); ##elif show_gbuffer == ssrStrength return getSSR(gbuffer.linearRoughness, input.texcoord, screenpos).a; ##elif show_gbuffer == materialType diff --git a/prog/gameLibs/render/shaders/downsampleDepth.dshl b/prog/gameLibs/render/shaders/downsampleDepth.dshl index e148add93..8f8377d4a 100644 --- a/prog/gameLibs/render/shaders/downsampleDepth.dshl +++ b/prog/gameLibs/render/shaders/downsampleDepth.dshl @@ -33,7 +33,7 @@ texture resolved_motion_vectors; float4x4 motion_vec_reproject_tm; int resolve_motion_vectors = 0; interval resolve_motion_vectors: no < 1, yes; -float4 prev_zn_zfar; +float4 prev_zn_zfar = (1, 10, 0, 0); macro DOWNSAMPLE_DEPTH2X_CORE(code) ENABLE_ASSERT(code) diff --git a/prog/daNetGame/shaders/draw_indirect_buffer_layout.dshl b/prog/gameLibs/render/shaders/draw_indirect_buffer_layout.dshl similarity index 100% rename from prog/daNetGame/shaders/draw_indirect_buffer_layout.dshl rename to prog/gameLibs/render/shaders/draw_indirect_buffer_layout.dshl diff --git a/prog/gameLibs/render/shaders/flow_map_inc.dshl b/prog/gameLibs/render/shaders/flow_map_inc.dshl index 0bf9f4e6f..ada4aee43 100644 --- a/prog/gameLibs/render/shaders/flow_map_inc.dshl +++ b/prog/gameLibs/render/shaders/flow_map_inc.dshl @@ -28,7 +28,7 @@ macro INIT_WATER_FLOWMAP() float water_flowmap_debug = 0; float water_flowmap_multiplier = 1; float water_flowmap_blend = 0; - float4 water_fluid_strength = (0.2, 10, 1, 0.1); + float4 water_fluid_strength = (0.2, 20, 1, 0.1); int water_flowmap_cascades = 0; endmacro diff --git a/prog/gameLibs/render/shaders/giHelpers/trees_above_clear.dshl b/prog/gameLibs/render/shaders/giHelpers/trees_above_clear.dshl new file mode 100644 index 000000000..9ecf5d667 --- /dev/null +++ b/prog/gameLibs/render/shaders/giHelpers/trees_above_clear.dshl @@ -0,0 +1,38 @@ +include "shader_global.dshl" +include "postfx_inc.dshl" + +int4 trees2d_clear_regions_arr[16]; + +shader trees2d_clear +{ + supports none; + supports global_frame; + + z_test = false; + z_write = true; + cull_mode = none; + POSTFX_VS(0) + + (ps) { + trees2d_clear_regions_arr@i4[] = trees2d_clear_regions_arr; + } + + hlsl(ps) { + float4 trees2d_clear_regions(VsOutput input HW_USE_SCREEN_POS):SV_Target0 + { + int2 pos = int2(GET_SCREEN_POS(input.pos).xy); + bool inside = false; + UNROLL + for(int i = 0; i < 16; i++) + { + int2 rmin = trees2d_clear_regions_arr[i].xy; + int2 rmax = trees2d_clear_regions_arr[i].zw; + inside = inside || all(pos >= rmin && pos <= rmax); + } + if (!inside) discard; + return 0; + } + } + + compile("target_ps", "trees2d_clear_regions"); +} diff --git a/prog/gameLibs/render/shaders/hardware_defines.dshl b/prog/gameLibs/render/shaders/hardware_defines.dshl index 83bbbaa28..2ed96c1c8 100644 --- a/prog/gameLibs/render/shaders/hardware_defines.dshl +++ b/prog/gameLibs/render/shaders/hardware_defines.dshl @@ -42,36 +42,49 @@ hlsl { bool4 or(bool4 a, bool4 b) { return a || b; } ##endif + #if SHADER_COMPILER_FP16_ENABLED - float16_t2 select(bool2 a, float16_t2 b, float16_t2 c) { return a ? b : c; } - float16_t3 select(bool3 a, float16_t3 b, float16_t3 c) { return a ? b : c; } - float16_t4 select(bool4 a, float16_t4 b, float16_t4 c) { return a ? b : c; } - float16_t2 and(float16_t2 a, float16_t2 b) { return a && b; } - float16_t3 and(float16_t3 a, float16_t3 b) { return a && b; } - float16_t4 and(float16_t4 a, float16_t4 b) { return a && b; } - float16_t2 or(float16_t2 a, float16_t2 b) { return a || b; } - float16_t3 or(float16_t3 a, float16_t3 b) { return a || b; } - float16_t4 or(float16_t4 a, float16_t4 b) { return a || b; } - - int16_t2 select(bool2 a, int16_t2 b, int16_t2 c) { return a ? b : c; } - int16_t3 select(bool3 a, int16_t3 b, int16_t3 c) { return a ? b : c; } - int16_t4 select(bool4 a, int16_t4 b, int16_t4 c) { return a ? b : c; } - int16_t2 and(int16_t2 a, int16_t2 b) { return a && b; } - int16_t3 and(int16_t3 a, int16_t3 b) { return a && b; } - int16_t4 and(int16_t4 a, int16_t4 b) { return a && b; } - int16_t2 or(int16_t2 a, int16_t2 b) { return a || b; } - int16_t3 or(int16_t3 a, int16_t3 b) { return a || b; } - int16_t4 or(int16_t4 a, int16_t4 b) { return a || b; } - - uint16_t2 select(bool2 a, uint16_t2 b, uint16_t2 c) { return a ? b : c; } - uint16_t3 select(bool3 a, uint16_t3 b, uint16_t3 c) { return a ? b : c; } - uint16_t4 select(bool4 a, uint16_t4 b, uint16_t4 c) { return a ? b : c; } - uint16_t2 and(uint16_t2 a, uint16_t2 b) { return a && b; } - uint16_t3 and(uint16_t3 a, uint16_t3 b) { return a && b; } - uint16_t4 and(uint16_t4 a, uint16_t4 b) { return a && b; } - uint16_t2 or(uint16_t2 a, uint16_t2 b) { return a || b; } - uint16_t3 or(uint16_t3 a, uint16_t3 b) { return a || b; } - uint16_t4 or(uint16_t4 a, uint16_t4 b) { return a || b; } + #if _HARDWARE_FSH_6_2 + float16_t2 select(bool2 a, float16_t2 b, float16_t2 c) { return a ? b : c; } + float16_t3 select(bool3 a, float16_t3 b, float16_t3 c) { return a ? b : c; } + float16_t4 select(bool4 a, float16_t4 b, float16_t4 c) { return a ? b : c; } + float16_t2 and(float16_t2 a, float16_t2 b) { return a && b; } + float16_t3 and(float16_t3 a, float16_t3 b) { return a && b; } + float16_t4 and(float16_t4 a, float16_t4 b) { return a && b; } + float16_t2 or(float16_t2 a, float16_t2 b) { return a || b; } + float16_t3 or(float16_t3 a, float16_t3 b) { return a || b; } + float16_t4 or(float16_t4 a, float16_t4 b) { return a || b; } + + int16_t2 select(bool2 a, int16_t2 b, int16_t2 c) { return a ? b : c; } + int16_t3 select(bool3 a, int16_t3 b, int16_t3 c) { return a ? b : c; } + int16_t4 select(bool4 a, int16_t4 b, int16_t4 c) { return a ? b : c; } + int16_t2 and(int16_t2 a, int16_t2 b) { return a && b; } + int16_t3 and(int16_t3 a, int16_t3 b) { return a && b; } + int16_t4 and(int16_t4 a, int16_t4 b) { return a && b; } + int16_t2 or(int16_t2 a, int16_t2 b) { return a || b; } + int16_t3 or(int16_t3 a, int16_t3 b) { return a || b; } + int16_t4 or(int16_t4 a, int16_t4 b) { return a || b; } + + uint16_t2 select(bool2 a, uint16_t2 b, uint16_t2 c) { return a ? b : c; } + uint16_t3 select(bool3 a, uint16_t3 b, uint16_t3 c) { return a ? b : c; } + uint16_t4 select(bool4 a, uint16_t4 b, uint16_t4 c) { return a ? b : c; } + uint16_t2 and(uint16_t2 a, uint16_t2 b) { return a && b; } + uint16_t3 and(uint16_t3 a, uint16_t3 b) { return a && b; } + uint16_t4 and(uint16_t4 a, uint16_t4 b) { return a && b; } + uint16_t2 or(uint16_t2 a, uint16_t2 b) { return a || b; } + uint16_t3 or(uint16_t3 a, uint16_t3 b) { return a || b; } + uint16_t4 or(uint16_t4 a, uint16_t4 b) { return a || b; } + #else + min16float2 select(bool2 a, min16float2 b, min16float2 c) { return a ? b : c; } + min16float3 select(bool3 a, min16float3 b, min16float3 c) { return a ? b : c; } + min16float4 select(bool4 a, min16float4 b, min16float4 c) { return a ? b : c; } + min16float2 and(min16float2 a, min16float2 b) { return a && b; } + min16float3 and(min16float3 a, min16float3 b) { return a && b; } + min16float4 and(min16float4 a, min16float4 b) { return a && b; } + min16float2 or(min16float2 a, min16float2 b) { return a || b; } + min16float3 or(min16float3 a, min16float3 b) { return a || b; } + min16float4 or(min16float4 a, min16float4 b) { return a || b; } + #endif #endif #endif } @@ -562,11 +575,27 @@ hlsl(ps) { #define IF_IS_BACK_FACE if (!vface) #define SET_IF_IS_BACK_FACE(name, val) if (!vface) name = val; - #define half float - #define half1 float1 - #define half2 float2 - #define half3 float3 - #define half4 float4 + #if SHADER_COMPILER_FP16_ENABLED + #if _HARDWARE_FSH_6_2 + #define half float16_t + #define half1 float16_t1 + #define half2 float16_t2 + #define half3 float16_t3 + #define half4 float16_t4 + #else + #define half min16float + #define half1 min16float1 + #define half2 min16float2 + #define half3 min16float3 + #define half4 min16float4 + #endif + #else + #define half float + #define half1 float1 + #define half2 float2 + #define half3 float3 + #define half4 float4 + #endif ##endif #define tex2DBindless(a, uv) (a).tex.Sample((a).smp, uv) diff --git a/prog/gameLibs/render/shaders/hero_matrix_inc.dshl b/prog/gameLibs/render/shaders/hero_matrix_inc.dshl index 6680d1d5e..3d2799295 100644 --- a/prog/gameLibs/render/shaders/hero_matrix_inc.dshl +++ b/prog/gameLibs/render/shaders/hero_matrix_inc.dshl @@ -1,12 +1,12 @@ include "mulPointTm_inc.dshl" -float4 hero_matrixX = (1,0,0,0); -float4 hero_matrixY = (0,1,0,0); -float4 hero_matrixZ = (0,0,1,0); +float4 hero_matrixX = (0,0,0,1); +float4 hero_matrixY = (0,0,0,1); +float4 hero_matrixZ = (0,0,0,1); -float4 prev_hero_matrixX = (1,0,0,0); -float4 prev_hero_matrixY = (0,1,0,0); -float4 prev_hero_matrixZ = (0,0,1,0); +float4 prev_hero_matrixX = (0,0,0,1); +float4 prev_hero_matrixY = (0,0,0,1); +float4 prev_hero_matrixZ = (0,0,0,1); float4 hero_bbox_reprojectionX = (1,0,0,0); float4 hero_bbox_reprojectionY = (0,1,0,0); float4 hero_bbox_reprojectionZ = (0,0,1,0); diff --git a/prog/gameLibs/render/shaders/pn_triangulation.dshl b/prog/gameLibs/render/shaders/pn_triangulation.dshl index 328a8c022..fe56968c4 100644 --- a/prog/gameLibs/render/shaders/pn_triangulation.dshl +++ b/prog/gameLibs/render/shaders/pn_triangulation.dshl @@ -103,20 +103,19 @@ hlsl(hs) { HsPatchData patch = (HsPatchData)0; //calculate center - float3 center = (controlPoints[0].pos2 + controlPoints[0].pos3) * 0.5 - controlPoints[0].pos1 + + float3 center = (controlPoints[0].pos2 + controlPoints[0].pos3) * 0.5 - 0.0 + (controlPoints[1].pos2 + controlPoints[1].pos3) * 0.5 - controlPoints[1].pos1 + (controlPoints[2].pos2 + controlPoints[2].pos3) * 0.5 - controlPoints[2].pos1; patch.center = center; #if !defined(USING_OLD_TESSELLATION_FACTORS) && defined(USING_EDGE_LENGTH_TESS_FACTOR) float3 pos1 = controlPoints[0].pos1; - float3 pos2 = controlPoints[1].pos1; - float3 pos3 = controlPoints[2].pos1; - + float3 pos2 = controlPoints[1].pos1 + pos1; + float3 pos3 = controlPoints[2].pos1 + pos1; float3 distances = max(sqrt(float3( - lengthSq(pos1 - world_view_pos), - lengthSq(pos2 - world_view_pos), - lengthSq(pos3 - world_view_pos) + lengthSq((pos1 + pos3) * 0.5 - world_view_pos), + lengthSq((pos2 + pos1) * 0.5 - world_view_pos), + lengthSq((pos3 + pos2) * 0.5 - world_view_pos) )), min_tessellation_distance); float tessellationFadeOutEnd = max_tessellation_distance + tessellation_transition_distance; @@ -168,15 +167,19 @@ hlsl(hs) { DRAW_CALL_ID = GET_DRAW_CALL_ID_TRIANGULATION(inputPatch[tid]); #endif int next = (1U << tid) & 3; // (tid + 1) % 3 - float3 p1 = inputPatch[tid].pos.xyz; - float3 p2 = inputPatch[next].pos.xyz; - float3 n1 = inputPatch[tid].normal.xyz; + float3 base = inputPatch[0].pos.xyz; + float3 p1 = inputPatch[tid].pos.xyz - base; + float3 p2 = inputPatch[next].pos.xyz - base; + float3 n1 = inputPatch[tid].normal.xyz; float3 n2 = inputPatch[next].normal.xyz; HsControlPoint output; //control points positions const float FIXED_BIAS = 1e-3f; - output.pos1 = p1; + if (tid == 0) + output.pos1 = base; + else + output.pos1 = p1; #if PN_TRIANGULATION_SMOOTHING float pos2Bias = max(abs(dot(p2 - p1, n1)), FIXED_BIAS); float pos3Bias = max(abs(dot(p1 - p2, n2)), FIXED_BIAS); @@ -186,6 +189,7 @@ hlsl(hs) { #endif output.pos2 = 2 * p1 + p2 + pos2Bias * n1; output.pos3 = 2 * p2 + p1 + pos3Bias * n2; + //control points normals float3 v12 = 4 * dot(p2 - p1, n1 + n2) / dot(p2 - p1, p2 - p1); output.normal1 = n1; @@ -207,17 +211,23 @@ hlsl(ds) { float u = uvw.x; float v = uvw.y; float w = uvw.z; - //output position is weighted combination of all 10 position control points + + // PN triangles interpolation, output position is a weighted average of all 10 control points + // Since the positions are relative to the first vertex, we don't need to account for it in the calculations + // This way we can skip the first element of the calculation, which would normally be `input[0].pos1 * w * w * w` float3 pos = - input[0].pos1 * w * w * w + input[1].pos1 * u * u * u + input[2].pos1 * v * v * v + + input[1].pos1 * u * u * u + input[2].pos1 * v * v * v + input[0].pos2 * w * w * u + input[0].pos3 * w * u * u + input[1].pos2 * u * u * v + input[1].pos3 * u * v * v + input[2].pos2 * v * v * w + input[2].pos3 * v * w * w + patchData.center * u * v * w; + + // input[0].pos1 stores the global origin of the patch, we apply it here to bring the triangle back to global space + pos += input[0].pos1; + //output normal is weighted combination of all 6 position control points float3 nor = input[0].normal1 * w * w + input[1].normal1 * u * u + input[2].normal1 * v * v + input[0].normal2 * w * u + input[1].normal2 * u * v + input[2].normal2 * v * w; - //transform and output data output.pos = float4(pos, 1); output.normal = 0; diff --git a/prog/gameLibs/render/shaders/rt_texture_outputs.inc.hlsli b/prog/gameLibs/render/shaders/rt_texture_outputs.inc.hlsli index 017d6587f..3a88046fb 100644 --- a/prog/gameLibs/render/shaders/rt_texture_outputs.inc.hlsli +++ b/prog/gameLibs/render/shaders/rt_texture_outputs.inc.hlsli @@ -1,4 +1,5 @@ #ifndef RT_TEXTURE_OUTPUTS BINDLESS_TEX_ARRAY(Texture2D, rt_texture_outputs, 3); + BINDLESS_SMP_ARRAY(SamplerComparisonState, rt_texture_samplers, 2); #define RT_TEXTURE_OUTPUTS #endif diff --git a/prog/gameLibs/render/shaders/smootherstep.hlsl b/prog/gameLibs/render/shaders/smootherstep.hlsl index 4e1e028ee..f24ed45ab 100644 --- a/prog/gameLibs/render/shaders/smootherstep.hlsl +++ b/prog/gameLibs/render/shaders/smootherstep.hlsl @@ -20,4 +20,44 @@ float smootherstep(float edge0, float edge1, float x) // Evaluate polynomial return smootherstep(x); } + +float2 smootherstep3(float2 x)//3rd order +{ + float2 x2 = x*x; + return saturate(x2*x2 * (x*(x*(70 - 20*x) - 84) + 35)); +} + +float2 smootherstep(float2 x) +{ + // Evaluate polynomial + return saturate(x * x * x * (x * (x * 6 - 15) + 10)); +} + +float2 smootherstep(float2 edge0, float2 edge1, float2 x) +{ + // Scale, and clamp x to 0..1 range + x = saturate((x - edge0) / (edge1 - edge0)); + // Evaluate polynomial + return smootherstep(x); +} + +float4 smootherstep3(float4 x)//3rd order +{ + float4 x2 = x*x; + return saturate(x2*x2 * (x*(x*(70 - 20*x) - 84) + 35)); +} + +float4 smootherstep(float4 x) +{ + // Evaluate polynomial + return saturate(x * x * x * (x * (x * 6 - 15) + 10)); +} + +float4 smootherstep(float4 edge0, float4 edge1, float4 x) +{ + // Scale, and clamp x to 0..1 range + x = saturate((x - edge0) / (edge1 - edge0)); + // Evaluate polynomial + return smootherstep(x); +} #endif \ No newline at end of file diff --git a/prog/gameLibs/render/shaders/ssao_inc.dshl b/prog/gameLibs/render/shaders/ssao_inc.dshl index 35004e6bf..313e2590d 100644 --- a/prog/gameLibs/render/shaders/ssao_inc.dshl +++ b/prog/gameLibs/render/shaders/ssao_inc.dshl @@ -6,7 +6,7 @@ hlsl { int use_ssao_reprojection = 0; interval use_ssao_reprojection : off<1, on; -float4x4 ssao_gbuf_prev_globtm_no_ofs_psf; +float4x4 ssao_gbuf_prev_globtm; texture ssao_tex; float4 lowres_rt_params = (1280, 720, 0, 0); @@ -35,7 +35,7 @@ macro INIT_MINIMUM_SSAO_TEX(stage) (stage) { ssao_tex@tex = ssao_tex hlsl { Texture2D ssao_tex@tex; } } if (use_ssao_reprojection == on) { (stage) { - ssao_gbuf_prev_globtm_no_ofs_psf@f44 = ssao_gbuf_prev_globtm_no_ofs_psf; + ssao_gbuf_prev_globtm@f44 = ssao_gbuf_prev_globtm; } } endmacro diff --git a/prog/gameLibs/render/shaders/ssao_reprojection.dshl b/prog/gameLibs/render/shaders/ssao_reprojection.dshl index 1c2c93af6..90e2fbf4f 100644 --- a/prog/gameLibs/render/shaders/ssao_reprojection.dshl +++ b/prog/gameLibs/render/shaders/ssao_reprojection.dshl @@ -13,7 +13,7 @@ float4 prev_view_vecLT; float4 prev_view_vecRT; float4 prev_view_vecLB; float4 prev_view_vecRB; -float4 prev_zn_zfar; +float4 prev_zn_zfar = (1, 10, 0, 0); texture downsampled_motion_vectors_tex; texture prev_downsampled_motion_vectors_tex; @@ -107,36 +107,40 @@ hlsl(stage) { void get_ssao_disocclusion_weight(float2 historyUV, float prev_linear_depth, inout SSAO_TYPE historySample, inout float newFrameWeight) { #if FIX_DISCONTINUTIES - float4 depths = prev_downsampled_close_depth_tex.GatherRed(prev_downsampled_close_depth_tex_samplerstate, historyUV).wzxy; + float2 historyCrdf = historyUV * prev_downsampled_close_depth_tex_target_size.xy - 0.5; + float2 floorCrd = floor(historyCrdf); + float2 gatherUV = (floorCrd + 1.0) * prev_downsampled_close_depth_tex_target_size.zw; + float2 fractCrd = historyCrdf - floorCrd; + float4 depths = prev_downsampled_close_depth_tex.GatherRed(prev_downsampled_close_depth_tex_samplerstate, gatherUV).wzxy; float4 linearDepths = linearize_z4(depths, prev_zn_zfar.zw); float4 depthDiff = abs(linearDepths - prev_linear_depth); float threshold = 0.05*prev_linear_depth; - float4 weights = depthDiff < threshold; - float2 historyCrdf = historyUV*prev_downsampled_close_depth_tex_target_size.xy - 0.5; - float2 fractCrd = frac(historyCrdf); - if (all(weights)) // valid - { - historySample = tex2Dlod(ssao_prev_tex, float4(historyUV, 0, 0)).SSAO_ATTRS; - } else + bool4 mask = depthDiff < threshold; + + if (!any(mask)) { - float4 bil = float4(fractCrd, 1-fractCrd); - weights *= float4(bil.zx*bil.w, bil.zx*bil.y) + 1e-4; - float sumW = dot(weights, 1); - newFrameWeight = sumW > 0.00001 ? newFrameWeight : 1; - weights *= rcp(max(1e-6, sumW)); - //float2 uv = (floor(historyCrdf) + 0.5)*prev_downsampled_close_depth_tex_target_size.zw;//todo: one madd - //we need to use same sampler and same uv, otherwise they can diverge - float2 uv = historyUV; - historySample.x = dot(ssao_prev_tex.GatherRed(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); - - #if SSAO_HAS_GREEN - historySample.y = dot(ssao_prev_tex.GatherGreen(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); - #endif - - #if SSAO_HAS_BLUE - historySample.z = dot(ssao_prev_tex.GatherBlue(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); - #endif + newFrameWeight = 1; + return; } + + float4 bil = float4(fractCrd, 1 - fractCrd); + float4 upsampleWeights = float4(bil.zx * bil.w, bil.zx * bil.y); + float4 spatialWeights = exp(-depthDiff * (5.0 / threshold)); + float4 weights = (spatialWeights * upsampleWeights + 1e-4) * float4(mask); + weights /= dot(weights, 1.0); + + //float2 uv = (floor(historyCrdf) + 0.5)*prev_downsampled_close_depth_tex_target_size.zw;//todo: one madd + //we need to use same sampler and same uv, otherwise they can diverge + float2 uv = gatherUV; + historySample.x = dot(ssao_prev_tex.GatherRed(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); + + #if SSAO_HAS_GREEN + historySample.y = dot(ssao_prev_tex.GatherGreen(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); + #endif + + #if SSAO_HAS_BLUE + historySample.z = dot(ssao_prev_tex.GatherBlue(prev_downsampled_close_depth_tex_samplerstate, uv).wzxy, weights); + #endif #else historySample = tex2Dlod(ssao_prev_tex, float4(historyUV, 0, 0)).SSAO_ATTRS; #endif diff --git a/prog/gameLibs/render/shaders/ssr_base.dshl b/prog/gameLibs/render/shaders/ssr_base.dshl index 70d24c3f3..314933224 100644 --- a/prog/gameLibs/render/shaders/ssr_base.dshl +++ b/prog/gameLibs/render/shaders/ssr_base.dshl @@ -87,7 +87,7 @@ macro INIT_TEXTURES(code) } endmacro -float4 prev_zn_zfar; +float4 prev_zn_zfar = (1, 10, 0, 0); float4 move_world_view_pos; float ssr_camera_move_scale_for_miss_reprojection = 200.0; float static_pixel_miss_reprojection_weight = 0.5; diff --git a/prog/gameLibs/render/shaders/ssr_common.hlsl b/prog/gameLibs/render/shaders/ssr_common.hlsl index 74e5cb370..ccb738936 100644 --- a/prog/gameLibs/render/shaders/ssr_common.hlsl +++ b/prog/gameLibs/render/shaders/ssr_common.hlsl @@ -18,6 +18,10 @@ #define PREV_FRAME_UNPACK(x) (x) #endif +#ifndef PREV_FRAME_PACK +#define PREV_FRAME_PACK(x) (x) +#endif + #include "interleavedGradientNoise.hlsl" #include "noise/Value3D.hlsl" diff --git a/prog/gameLibs/render/shaders/ssr_compute.dshl b/prog/gameLibs/render/shaders/ssr_compute.dshl index fec692ea6..223b295c8 100644 --- a/prog/gameLibs/render/shaders/ssr_compute.dshl +++ b/prog/gameLibs/render/shaders/ssr_compute.dshl @@ -369,6 +369,7 @@ macro RESOLVE_BY_NEIGHBOURS(code) TotalWeight += sampleWeight; // Integration of microfacet distribution (PDF) //fireflies + sampleColor.rgb = PREV_FRAME_PACK(sampleColor.rgb); sampleColor.rgb /= 1 + luminance(sampleColor.rgb); Out += sampleWeight*sampleColor; // Integration of BRDF weighted color @@ -380,6 +381,7 @@ macro RESOLVE_BY_NEIGHBOURS(code) //fireflies Out.rgb /= 1 - luminance(Out.rgb); + Out.rgb = PREV_FRAME_UNPACK(Out.rgb); return Out; } diff --git a/prog/gameLibs/render/shaders/ssr_ps.dshl b/prog/gameLibs/render/shaders/ssr_ps.dshl index a7787ce26..250723c63 100644 --- a/prog/gameLibs/render/shaders/ssr_ps.dshl +++ b/prog/gameLibs/render/shaders/ssr_ps.dshl @@ -54,6 +54,8 @@ shader ssr w, cameraToPoint, globtm_no_ofs_psf, 0, worldPos, reflectionDistance); #endif + float ssrResultPrecision = newTarget.a; + float3 prevViewVec = cameraToPoint; // temporal reprojection first @@ -96,6 +98,7 @@ shader ssr surface_3d_motion.z = 0; #endif + float weightMul = 1.0f; bool historyWeight = false; half4 prevTarget = 0; { @@ -106,15 +109,17 @@ shader ssr { useUV = prevUVZ.xy; validateNormal = true; + weightMul = lerp(1.0f, static_pixel_miss_reprojection_weight.x + static_pixel_miss_reprojection_weight.y * ssrResultPrecision, saturate(scaled_prev_camera_translation/w)); } historyWeight = get_ssr_disocclusion_weight_sample(normal, linear_roughness, useUV, currentPosToPrevW, validateNormal, prevTarget); } //rougher surfaces should be more relaxed, to fight noise - float weight = historyWeight ? 0.1 - 0.03*linear_roughness : 1; + float weight = historyWeight ? 0.9 + 0.03*linear_roughness : 0; + weight *= weightMul; - half4 result = force_ignore_history == 0 ? lerp(prevTarget, newTarget, weight) : newTarget; + half4 result = force_ignore_history == 0 ? lerp(newTarget, prevTarget, weight) : newTarget; return result; } } diff --git a/prog/gameLibs/render/shaders/tex_view.dshl b/prog/gameLibs/render/shaders/tex_view.dshl index e5732dc36..55a4e6f6e 100644 --- a/prog/gameLibs/render/shaders/tex_view.dshl +++ b/prog/gameLibs/render/shaders/tex_view.dshl @@ -76,7 +76,11 @@ shader tex_view { ##if text_color_mode == modeRGBA float4 res = tex2D(texsmp, v.tc) * v.col; - clip_alpha_atest(res.a); + if (0 < get_atest_value_ref()) + { + clip_alpha_atest(res.a); + res.a = 1.0f; + } return res; ##elif text_color_mode == modeA return float4((tex2D(texsmp, v.tc)).aaa, 1); diff --git a/prog/gameLibs/render/shaders/tsr.dshl b/prog/gameLibs/render/shaders/tsr.dshl index a6c6bf15d..95a3f1995 100644 --- a/prog/gameLibs/render/shaders/tsr.dshl +++ b/prog/gameLibs/render/shaders/tsr.dshl @@ -42,6 +42,7 @@ shader tsr_cs historyColorTex@smp2d = tsr_history_color; historyConfidenceTex@smp2d = tsr_history_confidence; reactiveMask@smp2d = tsr_reactive_mask; + exposureTex@tex2d = tsr_exposure; jitterOffset@f2 = (tsr_jitter_offset.x, tsr_jitter_offset.y, 0, 0); outputResolution@f4 = (tsr_output_resolution.x, tsr_output_resolution.y, 1/tsr_output_resolution.x, 1/tsr_output_resolution.y); @@ -164,12 +165,12 @@ shader tsr_cs return cacheParams; } - void prefetchCacheColor(inout CacheParams cache_params, float2 input_texel_coord, float2 sigma_inv) + void prefetchCacheColor(inout CacheParams cache_params, float2 input_texel_coord, float2 sigma_inv, float exposure) { // no branch for texture fetch as it makes it actually slower - float4 colorR = inputColorTex.GatherRed(inputColorTex_samplerstate, cache_params.prefetchScreenTc); - float4 colorG = inputColorTex.GatherGreen(inputColorTex_samplerstate, cache_params.prefetchScreenTc); - float4 colorB = inputColorTex.GatherBlue(inputColorTex_samplerstate, cache_params.prefetchScreenTc); + float4 colorR = inputColorTex.GatherRed(inputColorTex_samplerstate, cache_params.prefetchScreenTc) * exposure; + float4 colorG = inputColorTex.GatherGreen(inputColorTex_samplerstate, cache_params.prefetchScreenTc) * exposure; + float4 colorB = inputColorTex.GatherBlue(inputColorTex_samplerstate, cache_params.prefetchScreenTc) * exposure; float4 Y, Co, Cg; PackToYCoCg(colorR, colorG, colorB, Y, Co, Cg); @@ -278,7 +279,7 @@ shader tsr_cs confidence = (confidenceAndDynamic - is_dynamic * 0.5) * 2.0; } - float4 reconstructHistory(float2 history_tc, out float confidence, out bool is_dynamic) + float4 reconstructHistory(float2 history_tc, float exposure, out float confidence, out bool is_dynamic) { ##if tsr_history_reconstruction == bicubic BicubicSharpenWeights weights; @@ -303,7 +304,7 @@ shader tsr_cs // even if there is no movement (resampling is perfect) there has to be some loss confidence *= is_dynamic ? processLossDynamic : processLoss; - return tonemap(PackToYCoCgAlpha(result)); + return tonemap(PackToYCoCgAlpha(result * exposure)); } // calculates rejection based on min/max values with having an exponential decay above the min/max threshold @@ -370,7 +371,8 @@ shader tsr_cs return confidence * lerp(minRejection, maxRejection, reactive * reactive); } - TemporalSuperResolutionOutput calcResult(float4 input_color_depth, float input_confidence, float4 history_color_depth, float history_confidence, float rejection, bool is_dynamic, float reactive) + TemporalSuperResolutionOutput calcResult(float4 input_color_depth, float input_confidence, float4 history_color_depth, + float history_confidence, float rejection, bool is_dynamic, float reactive, float exposure) { // the update function is s_next = (s_prev * w_prev + s_cur * w_cur) / (w_prev + w_cur) // and the weight update is w_next = w_prev + w_cur @@ -385,7 +387,7 @@ shader tsr_cs TemporalSuperResolutionOutput result; result.color = max( 0.0, - UnpackFromYCoCgAlpha(tonemap_inv(lerp(history_color_depth, input_color_depth, (c1 / (c1 + c2)) * debugUpdateOverride))) + UnpackFromYCoCgAlpha(tonemap_inv(lerp(history_color_depth, input_color_depth, (c1 / (c1 + c2)) * debugUpdateOverride))) * rcp(exposure) ); result.confidence = encodeConfidenceAndDynamicFlag(adjustConfidenceForNextFrame((c1 + c2) / c3, reactive), is_dynamic); ##if tsr_debug == on @@ -436,9 +438,15 @@ shader tsr_cs float reactive = 0; ##endif + ##if tsr_exposure != NULL + float exposure = exposureTex[uint2(0,0)].x; + ##else + float exposure = 1; + ##endif + float historyConfidence; bool historyIsDynamic; - float4 historyColorDepth = reconstructHistory(historyUV, historyConfidence, historyIsDynamic); + float4 historyColorDepth = reconstructHistory(historyUV, exposure, historyConfidence, historyIsDynamic); float rejection = calculateDepthVarianceRejection(historyColorDepth.a - motionVector.z, depthStats.farthestDepth, depthStats.closestDepth); rejection *= calculateStaticDynamicMismatchRejection(currentIsDynamic, historyIsDynamic); @@ -446,7 +454,7 @@ shader tsr_cs validateHistory(historyUV, historyColorDepth, historyConfidence, rejection); - prefetchCacheColor(cacheParams, jitteredInputTexelCoord, inputFilterSigmaInv); + prefetchCacheColor(cacheParams, jitteredInputTexelCoord, inputFilterSigmaInv, exposure); GroupMemoryBarrierWithGroupSync(); if (any(dtId >= uint2(outputResolution.xy))) return; @@ -458,7 +466,8 @@ shader tsr_cs historyColorDepth.rgb = clipHistory(historyColorDepth.rgb, inputColor, inputMean, inputVariance, length(motionVector.xy), currentIsDynamic, reactive); - TemporalSuperResolutionOutput result = calcResult(float4(inputColor, depthStats.closestDepth), inputConfidence, historyColorDepth, historyConfidence, rejection, currentIsDynamic, reactive); + TemporalSuperResolutionOutput result = calcResult(float4(inputColor, depthStats.closestDepth), inputConfidence, historyColorDepth, + historyConfidence, rejection, currentIsDynamic, reactive, exposure); outColor[dtId] = result.color; outConfidence[dtId] = result.confidence; ##if tsr_debug == on diff --git a/prog/gameLibs/render/shaders/tsr.inc.dshl b/prog/gameLibs/render/shaders/tsr.inc.dshl index 810a18576..b653a0603 100644 --- a/prog/gameLibs/render/shaders/tsr.inc.dshl +++ b/prog/gameLibs/render/shaders/tsr.inc.dshl @@ -2,6 +2,7 @@ texture tsr_input_color; texture tsr_history_color; texture tsr_history_confidence; texture tsr_reactive_mask; +texture tsr_exposure; float4 tsr_jitter_offset; float4 tsr_input_resolution = (1, 1, 1, 1); diff --git a/prog/gameLibs/render/shaders/upscale_sampling.dshl b/prog/gameLibs/render/shaders/upscale_sampling.dshl index 425dc8ec7..b3fa12935 100644 --- a/prog/gameLibs/render/shaders/upscale_sampling.dshl +++ b/prog/gameLibs/render/shaders/upscale_sampling.dshl @@ -61,6 +61,10 @@ shader upscale_sampling UPSCALE_SAMPLING_CORE(ps) hlsl(ps) { + ##if hardware.ps4 || hardware.ps5 + #pragma PSSL_target_output_format (default FMT_32_R) // compatible with uint targets + ##endif + uint upscale_sampling_ps(VsOutput input HW_USE_SCREEN_POS) : SV_Target0 { return upscale_sampling(GET_SCREEN_POS(input.pos).xy); diff --git a/prog/gameLibs/render/shaders/water_ripples.dshl b/prog/gameLibs/render/shaders/water_ripples.dshl index 4d30958fd..83c523c4c 100644 --- a/prog/gameLibs/render/shaders/water_ripples.dshl +++ b/prog/gameLibs/render/shaders/water_ripples.dshl @@ -36,7 +36,7 @@ float4 water_ripples_speed = (4, 4, 4, 2); // y - unused // z - for deep water // w - mul for deepness (limited by 1) -float4 water_ripples_drop_force = (2, 0, 3, 2); +float4 water_ripples_drop_force = (1, 0, 1.5, 1); define_macro_if_not_defined INIT_TRACKDIRT_OFFSET(code) endmacro @@ -264,8 +264,8 @@ shader water_ripples_update } } - infoAdd *= noiseData * 30 * (water_ripples_drop_force.x + - water_ripples_drop_force.z * saturate(waterBelow * water_ripples_drop_force.w)); + infoAdd *= noiseData * (water_ripples_drop_force.x + + water_ripples_drop_force.z * saturate(waterBelow * water_ripples_drop_force.w)); float waveFactor = saturate(10*abs(Ucenter1)); @@ -285,7 +285,8 @@ shader water_ripples_update newU = (DT2 / (1.0f + waveDamp * DT)) * ( waveSpeed * laplacian + (2 * Ucenter1 - Ucenter2) / DT2 + waveDamp * Ucenter1 / DT - - waveBack * Ucenter1 + infoAdd); + waveBack * Ucenter1 + + infoAdd / DT ); } } } diff --git a/prog/gameLibs/render/shaders/water_ssr_common.hlsl b/prog/gameLibs/render/shaders/water_ssr_common.hlsl index 57bc0e281..a84bf7e66 100644 --- a/prog/gameLibs/render/shaders/water_ssr_common.hlsl +++ b/prog/gameLibs/render/shaders/water_ssr_common.hlsl @@ -46,14 +46,9 @@ float4 hierarchRayMarch(float2 rayStart_uv, float3 R, float linear_roughness, fl float3 rayStepScreen = rayEndScreen - rayStartScreen; // calculate border of screen - float2 screenBorder = (rayStepScreen.xy >= 0) ? float2(1,1) : -float2(1,1); - float2 bScale = (abs(rayStepScreen.xy) < 1e-5) ? 1 : (screenBorder - rayStartScreen.xy) / rayStepScreen.xy; - bScale = (screenBorder - rayStartScreen.xy) / rayStepScreen.xy; - float bScaleW = max(bScale.x, bScale.y); - float borderScale = bScaleW > 0 ? min(bScale.x, bScale.y) : 1; - FLATTEN - if (rayStepScreen.z > 0) - borderScale = min(borderScale, (1-rayStartScreen.z)/rayStepScreen.z); + float3 screenBorder = (rayStepScreen >= 0) ? float3(1, 1, 1) : float3(-1, -1, 0); + float3 bScale = (screenBorder - rayStartScreen) / rayStepScreen; + float borderScale = min3(bScale.x, bScale.y, bScale.z); rayStepScreen *= borderScale; float2 toleranceUpMAD = -float2(abs(rayStepScreen.z*0.25), abs(rayStepScreen.z*STEP)); float3 rayStartUVz = float3( rayStartScreen.xy * float2( 0.5, -0.5 ) + float2(0.5,0.5), rayStartScreen.z ); @@ -186,7 +181,7 @@ half4 performSSR(uint2 pixelPos, float2 UV, float linear_roughness, float3 N, float3 originToPoint = cameraToPoint; originToPoint = normalize(originToPoint); uint frameRandom = uint(SSRParams.w); - float stepOfs = blue_noise_tex[pixelPos.xy % 128].x; + float stepOfs = interleavedGradientNoiseFramed(pixelPos.xy, uint(SSRParams.z)) - 0.25; // Sample set dithered over 4x4 pixels float3 R = reflect(originToPoint, N); diff --git a/prog/gameLibs/render/texcompressors/bcCompressor.cpp b/prog/gameLibs/render/texcompressors/bcCompressor.cpp index 362b0b22d..62d9bf0f2 100644 --- a/prog/gameLibs/render/texcompressors/bcCompressor.cpp +++ b/prog/gameLibs/render/texcompressors/bcCompressor.cpp @@ -335,6 +335,7 @@ void BcCompressor::updateFromFaceMip(TEXTUREID src_id, int src_face, int src_mip d3d::draw(PRIM_TRISTRIP, 3 + (tiles - 1) * 4, 2); #endif } + d3d::setvsrc_ex(0, nullptr, 0, 0); d3d::resource_barrier({bufferTex.getTex2D(), RB_RO_SRV | RB_RO_COPY_SOURCE, (unsigned)dst_mip, 1}); } diff --git a/prog/gameLibs/render/volumetricLights/volumetricLights.cpp b/prog/gameLibs/render/volumetricLights/volumetricLights.cpp index 4770971b3..db34173d0 100644 --- a/prog/gameLibs/render/volumetricLights/volumetricLights.cpp +++ b/prog/gameLibs/render/volumetricLights/volumetricLights.cpp @@ -315,13 +315,24 @@ static bool has_froxel_fog_experimental_offscreen_reprojection() return get_shadervar_interval(var::froxel_fog_use_experimental_offscreen_reprojection) >= 1; } +static bool need_froxel_fog_experimental_offscreen_reprojection(VolumeLight::DistantFogQuality df_quality) +{ + return df_quality != VolumeLight::DistantFogQuality::DisableDistantFog; // it is tied to DF for now, for lack of better option +} + void VolumeLight::onSettingsChange(VolfogQuality volfog_quality, VolfogShadowCasting shadow_casting, DistantFogQuality df_quality) { if (!canUseVolfogShadow()) shadow_casting = VolfogShadowCasting::No; + bool needExperimentalVolfogSettings = need_froxel_fog_experimental_offscreen_reprojection(df_quality); + bool currentExperimentalVolfogSettings = has_froxel_fog_experimental_offscreen_reprojection(); + ShaderGlobal::set_int(var::froxel_fog_use_experimental_offscreen_reprojection, needExperimentalVolfogSettings ? 1 : 0); + bool hasExperimentalVolfogSettingsChanged = + currentExperimentalVolfogSettings != has_froxel_fog_experimental_offscreen_reprojection(); + bool bInvalidate = false; - if (volfogQuality != volfog_quality) + if (volfogQuality != volfog_quality || hasExperimentalVolfogSettingsChanged) { volfogQuality = volfog_quality; froxelResolution = calc_froxel_resolution(froxelOrigResolution, volfogQuality); @@ -428,19 +439,12 @@ static bool gpuHasUMA() return d3d_get_gpu_cfg().integrated; // TODO: use a driver command for UMA instead } -void VolumeLight::initExperimentalFeatures() -{ - useExperimentalOffscreenReprojection = has_froxel_fog_experimental_offscreen_reprojection(); - ShaderGlobal::set_int(var::froxel_fog_use_experimental_offscreen_reprojection, useExperimentalOffscreenReprojection); -} - void VolumeLight::init() { init_shader_vars(); preferLinearAccumulation = gpuHasUMA(); // can use special optimization for igpus close(); - initExperimentalFeatures(); constexpr uint32_t FROXEL_FOG_DITHERING_SEED = 666 * 666; generate_poission_points(froxelFogDitheringSamples, FROXEL_FOG_DITHERING_SEED, VOLFOG_DITHERING_POISSON_SAMPLE_CNT, @@ -589,7 +593,9 @@ void VolumeLight::initFroxelFog() d3d::resource_barrier({volfogOcclusion[i].getTex2D(), RB_RO_SRV | RB_STAGE_COMPUTE, 0, 0}); } - if (useExperimentalOffscreenReprojection) + for (int i = 0; i < volfogWeight.count; ++i) + volfogWeight[i].close(); + if (has_froxel_fog_experimental_offscreen_reprojection()) { for (int i = 0; i < volfogWeight.count; ++i) { diff --git a/prog/gameLibs/render/whiteTex.cpp b/prog/gameLibs/render/whiteTex.cpp index 638fe5866..331806974 100644 --- a/prog/gameLibs/render/whiteTex.cpp +++ b/prog/gameLibs/render/whiteTex.cpp @@ -18,6 +18,7 @@ class WhiteRestartProc : public SRestartProc static InitOnDemand white_base_rproc; static UniqueTex white_tex; +static d3d::SamplerHandle white_sampler = d3d::INVALID_SAMPLER_HANDLE; static void startup_white_tex() { @@ -42,4 +43,10 @@ const UniqueTex &get_white_on_demand() return white_tex; } -BaseTexture *get_white_tex_on_demand() { return get_white_on_demand().getBaseTex(); } \ No newline at end of file +BaseTexture *get_white_tex_on_demand() { return get_white_on_demand().getBaseTex(); } +d3d::SamplerHandle get_white_sampler_on_demand() +{ + if (white_sampler == d3d::INVALID_SAMPLER_HANDLE) + white_sampler = d3d::request_sampler({}); + return white_sampler; +} \ No newline at end of file diff --git a/prog/gameLibs/webui/plugins/editorCurves/curveEditor.js b/prog/gameLibs/webui/plugins/editorCurves/curveEditor.js index cb355baf1..b74f55ee8 100644 --- a/prog/gameLibs/webui/plugins/editorCurves/curveEditor.js +++ b/prog/gameLibs/webui/plugins/editorCurves/curveEditor.js @@ -352,7 +352,7 @@ function make_curve_editor_html(name, value, onchange_cb, stroke_style, bck_curv if (e && e._curve_coefficients) { this._ctx.beginPath(); - for (var i = 0; i < curve_default_width; i += 2) + for (var i = 0; i <= curve_default_width; i += 2) { var x = i; var y = (1.0 - e._get_value(1.0 * i / (curve_default_width - 1))) * (curve_default_height - 1); @@ -374,7 +374,7 @@ function make_curve_editor_html(name, value, onchange_cb, stroke_style, bck_curv for (var pass = 0; pass < 2; pass++) { this._ctx.beginPath(); - for (var i = 0; i < curve_default_width; i += 2) + for (var i = 0; i <= curve_default_width; i += 2) { var x = i; var y = (1.0 - this._get_value(1.0 * i / (curve_default_width - 1))) * (curve_default_height - 1); @@ -397,10 +397,35 @@ function make_curve_editor_html(name, value, onchange_cb, stroke_style, bck_curv this._curve_points[i][0] * (curve_default_width - 1) - 2, (1.0 - this._curve_points[i][1]) * (curve_default_height - 1) - 2, 5, 5); + + if (this._curve_point_idx >= 0) + { + var pointPos = this._curve_points[this._curve_point_idx]; + var textPos = [pointPos[0] * (curve_default_width - 1) + 5, (1.0 - pointPos[1]) * (curve_default_height - 1) - 5]; + textPos[0] += pointPos[0] < 0.5 ? 10 : -80; + textPos[1] += pointPos[1] < 0.5 ? -10 : 30; + + var pointX = pointPos[0].toFixed(3); + var pointY = pointPos[1].toFixed(3); + var text = "" + pointX + ", " + pointY; + this._ctx.font = "13px Arial"; + + this._ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; + var textWidth = this._ctx.measureText(text).width; + this._ctx.fillRect(textPos[0] - 2, textPos[1] - 15, textWidth + 4, 20); + + this._ctx.fillStyle = "black"; + this._ctx.fillText(text, textPos[0] + 1, textPos[1] + 1); + this._ctx.fillStyle = "#ddd"; + this._ctx.fillText(text, textPos[0], textPos[1]); + } } elem._curve_mouse_down = function(event) { + if (event.button !== 0) + return; + curve_is_global_mouse_up = false; var x = 1.0 * event.offsetX / (curve_default_width - 1); var y = 1.0 - 1.0 * event.offsetY / (curve_default_height - 1); @@ -495,7 +520,6 @@ function make_curve_editor_html(name, value, onchange_cb, stroke_style, bck_curv elem._curve_interpolation = interpolation; elem._curve_add_remove_points = can_add_remove_points; setTimeout(function(){elem._curve_render(elem, ctx);}, 1); - } setTimeout(setup_curve_elem, 1); @@ -531,7 +555,7 @@ function global_curve_mouse_up(obj, event) var value = ""; if (obj._curve_interpolation === "polynom") - value = obj._curve_coefficients[i].join(", "); + value = obj._curve_coefficients.join(", "); else { for (var i = 0; i < obj._curve_coefficients.length; i++) @@ -607,7 +631,6 @@ function make_curve_gradient_html(name, bck_curves) // bck_curves - array of ele elem._curve_point_idx = -1; elem._curve_name = name; setTimeout(function(){elem._curve_render(elem, ctx);}, 1); - } setTimeout(setup_curve_elem, 1); diff --git a/prog/samples/commonShaders/ssr_common.dshl b/prog/samples/commonShaders/ssr_common.dshl index e35f7423a..fe5a313bc 100644 --- a/prog/samples/commonShaders/ssr_common.dshl +++ b/prog/samples/commonShaders/ssr_common.dshl @@ -25,12 +25,19 @@ float4 prev_globtm_no_ofs_psf_3; int downsampled_depth_mip_count; float4 lowres_rt_params = (1280, 720, 0, 0); -macro SSR_CALCULATE(code) +macro SSR_USE_EXPOSURE(code) INIT_PREV_PRE_EXPOSURE(code) USE_PREV_PRE_EXPOSURE(code) hlsl(code){ - #define linearSmoothnessToLinearRoughness(_param) (1.0f - _param) #define PREV_FRAME_UNPACK(x) prev_pre_exposure_decode(x) + #define PREV_FRAME_PACK(x) prev_pre_exposure_encode(x) + } +endmacro + +macro SSR_CALCULATE(code) + SSR_USE_EXPOSURE(code) + hlsl(code){ + #define linearSmoothnessToLinearRoughness(_param) (1.0f - _param) #include "ssr_common.hlsl" } endmacro diff --git a/prog/scripts/sq/std/string.nut b/prog/scripts/sq/std/string.nut index 68b5dc47e..fa628b1c4 100644 --- a/prog/scripts/sq/std/string.nut +++ b/prog/scripts/sq/std/string.nut @@ -9,6 +9,7 @@ const CASE_PAIR_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍ local INVALID_INDEX = -1 local intRegExp = null +local possibleNotStrRegExp = null local floatRegExp = null local trimRegExp = null local stripTagsConfig = null @@ -55,10 +56,14 @@ function split(joined, glue, isIgnoreEmpty = false) { : joined.split(glue).filter(@(v) v!="") } +const intre = @"^-?\d+$" +const floatre = @"^-?\d+\.?\d*([eE][-+]?\d{1,3})?$" +let notstringre = @"(^-?\d+$)|(^-?\d+\.?\d*([eE][-+]?\d{1,3})?$)|^(null|true|false)$" if (regexp2 != null) { - intRegExp = regexp2(@"^-?\d+$") - floatRegExp = regexp2(@"^-?\d+\.?\d*([eE][-+]?\d{1,3})?$") + intRegExp = regexp2(intre) + floatRegExp = regexp2(floatre) trimRegExp = regexp2(@"^\s+|\s+$") + possibleNotStrRegExp = regexp2(notstringre) stripTagsConfig = [ { re2 = regexp2("~") @@ -94,8 +99,9 @@ if (regexp2 != null) { }) } else if (regexp != null) { - intRegExp = regexp(@"^-?(\d+)$") - floatRegExp = regexp(@"^-?\d+\.?\d*([eE][-+]?\d{1,3})?$") + intRegExp = regexp(intre) + possibleNotStrRegExp = regexp(notstringre) + floatRegExp = regexp(floatre) trimRegExp = regexp(@"^(\s+)|(\s+)$") stripTagsConfig = [ { @@ -132,6 +138,12 @@ else if (regexp != null) { }) } +function isStringObviousString(str) { + if (possibleNotStrRegExp != null) + return !possibleNotStrRegExp.match(str) + return false +} + let defTostringParams = freeze({ maxdeeplevel = 4 compact=true @@ -219,7 +231,9 @@ function tostring_any(input, tostringfunc=null, compact=true) { else if (typ == "string"){ if (input=="") return "\"\"" - return $"\"{input}\"" + if (!compact || !isStringObviousString(input)) + return $"\"{input}\"" + return input } else if (typ == "null"){ return "null" @@ -596,7 +610,6 @@ function floatToStringRounded(value, presize) { } return format("%.{0}f".subst(-math.log10(presize).tointeger()), value) } - function isStringInteger(str) { if (type(str) == "integer") return true diff --git a/prog/scripts/sq/stubs/dagor.system b/prog/scripts/sq/stubs/dagor.system index 63e18cc64..f9658af2a 100644 --- a/prog/scripts/sq/stubs/dagor.system +++ b/prog/scripts/sq/stubs/dagor.system @@ -19,6 +19,7 @@ return { function set_app_window_title(a) { } MB_BUTTON_1 = 1 ARCH_BITS = 32 + SANITIZER = null argv = [] MB_FOREGROUND = 8192 MB_ICON_INFORMATION = 1024 diff --git a/prog/scripts/sq/stubs/ecs b/prog/scripts/sq/stubs/ecs index 35109b57c..6dfb8ae61 100644 --- a/prog/scripts/sq/stubs/ecs +++ b/prog/scripts/sq/stubs/ecs @@ -248,6 +248,22 @@ let ecsTypes = { name = "CompStringList" getAll = @() [] } + CompFloatList = class { + name = "CompFloatList" + getAll = @() [] + } + CompPoint2List = class { + name = "CompPoint2List" + getAll = @() [] + } + CompPoint3List = class { + name = "CompPoint3List" + getAll = @() [] + } + CompPoint4List = class { + name = "CompPoint4List" + getAll = @() [] + } CompTMatrixList = class { name = "CompTMatrixList" getAll = @() [] diff --git a/prog/scripts/sq/stubs/matching.errors b/prog/scripts/sq/stubs/matching.errors index c85bae91f..392fe5716 100644 --- a/prog/scripts/sq/stubs/matching.errors +++ b/prog/scripts/sq/stubs/matching.errors @@ -1,6 +1,5 @@ return { INVALID_USER_ID = -1 - INVALID_GROUP_ID = 0 INVALID_SESSION_ID = 0 INVALID_ROOM_ID = -1 INVALID_MEMBER_ID = -1 diff --git a/prog/tools/AssetViewer/Entity/colorDlgAppMat.cpp b/prog/tools/AssetViewer/Entity/colorDlgAppMat.cpp index a529cea2c..a203a1acb 100644 --- a/prog/tools/AssetViewer/Entity/colorDlgAppMat.cpp +++ b/prog/tools/AssetViewer/Entity/colorDlgAppMat.cpp @@ -4,7 +4,7 @@ #include "../av_environment.h" ColorDialogAppMat::ColorDialogAppMat(void *phandle, const char caption[]) : - ColorDialog(phandle, caption, environment::getSinglePaintColor()) + ColorDialog(phandle, caption, environment::getSinglePaintColor(), hdpi::_pxScaled(760), hdpi::_pxScaled(420)) { getPanel()->createCheckBox(ID_CHECKBOX_MODE, "Apply color to entity mode", environment::isUsingSinglePaintColor()); } diff --git a/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.cpp b/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.cpp index 77595588d..fc78e1806 100644 --- a/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.cpp +++ b/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.cpp @@ -71,7 +71,7 @@ int CtrlChildsDialog::onMenuItemClick(unsigned id) void CtrlChildsDialog::initPanel() { PropPanel::ContainerPropertyControl *panel = DialogWindow::getPanel(); - panel->createTree(PID_CHILDS_TREE, "", hdpi::Px(300)); + panel->createTree(PID_CHILDS_TREE, "", hdpi::Px(0)); } void CtrlChildsDialog::clear() @@ -225,15 +225,6 @@ const char *CtrlChildsDialog::getChildNameFromSettings(const DataBlock &settings return nullptr; } -void CtrlChildsDialog::updateImguiDialog() -{ - PropPanel::ContainerPropertyControl *tree = getPanel()->getById(PID_CHILDS_TREE)->getContainer(); - const float treeHeight = ImGui::GetContentRegionAvail().y - ImGui::GetStyle().ItemSpacing.y; - tree->setHeight(hdpi::Px(treeHeight)); - - DialogWindow::updateImguiDialog(); -} - void CtrlChildsDialog::editSelectedNode() { PropPanel::ContainerPropertyControl *tree = DialogWindow::getPanel()->getById(PID_CHILDS_TREE)->getContainer(); diff --git a/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.h b/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.h index 78bbc863d..a8ae51246 100644 --- a/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.h +++ b/prog/tools/AssetViewer/animTree/controllers/ctrlChildsDialog.h @@ -27,7 +27,6 @@ class CtrlChildsDialog : public PropPanel::DialogWindow, public PropPanel::ITree String getImportantParamPrefixName(const DataBlock &settings, int child_idx, CtrlType type); private: - virtual void updateImguiDialog() override; void editSelectedNode(); static const int DEFAULT_MINIMUM_WIDTH = 250; diff --git a/prog/tools/AssetViewer/av_environment.cpp b/prog/tools/AssetViewer/av_environment.cpp index f4b7030a5..608a929d4 100644 --- a/prog/tools/AssetViewer/av_environment.cpp +++ b/prog/tools/AssetViewer/av_environment.cpp @@ -953,6 +953,7 @@ void show_environment_settings(void *handle, AssetLightData *ald) SkyLightProps skyProps = sky; EnvSetDlg envSetDlg(handle, defSun, ald); + envSetDlg.autoSize(); // ImGui scrolls to the focused item, which in this case is at the bottom and requires scrolling. Prevent that. envSetDlg.setInitialFocus(PropPanel::DIALOG_ID_NONE); diff --git a/prog/tools/AssetViewer/scripts/animation/anim_tree_av.das b/prog/tools/AssetViewer/scripts/animation/anim_tree_av.das index 9de128a44..1eef3b2a5 100644 --- a/prog/tools/AssetViewer/scripts/animation/anim_tree_av.das +++ b/prog/tools/AssetViewer/scripts/animation/anim_tree_av.das @@ -20,6 +20,6 @@ def anim_tree_ui(event : ImGuiStage; eid : EntityId; var animchar : AnimcharBase if animchar.animGraph != null && animchar.animState != null var resetState = false - render_anim_graph2(*animchar.animGraph, *animchar.animState, resetState, *paramsFilter) + render_anim_graph2(animchar, *animchar.animGraph, *animchar.animState, resetState, *paramsFilter) imgui::End() \ No newline at end of file diff --git a/prog/tools/ShaderCompiler2/DebugLevel.h b/prog/tools/ShaderCompiler2/DebugLevel.h index 4d0e7dc4a..b9ee23346 100644 --- a/prog/tools/ShaderCompiler2/DebugLevel.h +++ b/prog/tools/ShaderCompiler2/DebugLevel.h @@ -1,7 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #pragma once -enum class DebugLevel +#include + +enum class DebugLevel : uint8_t { NONE, BASIC, diff --git a/prog/tools/ShaderCompiler2/assemblyShader.cpp b/prog/tools/ShaderCompiler2/assemblyShader.cpp index 912111fbe..36b6e8e77 100644 --- a/prog/tools/ShaderCompiler2/assemblyShader.cpp +++ b/prog/tools/ShaderCompiler2/assemblyShader.cpp @@ -15,10 +15,12 @@ #include "shaderTab.h" #include "shCompiler.h" #include "compileResult.h" +#include "globalConfig.h" #include "hash.h" #include "shHardwareOpt.h" #include "transcodeShader.h" #include "codeBlocks.h" +#include "defer.h" #include #include #include @@ -39,27 +41,7 @@ using namespace ShaderParser; // return maximum permitted FSH version extern d3d::shadermodel::Version getMaxFSHVersion(); -extern DebugLevel hlslDebugLevel; -extern bool hlslDumpCodeAlways, hlslDumpCodeOnError; -extern bool validateIdenticalBytecode; -extern bool hlslSkipValidation; -extern bool hlslNoDisassembly; -extern bool hlslShowWarnings; -extern bool hlslWarningsAsErrors; -extern bool isDebugModeEnabled; -extern bool enableBindless; -#if _CROSS_TARGET_SPIRV -extern bool compilerHlslCc; -extern bool compilerDXC; -#endif -extern bool autotest_mode; - -static bool is_hlsl_debug() { return hlslDebugLevel != DebugLevel::NONE; } - -#if _CROSS_TARGET_DX12 -#include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; -#endif +static bool is_hlsl_debug() { return shc::config().hlslDebugLevel != DebugLevel::NONE; } #if _TARGET_PC_WIN #include @@ -83,12 +65,6 @@ extern dx12::dxil::Platform targetPlatform; #include #endif -#ifdef _CROSS_TARGET_METAL -extern bool use_ios_token; -extern bool use_binary_msl; -extern bool use_metal_glslang; -#endif - struct CachedShader { enum @@ -1283,7 +1259,7 @@ void AssembleShaderEvalCB::handle_external_block_stat(state_block_stat &state_bl if ((type == VariableType::buf || type == VariableType::cbuf || type == VariableType::tex || type == VariableType::smp) && !hlsl) error(String(32, "named const <%s> has type of <%s> and so requires hlsl", var->text, nameSpace->text), nameSpace); - const bool isBindless = isBindlessType(type) && enableBindless; + const bool isBindless = isBindlessType(type) && shc::config().enableBindless; String varName(var->text); // This is a hacky way to support bindless textures in vertex shaders. // Anyway we store all bindless indices and constants for both stages in the same const buffer. @@ -1720,7 +1696,7 @@ void AssembleShaderEvalCB::handle_external_block_stat(state_block_stat &state_bl } } null_eval; - if (!cb.parseSourceCode("", def_hlsl, null_eval)) + if (!cb.parseSourceCode("", def_hlsl, null_eval, false)) { error(String(32, "bad HLSL decl for named const <%s>:\n%s", var->text, def_hlsl), var); return; @@ -2212,7 +2188,7 @@ void AssembleShaderEvalCB::eval_supports(supports_stat &s) if (s.name[i]->text == "__static_multidraw_cbuf"sv) { // Currently we support multidraw constbuffers only for bindless material version. - supportsStaticCbuf = enableBindless ? StaticCbuf::ARRAY : StaticCbuf::SINGLE; + supportsStaticCbuf = shc::config().enableBindless ? StaticCbuf::ARRAY : StaticCbuf::SINGLE; continue; } if (s.name[i]->text == "__draw_id"sv) @@ -2375,7 +2351,7 @@ bool AssembleShaderEvalCB::compareHWToken(int hw_token, const ShHardwareOptions case SHADER_TOKENS::SHTOK_metaliOS: #if _CROSS_TARGET_METAL - return use_ios_token; + return shc::config().useIosToken; #else return false; #endif @@ -2410,7 +2386,7 @@ bool AssembleShaderEvalCB::compareHWToken(int hw_token, const ShHardwareOptions case SHADER_TOKENS::SHTOK_xbox: #if _CROSS_TARGET_DX12 // on dx12 we have different profiles with the same compiler - return dx12::dxil::is_xbox_platform(targetPlatform); + return dx12::dxil::is_xbox_platform(shc::config().targetPlatform); #else return false; #endif @@ -2418,7 +2394,7 @@ bool AssembleShaderEvalCB::compareHWToken(int hw_token, const ShHardwareOptions case SHADER_TOKENS::SHTOK_scarlett: #if _CROSS_TARGET_DX12 // on dx12 we have different profiles with the same compiler - return dx12::dxil::Platform::XBOX_SCARLETT == targetPlatform; + return dx12::dxil::Platform::XBOX_SCARLETT == shc::config().targetPlatform; #else return false; #endif @@ -2426,12 +2402,12 @@ bool AssembleShaderEvalCB::compareHWToken(int hw_token, const ShHardwareOptions case SHADER_TOKENS::SHTOK_mesh: #if _CROSS_TARGET_DX12 // Not all DX12 targets support mesh shaders, this depends on the target platform - return dx12::dxil::platform_has_mesh_support(targetPlatform); + return dx12::dxil::platform_has_mesh_support(shc::config().targetPlatform); #else return false; #endif - case SHADER_TOKENS::SHTOK_bindless: return enableBindless; + case SHADER_TOKENS::SHTOK_bindless: return shc::config().enableBindless; default: G_ASSERT(0); } @@ -2443,7 +2419,8 @@ static String hwDefinesStr; void AssembleShaderEvalCB::buildHwDefines(const ShHardwareOptions &opt) { hwDefinesStr = ""; -#define ADD_HW_MACRO(TOKEN) \ +#define ADD_HW_MACRO(TOKEN) \ + if (compareHWToken(SHADER_TOKENS::SHTOK_##TOKEN, opt)) \ hwDefinesStr.aprintf(0, "#define _HARDWARE_%s %d\n", String(#TOKEN).toUpper(), compareHWToken(SHADER_TOKENS::SHTOK_##TOKEN, opt)) ADD_HW_MACRO(pc); ADD_HW_MACRO(dx11); @@ -3122,7 +3099,7 @@ void AssembleShaderEvalCB::eval_hlsl_compile(hlsl_compile_class &hlsl_compile) case 'm': #if _CROSS_TARGET_DX12 // Here is the only place where we check that compile for MS is actually a valid thing to do - if (dx12::dxil::platform_has_mesh_support(targetPlatform)) + if (dx12::dxil::platform_has_mesh_support(shc::config().targetPlatform)) #endif { hlslXS = &hlslMs; @@ -3132,7 +3109,7 @@ void AssembleShaderEvalCB::eval_hlsl_compile(hlsl_compile_class &hlsl_compile) case 'a': #if _CROSS_TARGET_DX12 // Here is the only place where we check that compile for AS is actually a valid thing to do - if (dx12::dxil::platform_has_mesh_support(targetPlatform)) + if (dx12::dxil::platform_has_mesh_support(shc::config().targetPlatform)) #endif { hlslXS = &hlslAs; @@ -3263,22 +3240,24 @@ class CompileShaderJob : public shc::Job curpass = ascb->curpass; parser = &ascb->parser.get_lex_parser(); shaderName = ascb->shname_token->text; - cgArgs = hlslNoDisassembly ? def_cg_args + 1 : def_cg_args; + cgArgs = shc::config().hlslNoDisassembly ? def_cg_args + 1 : def_cg_args; bool compile_ps = (profile[0] == 'p' || profile[0] == 'c'); - CodeSourceBlocks &code = *getSourceBlocks(profile); - source.printf(0, "#define _SHADER_STAGE_%cS 1\n", toupper(profile[0])); - source += AssembleShaderEvalCB::getBuiltHwDefines(); + String src_predefines; + src_predefines.printf(0, "#define _SHADER_STAGE_%cS 1\n", toupper(profile[0])); + src_predefines += AssembleShaderEvalCB::getBuiltHwDefines(); if (ascb->curpass->enableFp16) - source.printf(0, "#define _USE_HALFS 1\n"); + src_predefines += "#define _USE_HALFS 1\n"; + + CodeSourceBlocks &code = *getSourceBlocks(profile); dag::ConstSpan main_src = code.buildSourceCode(code_blocks); - source.append(main_src.data(), main_src.size()); - ascb->shConst.patchHlsl(source, compile_ps, profile[0] == 'c', ascb->varMerger, max_constants_no); + source.setStr(main_src.data(), main_src.size()); + ascb->shConst.patchHlsl(source, compile_ps, profile[0] == 'c', ascb->varMerger, max_constants_no, src_predefines); int base = append_items(source, 16); memset(&source[base], 0, 16); - if (hlslDumpCodeAlways || validateIdenticalBytecode) + if (shc::config().hlslDumpCodeAlways || shc::config().validateIdenticalBytecode) compileCtx = sh_get_compile_context(); shader_variant_hash = variant_hash; @@ -3286,14 +3265,7 @@ class CompileShaderJob : public shc::Job protected: virtual void doJobBody(); - virtual void releaseJobBody() - { - if (!compile_result.bytecode.empty()) - { - addResults(); - } - delete this; - } + virtual void releaseJobBody(); void addResults(); @@ -3438,30 +3410,120 @@ void AssembleShaderEvalCB::hlsl_compile(AssembleShaderEvalCB::HlslCompile &hlsl) hlsl.reset(); } -extern int hlslOptimizationLevel; -extern bool hlsl2021; -extern bool hlslEmbedSource; - #include "hashed_cache.h" #include #include +#include #include "sha1_cache_version.h" -bool useSha1Cache = true, writeSha1Cache = true; -extern char *sha1_cache_dir; -static inline void calc_sha1_stripped(HASH_CONTEXT &sha1, const char *src, size_t total_len) +static const char *find_line_comment(const char *s1, const char *s1_end) +{ + const char *p = (const char *)memchr(s1, '/', s1_end - s1); + while (p && p + 1 < s1_end) + { + if (p[1] == '/') + return p; + p = (const char *)memchr(p + 2, '/', s1_end - p - 2); + } + return nullptr; +} +static const char *get_next_line_trail_to_strip(const char *c_start, bool hold_file_line) +{ + const char *next_line = strstr(c_start, "\n#line "); + const char *next_line2 = next_line ? find_line_comment(c_start, next_line) : strstr(c_start, "//"); + if (next_line2 && (!next_line || next_line2 < next_line)) + { + while (next_line2 > c_start && (*(next_line2 - 1) == ' ' || *(next_line2 - 1) == '\t')) + next_line2--; + if (next_line2 > c_start && *(next_line2 - 1) == '\n') + next_line2--; + return next_line2; + } + if (hold_file_line && next_line && strncmp(next_line, "\n#line 1 \"precompiled\"", 22) != 0) + next_line = strchr(next_line + 7, ' '); + return next_line; +} +static inline void calc_sha1_stripped(HASH_CONTEXT &sha1, const char *src, size_t total_len, bool hold_file_line, + String *out_stripped = nullptr) { const char *c_start = src, *next_line = src; - while (c_start && (next_line = strstr(c_start, "\n#line "))) + if (out_stripped) + out_stripped->clear(); + while (c_start && (next_line = get_next_line_trail_to_strip(c_start, hold_file_line))) { HASH_UPDATE(&sha1, (const unsigned char *)c_start, (uint32_t)(next_line - c_start)); + if (out_stripped) + out_stripped->append(c_start, (uint32_t)(next_line - c_start)); c_start = strstr(next_line + 1, "\n"); }; size_t at = (c_start - src); if (c_start != nullptr && at < total_len) { HASH_UPDATE(&sha1, (const unsigned char *)c_start, (uint32_t)(size_t(total_len) - at)); + if (out_stripped) + out_stripped->append(c_start, (uint32_t)(size_t(total_len) - at)); + } +} +static String make_dump_filepath(const char *shaderName, uint64_t shader_variant_hash, const char *shader_sha1) +{ + String filepath; + if (const char *log_fn = get_log_filename()) + { + if (const char *ext = dd_get_fname_ext(log_fn)) + filepath.printf(0, "%.*s/", ext - log_fn, log_fn); + else if (const char *p = dd_get_fname(log_fn)) + filepath.printf(0, "%.*s./dumps/", p - log_fn, log_fn); + } + filepath.aprintf(0, "%s_%08x_%s", shaderName, shader_variant_hash, shader_sha1); + return filepath; +} +static void dump_hlsl_src(const char *compileCtx, const char *source, const eastl::vector &bytecode, // + const char *sha1SrcPath, bool reused, const char *shaderName, uint64_t shader_variant_hash) +{ + HASH_CONTEXT sha1; + unsigned char shader_sha1[HASH_SIZE]; + String shader_sha1_s, status; + HASH_INIT(&sha1); + HASH_UPDATE(&sha1, (const unsigned char *)bytecode.data(), bytecode.size()); + HASH_FINISH(&sha1, shader_sha1); + data_to_str_hex(shader_sha1_s, shader_sha1, sizeof(shader_sha1)); + if (bytecode.empty()) + status = "failed to compile"; + else if (reused) + status.printf(0, "reused built %s from (%s)", shader_sha1_s, sha1SrcPath); + else if (sha1SrcPath && *sha1SrcPath) + status.printf(0, "built %s and stored as (%s)", shader_sha1_s, sha1SrcPath); + else + status.printf(0, "built %s", shader_sha1_s); + + if (shc::config().hlslDumpCodeSeparate) + { + String fn = make_dump_filepath(shaderName, shader_variant_hash, shader_sha1_s); + dd_mkpath(fn); + FullFileSaveCB cwr(fn); + if (cwr.fileHandle) + { + const char *prolog_str = "=== compiling code:\n"; + const char *epilog_str = "\n==> "; + cwr.write(prolog_str, strlen(prolog_str)); + cwr.write(compileCtx, strlen(compileCtx)); + cwr.write("\n", 1); + cwr.write(source, strlen(source)); + cwr.write(epilog_str, strlen(epilog_str)); + cwr.write(status, strlen(status)); + cwr.write("\n", 1); + // String src_stripped; + // calc_sha1_stripped(sha1, source, strlen(source), false, &src_stripped); + // cwr.write(src_stripped, strlen(src_stripped)); + debug("=== written dump to:%s", fn); + } + else + logwarn("=== cannot write dump to:%s", fn); + if (!bytecode.empty()) // when successfl build we don't need to duplicate dump to log + return; } + + debug("=== compiling code:\n%s\n%s\n%s", compileCtx, source, status); } void CompileShaderJob::doJobBody() @@ -3485,37 +3547,52 @@ void CompileShaderJob::doJobBody() } #endif + bool shaderDebugModeEnabled = shc::config().isDebugModeEnabled; + if (!shaderDebugModeEnabled) + { + float value = 0.0f; + if (shc::getAssumedValue("debug_mode_enabled", shaderName, true, value)) + shaderDebugModeEnabled = (value > 0.0f); + } + const unsigned sourceLen = i_strlen(source); - if (useSha1Cache) + if (shc::config().useSha1Cache) { + const bool enableBindlessVar = shc::config().enableBindless; + const bool isDebugModeEnabledVar = shaderDebugModeEnabled; + const bool isAutotestModeVar = shc::config().autotestMode; + const int hlslOptimizationLevelVar = shc::config().hlslOptimizationLevel; + const bool hlsl2021Var = shc::config().hlsl2021; + HASH_CONTEXT sha1; HASH_INIT(&sha1); HASH_UPDATE(&sha1, (const unsigned char *)&sha1_cache_version, sizeof(sha1_cache_version)); // HASH_UPDATE( &sha1, (const unsigned char*)source.c_str(), (uint32_t)sourceLen ); - calc_sha1_stripped(sha1, source.c_str(), (uint32_t)sourceLen); + calc_sha1_stripped(sha1, source.c_str(), (uint32_t)sourceLen, isDebugModeEnabledVar); HASH_UPDATE(&sha1, (const unsigned char *)profile.c_str(), (uint32_t)strlen(profile)); HASH_UPDATE(&sha1, (const unsigned char *)entry.c_str(), (uint32_t)strlen(entry)); - HASH_UPDATE(&sha1, (const unsigned char *)&hlslOptimizationLevel, (uint32_t)sizeof(hlslOptimizationLevel)); // optimization level - // is part of output - // dir, but still - HASH_UPDATE(&sha1, (const unsigned char *)&hlsl2021, (uint32_t)sizeof(hlsl2021)); + // optimization level is a part of output dir, but still + HASH_UPDATE(&sha1, (const unsigned char *)&hlslOptimizationLevelVar, (uint32_t)sizeof(hlslOptimizationLevelVar)); + HASH_UPDATE(&sha1, (const unsigned char *)&hlsl2021Var, (uint32_t)sizeof(hlsl2021Var)); HASH_UPDATE(&sha1, (const unsigned char *)&enableFp16, (uint32_t)sizeof(enableFp16)); - HASH_UPDATE(&sha1, (const unsigned char *)&enableBindless, (uint32_t)sizeof(enableBindless)); + HASH_UPDATE(&sha1, (const unsigned char *)&enableBindlessVar, (uint32_t)sizeof(enableBindlessVar)); #if _CROSS_TARGET_SPIRV - auto mode = compilerDXC ? CompilerMode::DXC : compilerHlslCc ? CompilerMode::HLSLCC : CompilerMode::DEFAULT; + auto mode = + shc::config().compilerDXC ? CompilerMode::DXC : (shc::config().compilerHlslCc ? CompilerMode::HLSLCC : CompilerMode::DEFAULT); HASH_UPDATE(&sha1, (const unsigned char *)&mode, (uint32_t)sizeof(mode)); #elif _CROSS_TARGET_DX12 - HASH_UPDATE(&sha1, (const unsigned char *)&targetPlatform, (uint32_t)sizeof(targetPlatform)); + const auto platform = shc::config().targetPlatform; + HASH_UPDATE(&sha1, (const unsigned char *)&platform, (uint32_t)sizeof(platform)); HASH_UPDATE(&sha1, (const unsigned char *)&useScarlettWave32, (uint32_t)sizeof(useScarlettWave32)); #endif - if (isDebugModeEnabled) - HASH_UPDATE(&sha1, (const unsigned char *)&isDebugModeEnabled, (uint32_t)sizeof(isDebugModeEnabled)); - if (autotest_mode) - HASH_UPDATE(&sha1, (const unsigned char *)&autotest_mode, (uint32_t)sizeof(autotest_mode)); + if (isDebugModeEnabledVar) + HASH_UPDATE(&sha1, (const unsigned char *)&isDebugModeEnabledVar, (uint32_t)sizeof(isDebugModeEnabledVar)); + if (isAutotestModeVar) + HASH_UPDATE(&sha1, (const unsigned char *)&isAutotestModeVar, (uint32_t)sizeof(isAutotestModeVar)); HASH_FINISH(&sha1, srcSha1); - SNPRINTF(sha1SrcPath, sizeof(sha1SrcPath), "%s/src/%s/" HASH_LIST_STRING, sha1_cache_dir, + SNPRINTF(sha1SrcPath, sizeof(sha1SrcPath), "%s/src/%s/" HASH_LIST_STRING, shc::config().sha1CacheDir, profile.c_str(), // sources and binaries lives in different subfolders. that is to reduce risk of collision, while probably not // needed HASH_LIST(srcSha1)); @@ -3528,12 +3605,12 @@ void CompileShaderJob::doJobBody() if (char *binSha1Read = df_gets((char *)buf, sizeof(buf), sha1LinkFile)) { // sources and binaries lives in different subfolders. that is to reduce risk of collision, while probably not needed - SNPRINTF(sha1BinPath, sizeof(sha1BinPath), "%s/bin/%s/%s", sha1_cache_dir, profile.c_str(), binSha1Read); + SNPRINTF(sha1BinPath, sizeof(sha1BinPath), "%s/bin/%s/%s", shc::config().sha1CacheDir, profile.c_str(), binSha1Read); df_close(sha1LinkFile); file_ptr_t sha1BinFile = df_open(sha1BinPath, DF_READ); if (!sha1BinFile) { - sh_debug(SHLOG_NORMAL, "Sha1 link %s in %s is invalid.", sha1BinPath, sha1SrcPath); + debug("Sha1 link %s in %s is invalid.", sha1BinPath, sha1SrcPath); } else { @@ -3541,7 +3618,7 @@ void CompileShaderJob::doJobBody() const void *content = df_mmap(sha1BinFile, &sha1FileLen); if (!sha1FileLen) { - sh_debug(SHLOG_NORMAL, "link is broken?"); + debug("link is broken?"); df_close(sha1BinFile); } else @@ -3551,8 +3628,8 @@ void CompileShaderJob::doJobBody() memcpy(&compile_result.computeShaderInfo, end_bytecode, sizeof(ComputeShaderInfo)); df_unmap(content, sha1FileLen); df_close(sha1BinFile); - if (hlslDumpCodeAlways) - debug("=== compiling code:\n%s\nreused built from %s", compileCtx, sha1SrcPath); + if (shc::config().hlslDumpCodeAlways) + dump_hlsl_src(compileCtx, source, compile_result.bytecode, sha1SrcPath, true, shaderName, shader_variant_hash); ShaderCompilerStat::hlslExternalCacheHitCount++; return; } @@ -3560,17 +3637,18 @@ void CompileShaderJob::doJobBody() } else { - sh_debug(SHLOG_NORMAL, "Sha1 link in %s is missing.", sha1SrcPath); + debug("Sha1 link in %s is missing.", sha1SrcPath); df_close(sha1LinkFile); } } } - auto localHlslOptimizationLevel = (hlslDebugLevel == DebugLevel::FULL_DEBUG_INFO) ? 0 : hlslOptimizationLevel; + auto localHlslOptimizationLevel = + (shc::config().hlslDebugLevel == DebugLevel::FULL_DEBUG_INFO) ? 0 : shc::config().hlslOptimizationLevel; bool full_debug = false, forceDisableWarnings = false; - bool embed_source = hlslEmbedSource; + bool embed_source = shc::config().hlslEmbedSource; bool useWave32 = useScarlettWave32; - bool useHlsl2021 = hlsl2021; + bool useHlsl2021 = shc::config().hlsl2021; for (const char *pragma = strstr(source, "#pragma "); pragma; pragma = strstr(pragma, "#pragma ")) { void *original = (void *)pragma; @@ -3596,7 +3674,7 @@ void CompileShaderJob::doJobBody() else if (PRAGMA("force_min_opt_level ")) { pragma += strlen("force_min_opt_level "); - localHlslOptimizationLevel = max(atoi(pragma), hlslOptimizationLevel); + localHlslOptimizationLevel = max(atoi(pragma), shc::config().hlslOptimizationLevel); } else if (PRAGMA("wave")) { @@ -3613,46 +3691,45 @@ void CompileShaderJob::doJobBody() // replace #pragma with comment memcpy(original, "// ", 7); } - // todo: add flags + // Compile. #if _CROSS_TARGET_C1 - - #elif _CROSS_TARGET_C2 - #elif _CROSS_TARGET_METAL - if (use_metal_glslang) - compile_result = compileShaderMetalGlslang(source, profile, entry, !hlslNoDisassembly, enableFp16, hlslSkipValidation, - localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, use_ios_token, use_binary_msl, shader_variant_hash); + if (shc::config().useMetalGlslang) + compile_result = compileShaderMetalGlslang(source, profile, entry, !shc::config().hlslNoDisassembly, shc::config().enableFp16, + shc::config().hlslSkipValidation, localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, + shc::config().useIosToken, shc::config().useBinaryMsl, shader_variant_hash); else - compile_result = compileShaderMetal(source, profile, entry, !hlslNoDisassembly, enableFp16, hlslSkipValidation, - localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, use_ios_token, use_binary_msl, shader_variant_hash); + compile_result = compileShaderMetal(source, profile, entry, !shc::config().hlslNoDisassembly, shc::config().enableFp16, + shc::config().hlslSkipValidation, localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, + shc::config().useIosToken, shc::config().useBinaryMsl, shader_variant_hash); #elif _CROSS_TARGET_SPIRV - compile_result = compileShaderSpirV(source, profile, entry, !hlslNoDisassembly, enableFp16, hlslSkipValidation, - localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, - compilerDXC ? CompilerMode::DXC - : compilerHlslCc ? CompilerMode::HLSLCC - : CompilerMode::DEFAULT, - shader_variant_hash); + compile_result = compileShaderSpirV(source, profile, entry, !shc::config().hlslNoDisassembly, shc::config().enableFp16, + shc::config().hlslSkipValidation, localHlslOptimizationLevel ? true : false, max_constants_no, shaderName, + shc::config().compilerDXC ? CompilerMode::DXC + : shc::config().compilerHlslCc ? CompilerMode::HLSLCC + : CompilerMode::DEFAULT, + shader_variant_hash, shc::config().enableBindless, shc::config().hlslDebugLevel != DebugLevel::NONE); #elif _CROSS_TARGET_EMPTY compile_result.bytecode.resize(sizeof(uint64_t)); #elif _CROSS_TARGET_DX12 - extern wchar_t *dx12_pdb_cache_dir; // NOTE: when we support this kind of switch somehow this can be replaced with actual information // of use or not compile_result = dx12::dxil::compileShader(make_span_const(source).first(sourceLen), // source length includes trailing zeros - profile, entry, !hlslNoDisassembly, useHlsl2021, enableFp16, hlslSkipValidation, localHlslOptimizationLevel ? true : false, - is_hlsl_debug(), dx12_pdb_cache_dir, max_constants_no, shaderName, targetPlatform, useWave32, - !forceDisableWarnings && hlslWarningsAsErrors, full_debug ? DebugLevel::FULL_DEBUG_INFO : hlslDebugLevel, embed_source); + profile, entry, !shc::config().hlslNoDisassembly, useHlsl2021, enableFp16, shc::config().hlslSkipValidation, + localHlslOptimizationLevel ? true : false, is_hlsl_debug(), shc::config().dx12PdbCacheDir, max_constants_no, shaderName, + shc::config().targetPlatform, useWave32, !forceDisableWarnings && shc::config().hlslWarningsAsErrors, + full_debug ? DebugLevel::FULL_DEBUG_INFO : shc::config().hlslDebugLevel, embed_source); #else //_CROSS_TARGET_DX11 unsigned int flags = is_hlsl_debug() ? D3DCOMPILE_DEBUG : 0; - flags |= hlslSkipValidation ? D3DCOMPILE_SKIP_VALIDATION : 0; + flags |= shc::config().hlslSkipValidation ? D3DCOMPILE_SKIP_VALIDATION : 0; flags |= is_hlsl_debug() ? D3DCOMPILE_SKIP_OPTIMIZATION : (localHlslOptimizationLevel >= 3 @@ -3660,87 +3737,22 @@ void CompileShaderJob::doJobBody() : (localHlslOptimizationLevel >= 2 ? D3DCOMPILE_OPTIMIZATION_LEVEL2 : (localHlslOptimizationLevel >= 1 ? D3DCOMPILE_OPTIMIZATION_LEVEL0 : D3DCOMPILE_SKIP_OPTIMIZATION))); - flags |= hlslWarningsAsErrors ? D3DCOMPILE_WARNINGS_ARE_ERRORS : 0; - compile_result = compileShaderDX11(shaderName, source, NULL, profile, entry, !hlslNoDisassembly, - full_debug ? DebugLevel::FULL_DEBUG_INFO : hlslDebugLevel, hlslSkipValidation, embed_source, flags, max_constants_no); + flags |= shc::config().hlslWarningsAsErrors ? D3DCOMPILE_WARNINGS_ARE_ERRORS : 0; + compile_result = compileShaderDX11(shaderName, source, NULL, profile, entry, !shc::config().hlslNoDisassembly, + full_debug ? DebugLevel::FULL_DEBUG_INFO : shc::config().hlslDebugLevel, shc::config().hlslSkipValidation, embed_source, flags, + max_constants_no); #endif - if (hlslDumpCodeAlways) - debug("=== compiling code:\n%s\n%s==== code end", compileCtx, source); + if (shc::config().hlslDumpCodeAlways) + dump_hlsl_src(compileCtx, source, compile_result.bytecode, sha1SrcPath, false, shaderName, shader_variant_hash); if (compile_result.bytecode.empty()) { - sh_enter_atomic_debug(); - // Display error message. - parser->set_error(hlsl_compile_token->file_start, hlsl_compile_token->line_start, hlsl_compile_token->col_start, - String(256, "compile(%s, %s) failed:", profile.str(), entry.str())); - - if (!compile_result.errors.empty()) - { - // debug("errors compiling HLSL code:\n%s", source.str()); - const char *es = (const char *)compile_result.errors.c_str(), *ep = strchr(es, '\n'); - while (es) - if (ep) - { - auto profile_to_assert_stage = [](const SimpleString &profile) { - if (strstr(profile, "vs")) - return "ps"; - return profile.c_str(); - }; - sh_debug(SHLOG_NORMAL, " %.*s", ep - es, es); - size_t link_error = eastl::string_view(es, ep - es).find("External function used in non-library profile"); - if (link_error != eastl::string::npos && eastl::string_view(es, ep - es).find("_assert", link_error) != eastl::string::npos) - { - sh_debug(SHLOG_NORMAL, - "\nNote: the shader uses assert, but it was not enabled.\n" - "Tip: add a macro `ENABLE_ASSERT(%.*s)` to the shader", - 2, profile_to_assert_stage(profile)); - if (strstr(profile, "vs")) - sh_debug(SHLOG_NORMAL, - "Tip 2: ENABLE_ASSERT(vs) is not allowed. Rather, ENABLE_ASSERT(ps) enables asserts for both ps and vs"); - } - es = ep + 1; - ep = strchr(es, '\n'); - } - else - break; - sh_debug(SHLOG_NORMAL, " %s\n", es); - } - else - sh_debug(SHLOG_NORMAL, " D3DXCompileShader error"); - - if (!hlslDumpCodeAlways && hlslDumpCodeOnError) - debug("=== compiling code:\n%s==== code end", source.str()); - - sh_leave_atomic_debug(); -#if _TARGET_PC_WIN - Sleep(150); -#else - usleep(150 * 1000); -#endif + debug("Hlsl compilation failed, exiting job..."); return; } - if (!compile_result.errors.empty() && hlslShowWarnings) - { - parser->set_warning(hlsl_compile_token->file_start, hlsl_compile_token->line_start, hlsl_compile_token->col_start, - String(256, "compile(%s, %s) finished with warnings:", profile.str(), entry.str())); - - const char *es = (const char *)compile_result.errors.c_str(), *ep = strchr(es, '\n'); - while (es) - if (ep) - { - sh_debug(SHLOG_NORMAL, " %.*s", ep - es, es); - es = ep + 1; - ep = strchr(es, '\n'); - } - else - { - sh_debug(SHLOG_NORMAL, " %s", es); - break; - } - } - if (writeSha1Cache && useSha1Cache && !compile_result.bytecode.empty() && dd_mkpath(sha1SrcPath)) + if (shc::config().writeSha1Cache && shc::config().useSha1Cache && !compile_result.bytecode.empty() && dd_mkpath(sha1SrcPath)) { unsigned char binSha1[HASH_SIZE]; HASH_CONTEXT sha1; @@ -3750,7 +3762,7 @@ void CompileShaderJob::doJobBody() HASH_FINISH(&sha1, binSha1); char sha1BinPath[420]; sha1BinPath[0] = 0; - SNPRINTF(sha1BinPath, sizeof(sha1BinPath), "%s/bin/%s/" HASH_LIST_STRING, sha1_cache_dir, + SNPRINTF(sha1BinPath, sizeof(sha1BinPath), "%s/bin/%s/" HASH_LIST_STRING, shc::config().sha1CacheDir, profile.c_str(), // sources and binaries lives in different subfolders. that is to reduce risk of collision, while probably not // needed HASH_LIST(binSha1)); @@ -3767,7 +3779,7 @@ void CompileShaderJob::doJobBody() SNPRINTF(tmpFileName, sizeof(tmpFileName), "%s/" "%s_bin_" HASH_TEMP_STRING "XXXXXX", - sha1_cache_dir, profile.c_str(), HASH_LIST(binSha1)); + shc::config().sha1CacheDir, profile.c_str(), HASH_LIST(binSha1)); file_ptr_t tmpF = df_mkstemp(tmpFileName); int written = df_write(tmpF, compile_result.bytecode.data(), compile_result.bytecode.size()); written += df_write(tmpF, &compile_result.computeShaderInfo, sizeof(ComputeShaderInfo)); @@ -3790,7 +3802,7 @@ void CompileShaderJob::doJobBody() SNPRINTF(tmpFileName, sizeof(tmpFileName), "%s/" "%s_src_" HASH_TEMP_STRING "XXXXXX", - sha1_cache_dir, profile.c_str(), HASH_LIST(srcSha1)); + shc::config().sha1CacheDir, profile.c_str(), HASH_LIST(srcSha1)); file_ptr_t tmpF = df_mkstemp(tmpFileName); if (tmpF) { @@ -3813,6 +3825,79 @@ void CompileShaderJob::doJobBody() } } +void CompileShaderJob::releaseJobBody() +{ + DEFER(delete this); + + if (compile_result.bytecode.empty()) + { + // Display error message. + parser->set_error(hlsl_compile_token->file_start, hlsl_compile_token->line_start, hlsl_compile_token->col_start, + String(256, "compile(%s, %s) failed:", profile.str(), entry.str())); + + if (!compile_result.errors.empty()) + { + // debug("errors compiling HLSL code:\n%s", source.str()); + const char *es = (const char *)compile_result.errors.c_str(), *ep = strchr(es, '\n'); + while (es) + if (ep) + { + auto profile_to_assert_stage = [](const SimpleString &profile) { + if (strstr(profile, "vs")) + return "ps"; + return profile.c_str(); + }; + sh_debug(SHLOG_NORMAL, " %.*s", ep - es, es); + size_t link_error = eastl::string_view(es, ep - es).find("External function used in non-library profile"); + if (link_error != eastl::string::npos && eastl::string_view(es, ep - es).find("_assert", link_error) != eastl::string::npos) + { + sh_debug(SHLOG_NORMAL, + "\nNote: the shader uses assert, but it was not enabled.\n" + "Tip: add a macro `ENABLE_ASSERT(%.*s)` to the shader", + 2, profile_to_assert_stage(profile)); + if (strstr(profile, "vs")) + sh_debug(SHLOG_NORMAL, + "Tip 2: ENABLE_ASSERT(vs) is not allowed. Rather, ENABLE_ASSERT(ps) enables asserts for both ps and vs"); + } + es = ep + 1; + ep = strchr(es, '\n'); + } + else + break; + sh_debug(SHLOG_NORMAL, " %s\n", es); + } + else + sh_debug(SHLOG_NORMAL, " D3DXCompileShader error"); + + if (!shc::config().hlslDumpCodeAlways && shc::config().hlslDumpCodeOnError) + debug("=== compiling code:\n%s==== code end", source.str()); + + return; + } + + if (!compile_result.errors.empty() && shc::config().hlslShowWarnings) + { + parser->set_warning(hlsl_compile_token->file_start, hlsl_compile_token->line_start, hlsl_compile_token->col_start, + String(256, "compile(%s, %s) finished with warnings:", profile.str(), entry.str())); + + const char *es = (const char *)compile_result.errors.c_str(), *ep = strchr(es, '\n'); + while (es) + if (ep) + { + sh_debug(SHLOG_NORMAL, " %.*s", ep - es, es); + es = ep + 1; + ep = strchr(es, '\n'); + } + else + { + sh_debug(SHLOG_NORMAL, " %s", es); + break; + } + } + + addResults(); +} + void CompileShaderJob::addResults() { int c1, c2, c3; @@ -3824,7 +3909,7 @@ void CompileShaderJob::addResults() if (!added_new) { ShaderCompilerStat::hlslEqResultCount++; - if (validateIdenticalBytecode) + if (shc::config().validateIdenticalBytecode) { auto &cache = resolve_cached_shader(c1, c2, c3); sh_debug(SHLOG_INFO, "Equal shaders for profile %s were found:\n\nThe first one:\n%s\nThe second one:\n%s\n", profile, @@ -3835,7 +3920,7 @@ void CompileShaderJob::addResults() apply_from_cache(profile[0], c1, c2, c3, *curpass); // Disassembly for debug. - if (!hlslNoDisassembly && !compile_result.bytecode.empty()) + if (!shc::config().hlslNoDisassembly && !compile_result.bytecode.empty()) { debug("HLSL: profile='%s', entry='%s'", profile, entry); if (!compile_result.disassembly.empty()) @@ -4026,7 +4111,7 @@ static bool post_shader_to_cache(int c1, int c2, int c3, const CompileResult &re cachedShader.relCode.resize(size_in_unsigned + 1); cachedShader.codeType = codeType; - if (validateIdenticalBytecode) + if (shc::config().validateIdenticalBytecode) cachedShader.compileCtx = compile_ctx; switch (codeType) { diff --git a/prog/tools/ShaderCompiler2/assemblyShader.h b/prog/tools/ShaderCompiler2/assemblyShader.h index c7e14ed34..1225824ef 100644 --- a/prog/tools/ShaderCompiler2/assemblyShader.h +++ b/prog/tools/ShaderCompiler2/assemblyShader.h @@ -9,6 +9,7 @@ #include "shsyn.h" #include "shcode.h" #include "shSemCode.h" +#include "globalConfig.h" #include "shExprParser.h" #include "namedConst.h" #include "nameMap.h" @@ -321,10 +322,9 @@ static inline CodeSourceBlocks *getSourceBlocks(const char *profile) extern SCFastNameMap renderStageToIdxMap; -inline bool disallow_hlsl_hardcoded_regs = false; inline bool validate_hardcoded_regs_in_hlsl_block(const SHTOK_hlsl_text *hlsl) { - if (!disallow_hlsl_hardcoded_regs) + if (!shc::config().disallowHlslHardcodedRegs) return true; if (!hlsl || !hlsl->text) @@ -332,18 +332,24 @@ inline bool validate_hardcoded_regs_in_hlsl_block(const SHTOK_hlsl_text *hlsl) constexpr char regToken[] = "register"; constexpr size_t tokLen = sizeof(regToken) - 1; - for (const char *p = hlsl->text; p; p = strstr(p, regToken)) + for (const char *p = strstr(hlsl->text, regToken); p; p = strstr(p, regToken)) { const bool isStartOfToken = (p == hlsl->text) || !fast_isalnum_or_(p[-1]); // neg index is ok because p != text beginning const bool isSeparateToken = isStartOfToken && !fast_isalnum_or_(p[tokLen]); if (isSeparateToken) { - sh_debug(SHLOG_FATAL, "Old-style raw hardcoded registers are disallowed, please use the stcode version"); + const char *begin = p, *end = p + tokLen; + while (begin != hlsl->text && begin[-1] != '\n') + --begin; + while (*end && *end != '\n') + ++end; + const String targetLine{begin, static_cast(end - begin)}; + sh_debug(SHLOG_FATAL, "Old-style raw hardcoded registers are disallowed, please use the stcode version:\n%s", + targetLine.c_str()); return false; } p += tokLen; - continue; } return true; diff --git a/prog/tools/ShaderCompiler2/codeBlocks.cpp b/prog/tools/ShaderCompiler2/codeBlocks.cpp index ea0b29d8d..17b4ae069 100644 --- a/prog/tools/ShaderCompiler2/codeBlocks.cpp +++ b/prog/tools/ShaderCompiler2/codeBlocks.cpp @@ -2,6 +2,8 @@ #include "codeBlocks.h" #include "condParser.h" +#include "shCompiler.h" +#include "globalConfig.h" #include "shsem.h" #include "shLog.h" #include "shCompiler.h" @@ -27,7 +29,6 @@ #define __iscsym(_c) fast_isalnum_or_(_c) #endif -extern SCFastNameMap glob_string_table; SCFastNameMap CodeSourceBlocks::incFiles; typedef CodeSourceBlocks::Unconditional ublock_t; @@ -244,10 +245,7 @@ static void dump_code(dag::ConstSpan prg, int indent codeBlocks.getName(prg[i].uncond.codeId), indent, ""); } -extern bool hlslSavePPAsComments; -extern bool optionalIntervalsAsBranches; - -bool CodeSourceBlocks::parseSourceCode(const char *stage, const char *src, ShaderParser::ShaderBoolEvalCB &cb) +bool CodeSourceBlocks::parseSourceCode(const char *stage, const char *src, ShaderParser::ShaderBoolEvalCB &cb, bool pp_as_comments) { tmpSrc = src; removeComments(tmpSrc); @@ -306,23 +304,8 @@ bool CodeSourceBlocks::parseSourceCode(const char *stage, const char *src, Shade } tmpFileName.printf(260, "%.*s", t2 - t - 1, t + 1); - -#if _TARGET_PC_MACOSX | _TARGET_PC_LINUX - char fullName[4096]; - if (!realpath(tmpFileName, fullName)) - strcpy(fullName, tmpFileName); -#else - char fullName[260]; - GetFullPathName(tmpFileName, 260, fullName, NULL); - dd_simplify_fname_c(fullName); -#endif -#if _CROSS_TARGET_C1 | _CROSS_TARGET_C2 - - - -#endif - - fname_id = fileNames.addNameId(fullName); + dd_simplify_fname_c(tmpFileName); + fname_id = fileNames.addNameId(tmpFileName); } else while (t2 < p) @@ -405,7 +388,7 @@ bool CodeSourceBlocks::parseSourceCode(const char *stage, const char *src, Shade if (ppCheckDirective(dtext, ctx)) { // directive approved as part of preprocessor - if (hlslSavePPAsComments) + if (pp_as_comments) { while (line_start[0] == '\n') line_start++; @@ -762,7 +745,7 @@ bool CodeSourceBlocks::ppDirective(char *s, int len, char *dtext, int fnameId, i Tab &prg = ctx.topProg(); G_ASSERT(prg.size() > 0); - if (optionalIntervalsAsBranches && pp_is_optional(prg.back(), ctx.evalCb)) + if (shc::config().optionalIntervalsAsBranches && pp_is_optional(prg.back(), ctx.evalCb)) { eval_optional_to_branching(prg); return true; @@ -889,20 +872,22 @@ bool CodeSourceBlocks::ppDoInclude(const char *incl_fn, Tab &out_text, con FullFileLoadCB crd(fn); if (!crd.fileHandle) - crd.open(incl_fn, DF_READ); + crd.open(fn = incl_fn, DF_READ); if (!crd.fileHandle) - if (const char *f = shc::getSrcRootFolder()) - crd.open(String(0, "%s/%s", f, incl_fn, DF_READ), DF_READ); + if (const char *f = shc::config().getShaderSrcRoot()) + crd.open(fn = String(0, "%s/%s", f, incl_fn, DF_READ), DF_READ); if (!crd.fileHandle) - crd.open(shc::search_include_with_pathes(incl_fn), DF_READ); + crd.open(fn = shc::search_include_with_pathes(incl_fn), DF_READ); if (!crd.fileHandle) return false; - String s(0, - "\n#undef _FILE_\n" - "#define _FILE_ %d\n" - "#line 1 \"%s\"\n", - ctx.evalCb.add_message(incl_fn, true), incl_fn); + String s; + if (ctx.evalCb.is_debug_mode_enabled()) + { + s.printf(0, "\n#undef _FILE_\n#define _FILE_ %d", ctx.evalCb.add_message(fn, true)); + append_items(out_text, s.size() - 1, s.data()); + } + s.printf(0, "\n#line 1 \"%s\"\n", fn); append_items(out_text, s.size() - 1, s.data()); Tab fcont; @@ -932,11 +917,12 @@ bool CodeSourceBlocks::ppDoInclude(const char *incl_fn, Tab &out_text, con } append_items(out_text, fcont.data() + fcont.size() - 1 - ssp, ssp); - s.printf(0, - "\n#undef _FILE_\n" - "#define _FILE_ %d\n" - "#line %d \"%s\"\n", - ctx.evalCb.add_message(src_fn, true), src_ln, src_fn); + if (ctx.evalCb.is_debug_mode_enabled()) + { + s.printf(0, "\n#undef _FILE_\n#define _FILE_ %d", ctx.evalCb.add_message(src_fn, true)); + append_items(out_text, s.size() - 1, s.data()); + } + s.printf(0, "\n#line %d \"%s\"\n", src_ln, src_fn); append_items(out_text, s.size() - 1, s.data()); G_ASSERT(is_main_thread()); diff --git a/prog/tools/ShaderCompiler2/codeBlocks.h b/prog/tools/ShaderCompiler2/codeBlocks.h index c6b01ee74..e6a319dac 100644 --- a/prog/tools/ShaderCompiler2/codeBlocks.h +++ b/prog/tools/ShaderCompiler2/codeBlocks.h @@ -93,7 +93,7 @@ class CodeSourceBlocks } //! parse source text into code fragments - bool parseSourceCode(const char *stage, const char *src, ShaderParser::ShaderBoolEvalCB &cb); + bool parseSourceCode(const char *stage, const char *src, ShaderParser::ShaderBoolEvalCB &cb, bool pp_as_comments); //! returns code unique identifier for specific variant [returns reference to highly temporary storage] dag::ConstSpan getPreprocessedCode(ShaderParser::ShaderBoolEvalCB &cb); diff --git a/prog/tools/ShaderCompiler2/cppStcode.cpp b/prog/tools/ShaderCompiler2/cppStcode.cpp index d3ebf4d17..1b5555f8d 100644 --- a/prog/tools/ShaderCompiler2/cppStcode.cpp +++ b/prog/tools/ShaderCompiler2/cppStcode.cpp @@ -18,28 +18,12 @@ #include #endif -enum class StcodeTargetArch -{ - DEFAULT, - X86, - X86_64, - ARM64 -}; - -#if _CROSS_TARGET_DX12 -#include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; -#endif - -bool compile_cpp_stcode = false; -bool cpp_stcode_unity_build = false; -StcodeTargetArch cpp_stcode_arch = StcodeTargetArch::DEFAULT; StcodeShader g_cppstcode; static eastl::string stcode_dir; static eastl::string src_dir; -bool set_stcode_arch_from_arg(const char *str) +bool set_stcode_arch_from_arg(const char *str, shc::CompilerConfig &config_rw) { StcodeTargetArch res; if (strcmp(str, "x86") == 0) @@ -52,20 +36,20 @@ bool set_stcode_arch_from_arg(const char *str) return false; #if _CROSS_TARGET_DX12 - if (targetPlatform != dx12::dxil::Platform::PC && res != StcodeTargetArch::X86_64) + if (shc::config().targetPlatform != dx12::dxil::Platform::PC && res != StcodeTargetArch::X86_64) return false; #elif _CROSS_TARGET_C1 | _CROSS_TARGET_C2 #endif - cpp_stcode_arch = res; + config_rw.cppStcodeArch = res; return true; } static bool current_arch_is_valid(StcodeTargetArch desired) { - return cpp_stcode_arch == StcodeTargetArch::DEFAULT || cpp_stcode_arch == desired; + return shc::config().cppStcodeArch == StcodeTargetArch::DEFAULT || shc::config().cppStcodeArch == desired; } static const char *arch_name(StcodeTargetArch arch) @@ -170,7 +154,7 @@ void save_stcode_dll_main(StcodeInterface &&cpp_interface) const eastl::string cppFileName(eastl::string::CtorSprintf{}, "%s/stcode_main.stcode.gen.cpp", stcode_dir.c_str()); // For unity build, paste cpps as is. Otherwise, use headers for fwd decl - const char *includesExtForBuildType = cpp_stcode_unity_build ? "cpp" : "h"; + const char *includesExtForBuildType = shc::config().cppStcodeUnityBuild ? "cpp" : "h"; eastl::string includes = ""; const eastl::string matchPath(eastl::string::CtorSprintf{}, "%s/*.stcode.gen.%s", src_dir.c_str(), includesExtForBuildType); @@ -333,7 +317,7 @@ dag::Expected make_stcode_compilation_ta eastl::string sourcesList; - if (cpp_stcode_unity_build) + if (shc::config().cppStcodeUnityBuild) sourcesList = ""; else { @@ -365,7 +349,7 @@ dag::Expected make_stcode_compilation_ta #endif ; - const char *customCppOpts = cpp_stcode_unity_build ? "-DROUTINE_VISIBILITY=static" : "-DROUTINE_VISIBILITY=extern"; + const char *customCppOpts = shc::config().cppStcodeUnityBuild ? "-DROUTINE_VISIBILITY=static" : "-DROUTINE_VISIBILITY=extern"; const eastl::string jamPath(eastl::string::CtorSprintf{}, "%s/jamfile", stcode_dir.c_str()); const eastl::string jamContent(eastl::string::CtorSprintf{}, jamTemplate, rootRelPath.c_str(), stcodeRelPath.c_str(), @@ -378,11 +362,8 @@ dag::Expected make_stcode_compilation_ta const char *targetType = "dll"; StcodeTargetArch arch = StcodeTargetArch::DEFAULT; -#define SET_ARCH_WITH_DEF(default_) \ - do \ - { \ - arch = cpp_stcode_arch == StcodeTargetArch::DEFAULT ? default_ : cpp_stcode_arch; \ - } while (0) +#define SET_ARCH_WITH_DEF(default_) \ + arch = (shc::config().cppStcodeArch == StcodeTargetArch::DEFAULT ? default_ : shc::config().cppStcodeArch) // Start proc #if _TARGET_PC_WIN @@ -392,7 +373,7 @@ dag::Expected make_stcode_compilation_ta SET_ARCH_WITH_DEF(StcodeTargetArch::X86_64); #if _CROSS_TARGET_DX12 - switch (targetPlatform) + switch (shc::config().targetPlatform) { case dx12::dxil::Platform::PC: jamPlatform = "windows"; break; case dx12::dxil::Platform::XBOX_ONE: jamPlatform = "xboxOne"; break; diff --git a/prog/tools/ShaderCompiler2/cppStcode.h b/prog/tools/ShaderCompiler2/cppStcode.h index 667a1f19c..8bb3657e4 100644 --- a/prog/tools/ShaderCompiler2/cppStcode.h +++ b/prog/tools/ShaderCompiler2/cppStcode.h @@ -2,21 +2,22 @@ #pragma once #include "cppStcodeAssembly.h" +#include "cppStcodePlatformInfo.h" +#include "globalConfig.h" #include "shHardwareOpt.h" #include "processes.h" #include +#include "globalConfig.h" -extern bool compile_cpp_stcode; -extern bool cpp_stcode_unity_build; extern StcodeShader g_cppstcode; -bool set_stcode_arch_from_arg(const char *str); +bool set_stcode_arch_from_arg(const char *str, shc::CompilerConfig &config_rw); -#define RET_IF_SHOULD_NOT_COMPILE(_ret) \ - do \ - { \ - if (!compile_cpp_stcode) \ - return _ret; \ +#define RET_IF_SHOULD_NOT_COMPILE(_ret) \ + do \ + { \ + if (!shc::config().compileCppStcode) \ + return _ret; \ } while (0) void prepare_stcode_directory(const char *dest_dir); diff --git a/prog/tools/ShaderCompiler2/cppStcodePlatformInfo.h b/prog/tools/ShaderCompiler2/cppStcodePlatformInfo.h new file mode 100644 index 000000000..825e633ac --- /dev/null +++ b/prog/tools/ShaderCompiler2/cppStcodePlatformInfo.h @@ -0,0 +1,12 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include + +enum class StcodeTargetArch : uint8_t +{ + DEFAULT, + X86, + X86_64, + ARM64 +}; diff --git a/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.cpp b/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.cpp index b30d83143..f06c69ebd 100644 --- a/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.cpp +++ b/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.cpp @@ -13,6 +13,9 @@ #include +#include +#include + #include #include @@ -973,6 +976,10 @@ ShaderCompileResult compileShader(dag::ConstSpan source, const char *profi compileConfig.pdbMode = ::dxil::PDBMode::SMALL; compileConfig.saveHlslToBlob = debug_level == DebugLevel::FULL_DEBUG_INFO || embed_source; + Tab utf8_buf; + if (compileConfig.pdbMode != ::dxil::PDBMode::NONE && !compileConfig.PDBBasePath.empty()) + dd_mkdir(convert_to_utf8(utf8_buf, compileConfig.PDBBasePath.data(), compileConfig.PDBBasePath.size())); + // on xbox we have to compile shaders in two phases: // 1) without root signature to be able to query shader header to later generate root signature // 2) provide root signature for combination the shader is used with diff --git a/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.h b/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.h index 9b6f2b78a..bf88ed87b 100644 --- a/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.h +++ b/prog/tools/ShaderCompiler2/dx12/asmShaderDXIL.h @@ -15,8 +15,6 @@ struct ID3DXBuffer; struct TmpmemAlloc; typedef int VPRTYPE; -extern bool autotest_mode; - namespace dx12 { namespace dxil @@ -30,7 +28,7 @@ enum class Platform inline bool is_xbox_platform(Platform p) { return Platform::XBOX_ONE == p || Platform::XBOX_SCARLETT == p; } inline bool platform_has_mesh_support(Platform p) { return Platform::XBOX_ONE != p; } -inline bool use_two_phase_compilation(Platform p) { return is_xbox_platform(p) && !autotest_mode; } +inline bool use_two_phase_compilation(Platform p) { return is_xbox_platform(p); } // NOTE: platform has to be the same for each call for the currently running instance // otherwise the selected platform is undefined, especially when multiple threads at diff --git a/prog/tools/ShaderCompiler2/gatherVar.cpp b/prog/tools/ShaderCompiler2/gatherVar.cpp index 029d716ba..405694b40 100644 --- a/prog/tools/ShaderCompiler2/gatherVar.cpp +++ b/prog/tools/ShaderCompiler2/gatherVar.cpp @@ -4,6 +4,7 @@ #include "semUtils.h" #include "globVarSem.h" #include "globVar.h" +#include "globalConfig.h" #include "boolVar.h" #include "varMap.h" #include @@ -24,7 +25,6 @@ using namespace ShaderParser; extern SCFastNameMap glob_string_table; -extern bool isDebugModeEnabled; /********************************* * @@ -33,7 +33,7 @@ extern bool isDebugModeEnabled; *********************************/ GatherVarShaderEvalCB::GatherVarShaderEvalCB(ShaderSyntaxParser &_parser, const ShHardwareOptions &_opt, Terminal *shname, const char *hlsl_vs, const char *hlsl_hs, const char *hlsl_ds, const char *hlsl_gs, const char *hlsl_ps, const char *hlsl_cs, - const char *hlsl_ms, const char *hlsl_as) : + const char *hlsl_ms, const char *hlsl_as, bool &out_shaderDebugModeEnabled) : parser(_parser), hasHWFlag(false), hwStack(tmpmem), @@ -57,14 +57,35 @@ GatherVarShaderEvalCB::GatherVarShaderEvalCB(ShaderSyntaxParser &_parser, const hlslMs = hlsl_ms; hlslAs = hlsl_as; - if (isDebugModeEnabled) - { - DataBlock *blk = shc::getAssumedVarsBlock(); - if (blk) - { - blk = blk->addBlock(shname_token->text); - blk->setReal(debug_mode_enabled_interval, 1.0f); - } + shaderDebugModeEnabled = shc::config().isDebugModeEnabled; + if (!shaderDebugModeEnabled) + { + float value = 0.0f; + if (shc::getAssumedValue("debug_mode_enabled", shname_token->text, true, value)) + shaderDebugModeEnabled = (value > 0.0f); + } + out_shaderDebugModeEnabled = shaderDebugModeEnabled; + if (!shaderDebugModeEnabled) + { + const char *pattern_to_remove = "#line 1 \"precompiled\"\n#undef _FILE_\n#define _FILE_ "; + const char *stubhdr_to_insert = "#line 1 \"precompiled\"\n#define _FILE_ -1\n"; + int stubhdr_to_insert_sz = (int)strlen(stubhdr_to_insert); + hlslVs.replaceAll(pattern_to_remove, "//"); + hlslPs.replaceAll(pattern_to_remove, "//"); + hlslHs.replaceAll(pattern_to_remove, "//"); + hlslDs.replaceAll(pattern_to_remove, "//"); + hlslGs.replaceAll(pattern_to_remove, "//"); + hlslCs.replaceAll(pattern_to_remove, "//"); + hlslMs.replaceAll(pattern_to_remove, "//"); + hlslAs.replaceAll(pattern_to_remove, "//"); + hlslVs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslPs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslHs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslDs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslGs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslCs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslMs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); + hlslAs.insert(0, stubhdr_to_insert, stubhdr_to_insert_sz); } } @@ -120,17 +141,13 @@ void GatherVarShaderEvalCB::decl_bool_alias(const char *name, bool_expr &expr) int GatherVarShaderEvalCB::add_message(const char *message, bool file_name) { - float value = 0.0f; - if (shc::getAssumedValue(debug_mode_enabled_interval, shname_token->text, true, value)) - if (value > 0.0f) - { - int id = messages.addNameId(message); - if (!file_name) - nonFilenameMessages.set(id, true); - return id; - } + if (!shaderDebugModeEnabled) + return -1; - return -1; + int id = messages.addNameId(message); + if (!file_name) + nonFilenameMessages.set(id, true); + return id; } void GatherVarShaderEvalCB::eval_static(static_var_decl &s) @@ -462,23 +479,25 @@ bool GatherVarShaderEvalCB::end_eval(CodeSourceBlocks &vs_blk, CodeSourceBlocks CodeSourceBlocks &gs_blk, CodeSourceBlocks &ps_blk, CodeSourceBlocks &cs_blk, CodeSourceBlocks &ms_blk, CodeSourceBlocks &as_blk) { G_ASSERT(messages.nameCount() == 0); - messages = glob_string_table; + if (shaderDebugModeEnabled) + messages = glob_string_table; - if (!vs_blk.parseSourceCode("vs", hlslVs, *this)) + bool pp_as_comments = shc::config().hlslSavePPAsComments && !shaderDebugModeEnabled; + if (!vs_blk.parseSourceCode("vs", hlslVs, *this, pp_as_comments)) return false; - if (!hs_blk.parseSourceCode("hs", hlslHs, *this)) + if (!hs_blk.parseSourceCode("hs", hlslHs, *this, pp_as_comments)) return false; - if (!ds_blk.parseSourceCode("ds", hlslDs, *this)) + if (!ds_blk.parseSourceCode("ds", hlslDs, *this, pp_as_comments)) return false; - if (!gs_blk.parseSourceCode("gs", hlslGs, *this)) + if (!gs_blk.parseSourceCode("gs", hlslGs, *this, pp_as_comments)) return false; - if (!ps_blk.parseSourceCode("ps", hlslPs, *this)) + if (!ps_blk.parseSourceCode("ps", hlslPs, *this, pp_as_comments)) return false; - if (!cs_blk.parseSourceCode("cs", hlslCs, *this)) + if (!cs_blk.parseSourceCode("cs", hlslCs, *this, pp_as_comments)) return false; - if (!ms_blk.parseSourceCode("ms", hlslMs, *this)) + if (!ms_blk.parseSourceCode("ms", hlslMs, *this, pp_as_comments)) return false; - if (!as_blk.parseSourceCode("as", hlslAs, *this)) + if (!as_blk.parseSourceCode("as", hlslAs, *this, pp_as_comments)) return false; return true; } @@ -570,13 +589,13 @@ void GatherVarShaderEvalCB::eval_supports(supports_stat &s) } uint32_t hlsl_types = 0; - addSourceCode(hlslPs, &s, hlsl.c_str(), parser); - addSourceCode(hlslVs, &s, hlsl.c_str(), parser); - addSourceCode(hlslHs, &s, hlsl.c_str(), parser); - addSourceCode(hlslDs, &s, hlsl.c_str(), parser); - addSourceCode(hlslGs, &s, hlsl.c_str(), parser); - addSourceCode(hlslMs, &s, hlsl.c_str(), parser); - addSourceCode(hlslAs, &s, hlsl.c_str(), parser); + addSourceCode(hlslPs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslVs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslHs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslDs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslGs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslMs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslAs, s.name[0], hlsl.c_str(), parser, shaderDebugModeEnabled); #endif } @@ -624,24 +643,24 @@ void GatherVarShaderEvalCB::eval(immediate_const_block &s) uint32_t hlsl_types = 0; if (strstr(s.scope->text, "ps") != 0) - addSourceCode(hlslPs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslPs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); else if (strstr(s.scope->text, "vs") != 0) { - addSourceCode(hlslVs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslVs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); // hs, ds and gs stage also see vs sources so they need this also - addSourceCode(hlslGs, s.scope, hlsl.c_str(), parser); - addSourceCode(hlslHs, s.scope, hlsl.c_str(), parser); - addSourceCode(hlslDs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslGs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslHs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); + addSourceCode(hlslDs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); } else if (strstr(s.scope->text, "cs") != 0) - addSourceCode(hlslCs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslCs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); else if (strstr(s.scope->text, "ms") != 0) { - addSourceCode(hlslMs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslMs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); } else if (strstr(s.scope->text, "as") != 0) { - addSourceCode(hlslAs, s.scope, hlsl.c_str(), parser); + addSourceCode(hlslAs, s.scope, hlsl.c_str(), parser, shaderDebugModeEnabled); } else error("unknown hlsl block", s.scope); @@ -684,21 +703,21 @@ void GatherVarShaderEvalCB::eval_hlsl_decl(hlsl_local_decl_class &sh) hlsl_types |= HLSL_MS; if (hlsl_types & HLSL_PS) - addSourceCode(hlslPs, sh.text, parser); + addSourceCode(hlslPs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_VS) - addSourceCode(hlslVs, sh.text, parser); + addSourceCode(hlslVs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_CS) - addSourceCode(hlslCs, sh.text, parser); + addSourceCode(hlslCs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_GS) - addSourceCode(hlslGs, sh.text, parser); + addSourceCode(hlslGs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_DS) - addSourceCode(hlslDs, sh.text, parser); + addSourceCode(hlslDs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_HS) - addSourceCode(hlslHs, sh.text, parser); + addSourceCode(hlslHs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_MS) - addSourceCode(hlslMs, sh.text, parser); + addSourceCode(hlslMs, sh.text, parser, shaderDebugModeEnabled); if (hlsl_types & HLSL_AS) - addSourceCode(hlslAs, sh.text, parser); + addSourceCode(hlslAs, sh.text, parser, shaderDebugModeEnabled); } void GatherVarShaderEvalCB::eval_endif(bool_expr &e) diff --git a/prog/tools/ShaderCompiler2/gatherVar.h b/prog/tools/ShaderCompiler2/gatherVar.h index cd3167fb3..5c6370f02 100644 --- a/prog/tools/ShaderCompiler2/gatherVar.h +++ b/prog/tools/ShaderCompiler2/gatherVar.h @@ -23,9 +23,6 @@ class CodeSourceBlocks; namespace ShaderParser { - -constexpr char debug_mode_enabled_interval[] = "debug_mode_enabled"; - /********************************* * * class GatherVarShaderEvalCB @@ -45,11 +42,12 @@ class GatherVarShaderEvalCB : public ShaderEvalCB, public ShaderBoolEvalCB OAHashNameMap staticVars, dynamicVars; Terminal *shname_token; + bool shaderDebugModeEnabled = false; GatherVarShaderEvalCB(ShaderSyntaxParser &_parser, const ShHardwareOptions &_opt, Terminal *shname, const char *hlsl_vs, const char *hlsl_hs, const char *hlsl_ds, const char *hlsl_gs, const char *hlsl_ps, const char *hlsl_cs, const char *hlsl_ms, - const char *hlsl_as); + const char *hlsl_as, bool &out_shaderDebugModeEnabled); virtual void eval_interval_decl(interval &interv); @@ -57,6 +55,7 @@ class GatherVarShaderEvalCB : public ShaderEvalCB, public ShaderBoolEvalCB void eval_bool_decl(bool_decl &) override; void decl_bool_alias(const char *name, bool_expr &expr) override; int add_message(const char *message, bool file_name) override; + int is_debug_mode_enabled() override { return shaderDebugModeEnabled; } bool is_filename_message(int id) const { return !nonFilenameMessages.test(id, false); } const SCFastNameMap &get_messages() const { return messages; } diff --git a/prog/tools/ShaderCompiler2/globalConfig.cpp b/prog/tools/ShaderCompiler2/globalConfig.cpp new file mode 100644 index 000000000..e30d9c43f --- /dev/null +++ b/prog/tools/ShaderCompiler2/globalConfig.cpp @@ -0,0 +1,14 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. + +#include "globalConfig.h" + +static shc::CompilerConfig g_config{}; + +const shc::CompilerConfig &shc::config() { return g_config; } +shc::CompilerConfig &shc::acquire_rw_config() +{ + static bool acquired = false; + G_ASSERT(!acquired); + acquired = true; + return g_config; +} diff --git a/prog/tools/ShaderCompiler2/globalConfig.h b/prog/tools/ShaderCompiler2/globalConfig.h new file mode 100644 index 000000000..9209d9d29 --- /dev/null +++ b/prog/tools/ShaderCompiler2/globalConfig.h @@ -0,0 +1,150 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "shHardwareOpt.h" +#include "DebugLevel.h" +#include "shadervarGenerator.h" +#include "cppStcodePlatformInfo.h" + +#include +#include + +#if _CROSS_TARGET_C1 + +#elif _CROSS_TARGET_DX12 +#include "dx12/asmShaderDXIL.h" +#elif _CROSS_TARGET_DX11 +#include +#else +#if _TARGET_PC_WIN +#include +#endif +#endif + +namespace shc +{ +struct CompilerConfig +{ + const char *version = "2.72"; + + const char *singleCompilationShName = nullptr; + const char *intermediateDir = nullptr; + const char *logDir = nullptr; + const char *outDumpNameConfig = nullptr; + const char *sha1CacheDir = nullptr; + + const char *crossCompiler = +#if _CROSS_TARGET_C1 + +#elif _CROSS_TARGET_C2 + +#elif _CROSS_TARGET_METAL + "metal" +#elif _CROSS_TARGET_SPIRV + "spirv" +#elif _CROSS_TARGET_EMPTY + "stub" +#elif _CROSS_TARGET_DX12 + "dx12" +#elif _CROSS_TARGET_DX11 //_TARGET_PC is also defined + "dx11" +#endif + ; + +#if _CROSS_TARGET_C1 | _CROSS_TARGET_C2 + +#elif _CROSS_TARGET_DX12 + wchar_t *dx12PdbCacheDir = nullptr; +#endif + + String hlslDefines; + SimpleString shaderSrcRoot; + ShHardwareOptions singleOptions{4.0_sm}; + + std::string shadervarsCodeTemplateFilename; + GeneratedPathInfos generatedPathInfos; + dag::Vector excludeFromGeneration; + + dag::Vector dscIncludePaths; + // use power_of_two strategy, because we have good enough hashes for strings + ska::flat_hash_map fileToFullPath; + + size_t dictionarySizeInKb = 4096; + size_t shGroupSizeInKb = 1024; + + unsigned numProcesses = -1; + unsigned numWorkers = 0; + + int hlslMaximumVsfAllowed = 2048; + int hlslMaximumPsfAllowed = 2048; + int hlslOptimizationLevel = 4; + + DebugLevel hlslDebugLevel = DebugLevel::NONE; + ShadervarGeneratorMode shadervarGeneratorMode = ShadervarGeneratorMode::None; + StcodeTargetArch cppStcodeArch = StcodeTargetArch::DEFAULT; + +#if USE_BINDLESS_FOR_STATIC_TEX + bool enableBindless : 1 = true; +#else + bool enableBindless : 1 = false; +#endif +#if _CROSS_TARGET_DX12 + bool useGitTimestamps : 1 = true; +#else + bool useGitTimestamps : 1 = false; +#endif + bool forceRebuild : 1 = false; + bool forceRelink : 1 = false; + bool shortMessages : 1 = false; + bool noSave : 1 = false; + bool hlslSavePPAsComments : 1 = false; + bool isDebugModeEnabled : 1 = false; + bool hlslEmbedSource : 1 = false; + bool hlslSkipValidation : 1 = false; + bool hlslNoDisassembly : 1 = false; + bool hlslShowWarnings : 1 = false; + bool hlslWarningsAsErrors : 1 = false; + bool hlslDumpCodeAlways : 1 = false; + bool hlslDumpCodeSeparate : 1 = false; + bool hlslDumpCodeOnError : 1 = false; + bool validateIdenticalBytecode : 1 = false; + bool hlsl2021 : 1 = false; + bool useCompression : 1 = true; + bool addTextureType : 1 = false; + bool suppressLogs : 1 = false; + bool optionalIntervalsAsBranches : 1 = false; + bool logExactCompilationTimes : 1 = false; + bool logFullPerFileCompilationStats : 1 = false; + bool autotestMode : 1 = false; + bool useSha1Cache : 1 = true; + bool writeSha1Cache : 1 = true; + bool purgeSha1 : 1 = false; + bool enableFp16 : 1 = false; + bool saveDumpOnCrash : 1 = false; + bool singleBuild : 1 = false; + bool relinkOnly : 1 = false; + bool useThreadpool : 1 = true; + bool compileCppStcode : 1 = false; + bool cppStcodeUnityBuild : 1 = false; + bool disallowHlslHardcodedRegs : 1 = false; + +#if _CROSS_TARGET_C1 | _CROSS_TARGET_C2 + +#elif _CROSS_TARGET_DX12 + dx12::dxil::Platform targetPlatform = dx12::dxil::Platform::PC; +#elif _CROSS_TARGET_SPIRV + bool compilerHlslCc : 1 = false; + bool compilerDXC : 1 = false; +#elif _CROSS_TARGET_METAL + bool useIosToken : 1 = false; + bool useBinaryMsl : 1 = false; + bool useMetalGlslang : 1 = false; +#endif + + const char *getShaderSrcRoot() const { return shaderSrcRoot.empty() ? nullptr : shaderSrcRoot.c_str(); } +}; + +const CompilerConfig &config(); +CompilerConfig &acquire_rw_config(); // For filling in init + +} // namespace shc diff --git a/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.cpp b/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.cpp index f7af88e62..f0aee96f8 100644 --- a/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.cpp +++ b/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.cpp @@ -41,9 +41,6 @@ #include "../DebugLevel.h" #include -extern DebugLevel hlslDebugLevel; -extern bool enableBindless; - using namespace std; static void fix_varaible_names(String &glsl) { glsl.replaceAll("__", "_"); } @@ -247,11 +244,12 @@ bool useBaseVertexPatch(const char *source) } CompileResult compileShaderSpirV(const char *source, const char *profile, const char *entry, bool need_disasm, bool enable_fp16, - bool skipValidation, bool optimize, int max_constants_no, const char *shader_name, CompilerMode mode, uint64_t shader_variant_hash) + bool skipValidation, bool optimize, int max_constants_no, const char *shader_name, CompilerMode mode, uint64_t shader_variant_hash, + bool enable_bindless, bool embed_debug_data) { CompileResult result; - if (enableBindless) + if (enable_bindless) { if (mode != CompilerMode::DXC) { @@ -272,8 +270,6 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const return result; } #endif - // to make this true -> turn on validation and set optimization to 0 - const bool embedDebugData = hlslDebugLevel != DebugLevel::NONE; // just to have it for debugging (void)need_disasm; @@ -301,7 +297,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const Tab chunkStore; std::vector spirv; - if (embedDebugData) + if (embed_debug_data) add_chunk(chunks, chunkStore, spirv::ChunkType::UNPROCESSED_HLSL, 0, source, static_cast(strlen(source))); if (CompilerMode::HLSLCC == mode) @@ -312,7 +308,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const { ComPtr errors; - if (embedDebugData) + if (embed_debug_data) add_chunk(chunks, chunkStore, spirv::ChunkType::UNPROCESSED_HLSL, 0, source, static_cast(strlen(source))); const D3D_SHADER_MACRO macros[] = // @@ -344,7 +340,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const stringstream infoLog; - if (embedDebugData) + if (embed_debug_data) { auto dxbcDisas = disassemble_dxbc(byteCode); add_chunk(chunks, chunkStore, spirv::ChunkType::HLSL_DISASSEMBLY, 0, dxbcDisas.data(), @@ -372,7 +368,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const } fix_varaible_names(shaderCode); - if (embedDebugData) + if (embed_debug_data) add_chunk(chunks, chunkStore, spirv::ChunkType::RECONSTRUCTED_GLSL, 0, shaderCode.data(), shaderCode.length()); const spirv::CompileFlags glslCompileFlags = optimize ? spirv::CompileFlags::NONE : spirv::CompileFlags::DEBUG_BUILD; @@ -456,7 +452,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const "#define HW_VERTEX_ID uint vertexId: SV_VertexID;\n" "#define HW_BASE_VERTEX_ID [[vk::builtin(\"BaseVertex\")]] uint baseVertexId : DXC_SPIRV_BASE_VERTEX_ID;\n" "#define HW_BASE_VERTEX_ID_OPTIONAL [[vk::builtin(\"BaseVertex\")]] uint baseVertexId : DXC_SPIRV_BASE_VERTEX_ID;\n"; - if (enableBindless) + if (enable_bindless) { macros += "#define BINDLESS_TEXTURE_SET_META_ID " + std::to_string(spirv::bindless::TEXTURE_DESCRIPTOR_SET_META_INDEX) + "\n"; macros += "#define BINDLESS_SAMPLER_SET_META_ID " + std::to_string(spirv::bindless::SAMPLER_DESCRIPTOR_SET_META_INDEX) + "\n"; @@ -479,7 +475,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const auto sourceRange = make_span(codeCopy.c_str(), codeCopy.size()); - auto flags = enableBindless ? spirv::CompileFlags::ENABLE_BINDLESS_SUPPORT : spirv::CompileFlags::NONE; + auto flags = enable_bindless ? spirv::CompileFlags::ENABLE_BINDLESS_SUPPORT : spirv::CompileFlags::NONE; flags |= enable_fp16 ? spirv::CompileFlags::ENABLE_HALFS : spirv::CompileFlags::NONE; auto finalSpirV = spirv::compileHLSL_DXC(sourceRange, entry, profile, flags, disabledSpirvOptims); @@ -565,7 +561,7 @@ CompileResult compileShaderSpirV(const char *source, const char *profile, const } #endif - if (embedDebugData) + if (embed_debug_data) { spvtools::SpirvTools tools{SPV_ENV_VULKAN_1_0}; diff --git a/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.h b/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.h index 7b1a950b4..87139adcd 100644 --- a/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.h +++ b/prog/tools/ShaderCompiler2/hlsl2spirv/asmShaderSpirV.h @@ -10,4 +10,5 @@ enum class CompilerMode DEFAULT = DXC }; CompileResult compileShaderSpirV(const char *source, const char *profile, const char *entry, bool need_disasm, bool enable_fp16, - bool skipValidation, bool optimize, int max_constants_no, const char *shader_name, CompilerMode mode, uint64_t shader_variant_hash); + bool skipValidation, bool optimize, int max_constants_no, const char *shader_name, CompilerMode mode, uint64_t shader_variant_hash, + bool enable_bindless, bool embed_debug_data); diff --git a/prog/tools/ShaderCompiler2/hlslCompiler/spirv.cpp b/prog/tools/ShaderCompiler2/hlslCompiler/spirv.cpp index 1b710bdbe..824507d42 100644 --- a/prog/tools/ShaderCompiler2/hlslCompiler/spirv.cpp +++ b/prog/tools/ShaderCompiler2/hlslCompiler/spirv.cpp @@ -2,19 +2,21 @@ #include "asmShaderSpirV.h" #include "defines.h" +#include "../DebugLevel.h" #include #include #include extern bool enableBindless; +extern DebugLevel hlslDebugLevel; DLL_EXPORT bool compile_compute_shader_spirv(const char *hlsl_text, unsigned len, const char *entry, const char *profile, Tab &shader_bin, String &out_err) { enableBindless = false; bool enableFp16 = str_ends_with_c(profile, "_half"); - CompileResult result = - compileShaderSpirV(hlsl_text, profile, entry, false, enableFp16, false, true, 4096, "nodeBasedShader", CompilerMode::DEFAULT, 0); + CompileResult result = compileShaderSpirV(hlsl_text, profile, entry, false, enableFp16, false, true, 4096, "nodeBasedShader", + CompilerMode::DEFAULT, 0, enableBindless, hlslDebugLevel != DebugLevel::NONE); if (result.bytecode.empty()) return false; @@ -30,8 +32,8 @@ DLL_EXPORT bool compile_compute_shader_spirv_bindless(const char *hlsl_text, uns { enableBindless = true; bool enableFp16 = str_ends_with_c(profile, "_half"); - CompileResult result = - compileShaderSpirV(hlsl_text, profile, entry, false, enableFp16, false, true, 4096, "nodeBasedShader", CompilerMode::DEFAULT, 0); + CompileResult result = compileShaderSpirV(hlsl_text, profile, entry, false, enableFp16, false, true, 4096, "nodeBasedShader", + CompilerMode::DEFAULT, 0, enableBindless, hlslDebugLevel != DebugLevel::NONE); if (result.bytecode.empty()) return false; diff --git a/prog/tools/ShaderCompiler2/jamfile-common b/prog/tools/ShaderCompiler2/jamfile-common index a3fa7ffd2..0d20eb9af 100644 --- a/prog/tools/ShaderCompiler2/jamfile-common +++ b/prog/tools/ShaderCompiler2/jamfile-common @@ -43,6 +43,7 @@ Sources = sh_stat.cpp shCompiler.cpp debugSpitfile.cpp + globalConfig.cpp shCode.cpp cppStcode.cpp @@ -71,6 +72,8 @@ Sources = shadervarGenerator.cpp parser/bparser.cpp gitRunner.cpp + + processes.cpp ; if $(Platform) = windows { diff --git a/prog/tools/ShaderCompiler2/jamfile-hlsl2spirv b/prog/tools/ShaderCompiler2/jamfile-hlsl2spirv index df36b8081..16370104d 100644 --- a/prog/tools/ShaderCompiler2/jamfile-hlsl2spirv +++ b/prog/tools/ShaderCompiler2/jamfile-hlsl2spirv @@ -33,7 +33,7 @@ CPPopt += -D_CROSS_TARGET_SPIRV=1 -DBINDUMP_TARGET_BE=0 -D_CRT_SECURE_NO_DEPRECA ; if $(Platform) = macOS { - CPPopt += -Wno-switch ; + CPPopt += -Wno-switch -Wno-deprecated-declarations ; } else if $(Platform) = linux { if $(PlatformSpec) = clang { CPPopt += -Wno-switch -Wno-sometimes-uninitialized ; } } diff --git a/prog/tools/ShaderCompiler2/linkShaders.cpp b/prog/tools/ShaderCompiler2/linkShaders.cpp index 065c433da..b5061cd56 100644 --- a/prog/tools/ShaderCompiler2/linkShaders.cpp +++ b/prog/tools/ShaderCompiler2/linkShaders.cpp @@ -3,6 +3,7 @@ #include "linkShaders.h" #include "gitRunner.h" #include "loadShaders.h" +#include "globalConfig.h" #include "globVar.h" #include "varMap.h" @@ -39,13 +40,6 @@ #include #endif -#if _CROSS_TARGET_DX12 -#include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; - -#include "DebugLevel.h" -#endif - static Tab shader_class(tmpmem_ptr()); static Tab> shaders_fsh(tmpmem_ptr()); static Tab> shaders_vpr(tmpmem_ptr()); @@ -107,9 +101,6 @@ int add_fshader(dag::ConstSpan code) #include #include -extern bool useSha1Cache, writeSha1Cache; -extern char *sha1_cache_dir; - int add_vprog(dag::ConstSpan vs, dag::ConstSpan hs, dag::ConstSpan ds, dag::ConstSpan gs) { if (!vs.size()) @@ -259,13 +250,7 @@ int add_vprog(dag::ConstSpan vs, dag::ConstSpan hs, dag::Con } #if _CROSS_TARGET_DX12 -extern int hlslOptimizationLevel; -extern bool hlslSkipValidation; -extern bool hlsl2021; -extern DebugLevel hlslDebugLevel; -extern bool hlslEmbedSource; -static bool is_hlsl_debug() { return hlslDebugLevel != DebugLevel::NONE; } -extern char *sha1_cache_dir; +static bool is_hlsl_debug() { return shc::config().hlslDebugLevel != DebugLevel::NONE; } #if REPORT_RECOMPILE_PROGRESS #define REPORT debug @@ -305,12 +290,12 @@ VertexProgramAndPixelShaderIdents add_phase_one_progs(dag::ConstSpan v } dx12::dxil::CompilationOptions compileOptions; - compileOptions.optimize = hlslOptimizationLevel ? true : false; - compileOptions.skipValidation = hlslSkipValidation; + compileOptions.optimize = shc::config().hlslOptimizationLevel ? true : false; + compileOptions.skipValidation = shc::config().hlslSkipValidation; compileOptions.debugInfo = is_hlsl_debug(); compileOptions.scarlettW32 = useScarlettWave32; - compileOptions.hlsl2021 = hlsl2021; - compileOptions.enableFp16 = enable_fp16; + compileOptions.hlsl2021 = shc::config().hlsl2021; + compileOptions.enableFp16 = shc::config().enableFp16; if (-1 == result.vprog) { auto packed = dx12::dxil::combinePhaseOneVertexProgram(vShaderData, hShaderData, dShaderData, gShaderData, rootSignatureDefinition, @@ -348,15 +333,16 @@ struct RecompileJobBase : shc::Job eastl::unique_ptr> load_cache(dag::ConstSpan uncompiled, const char *type_name) { - if (!useSha1Cache) + if (!shc::config().useSha1Cache) return {}; - const char *profile_name = dx12::dxil::Platform::XBOX_ONE == targetPlatform ? "x" : "xs"; + const char *profile_name = dx12::dxil::Platform::XBOX_ONE == shc::config().targetPlatform ? "x" : "xs"; HASH_CONTEXT ctx; HASH_INIT(&ctx); HASH_UPDATE(&ctx, reinterpret_cast(uncompiled.data()), data_size(uncompiled)); HASH_FINISH(&ctx, ilHash); - SNPRINTF(ilPath, sizeof(ilPath), "%s/il/%s/%s/" HASH_LIST_STRING, sha1_cache_dir, type_name, profile_name, HASH_LIST(ilHash)); + SNPRINTF(ilPath, sizeof(ilPath), "%s/il/%s/%s/" HASH_LIST_STRING, shc::config().sha1CacheDir, type_name, profile_name, + HASH_LIST(ilHash)); auto file = df_open(ilPath, DF_READ); if (!file) { @@ -373,7 +359,7 @@ struct RecompileJobBase : shc::Job } char byteCodePath[420]; - SNPRINTF(byteCodePath, sizeof(byteCodePath), "%s/bc/%s/%s/" HASH_LIST_STRING, sha1_cache_dir, type_name, profile_name, + SNPRINTF(byteCodePath, sizeof(byteCodePath), "%s/bc/%s/%s/" HASH_LIST_STRING, shc::config().sha1CacheDir, type_name, profile_name, HASH_LIST(mappingFile.byteCodeHash)); auto byteCodeFile = df_open(byteCodePath, DF_READ); if (!byteCodeFile) @@ -409,10 +395,10 @@ struct RecompileJobBase : shc::Job void store_cache(dag::ConstSpan uncompiled, dag::ConstSpan compiled, const char *type_name) { - if (!writeSha1Cache) + if (!shc::config().writeSha1Cache) return; - const char *profile_name = dx12::dxil::Platform::XBOX_ONE == targetPlatform ? "x" : "xs"; + const char *profile_name = dx12::dxil::Platform::XBOX_ONE == shc::config().targetPlatform ? "x" : "xs"; MappingFileLayout mappingFile{}; mappingFile.ilSize = data_size(uncompiled); mappingFile.byteCodeSize = data_size(compiled); @@ -422,7 +408,7 @@ struct RecompileJobBase : shc::Job HASH_UPDATE(&ctx, reinterpret_cast(uncompiled.data()), data_size(uncompiled)); HASH_FINISH(&ctx, mappingFile.byteCodeHash); char bcPath[420]; - SNPRINTF(bcPath, sizeof(bcPath), "%s/bc/%s/%s/" HASH_LIST_STRING, sha1_cache_dir, type_name, profile_name, + SNPRINTF(bcPath, sizeof(bcPath), "%s/bc/%s/%s/" HASH_LIST_STRING, shc::config().sha1CacheDir, type_name, profile_name, HASH_LIST(mappingFile.byteCodeHash)); DagorStat bcInfo; @@ -433,8 +419,8 @@ struct RecompileJobBase : shc::Job } else { - SNPRINTF(tempPath, sizeof(tempPath), "%s/%s_bc_%s_" HASH_TEMP_STRING "XXXXXX", sha1_cache_dir, type_name, profile_name, - HASH_LIST(mappingFile.byteCodeHash)); + SNPRINTF(tempPath, sizeof(tempPath), "%s/%s_bc_%s_" HASH_TEMP_STRING "XXXXXX", shc::config().sha1CacheDir, type_name, + profile_name, HASH_LIST(mappingFile.byteCodeHash)); auto file = df_mkstemp(tempPath); if (!file) { @@ -458,7 +444,7 @@ struct RecompileJobBase : shc::Job return; } } - SNPRINTF(tempPath, sizeof(tempPath), "%s/%s_il_%s_" HASH_TEMP_STRING "XXXXXX", sha1_cache_dir, type_name, profile_name, + SNPRINTF(tempPath, sizeof(tempPath), "%s/%s_il_%s_" HASH_TEMP_STRING "XXXXXX", shc::config().sha1CacheDir, type_name, profile_name, HASH_LIST(ilHash)); auto file = df_mkstemp(tempPath); if (!file) @@ -480,7 +466,6 @@ struct RecompileJobBase : shc::Job } } }; -extern wchar_t *dx12_pdb_cache_dir; struct RecompileVPRogJob : RecompileJobBase { @@ -494,8 +479,8 @@ struct RecompileVPRogJob : RecompileJobBase if (!recompiledVProgBlob) { writeCache = true; - auto recompiledVProg = dx12::dxil::recompileVertexProgram(shaders_vpr[compileTarget], targetPlatform, dx12_pdb_cache_dir, - hlslDebugLevel, hlslEmbedSource); + auto recompiledVProg = dx12::dxil::recompileVertexProgram(shaders_vpr[compileTarget], shc::config().targetPlatform, + shc::config().dx12PdbCacheDir, shc::config().hlslDebugLevel, shc::config().hlslEmbedSource); if (!recompiledVProg) { DAG_FATAL("Recompilation of vprog failed"); @@ -538,8 +523,8 @@ struct RecompilePShJob : RecompileJobBase if (!recompiledFShBlob) { writeCache = true; - auto recompiledFSh = dx12::dxil::recompilePixelSader(shaders_fsh[compileTarget], targetPlatform, dx12_pdb_cache_dir, - hlslDebugLevel, hlslEmbedSource); + auto recompiledFSh = dx12::dxil::recompilePixelSader(shaders_fsh[compileTarget], shc::config().targetPlatform, + shc::config().dx12PdbCacheDir, shc::config().hlslDebugLevel, shc::config().hlslEmbedSource); if (!recompiledFSh) { DAG_FATAL("Recompilation of fsh failed"); @@ -1136,20 +1121,40 @@ void save_scripted_shaders(const char *filename, dag::ConstSpan fi shaders.shaders_vpr.push_back(eastl::move(code)); } + // 4gb, cause eastl asserts this size, dag::Vector with default settings uses 32bit indices, and a lot of the bindump library code + // also assumes 32 bits is enough + constexpr size_t MAX_UNCOMPRESSED_SIZE = (1ull << 32) - 1; + + bindump::SizeMetter sizeChecker; + bindump::streamWrite(shaders, sizeChecker); + + if (sizeChecker.mSize > MAX_UNCOMPRESSED_SIZE) + { + sh_debug(SHLOG_FATAL, + "The shaders bindump is too large (%llu bytes uncompressed, doesn't fit into 32-bit indexing), " + "consider disabling global debug info options, or reducing the shader set", + sizeChecker.mSize); + return; + } + bindump::VectorWriter mem_writer; bindump::streamWrite(shaders, mem_writer); - if (mem_writer.mData.size() > (1 << 30)) + if (mem_writer.mData.size() > (1u << 30)) { compressed.compressed_shaders.resize(zstd_compress_bound(mem_writer.mData.size())); size_t compressed_size = zstd_compress(compressed.compressed_shaders.data(), compressed.compressed_shaders.size(), mem_writer.mData.data(), mem_writer.mData.size(), 9); - extern bool autotest_mode; - const size_t maxCompressedSize = autotest_mode ? 0x40000000 : 0x20000000; - - G_ASSERTF(compressed_size <= maxCompressedSize, "zstd_compress() returns %d (0x%x), srcDataSz=%u destBufSz=%u", - (ptrdiff_t)compressed_size, compressed_size, mem_writer.mData.size(), compressed.compressed_shaders.size()); + const size_t maxCompressedSize = shc::config().autotestMode ? 0x40000000 : 0x20000000; + if (compressed_size > maxCompressedSize) + { + sh_debug(SHLOG_FATAL, + "Compressed bindump size is too large, zstd_compress() returns %lld (0x%llx), srcDataSz=%llu destBufSz=%llu, " + "while cap is %llu, consider disabling global debug info options, or reducing the shader set", + (ptrdiff_t)compressed_size, compressed_size, mem_writer.mData.size(), compressed.compressed_shaders.size(), maxCompressedSize); + return; + } compressed.compressed_shaders.resize(compressed_size); compressed.decompressed_size = mem_writer.mData.size(); @@ -1172,7 +1177,7 @@ void update_shaders_timestamps(dag::ConstSpan dependencies) #if _CROSS_TARGET_DX12 int64_t mostRecentTimestamp = 0; - if (use_git_timestamps) + if (shc::config().useGitTimestamps) mostRecentTimestamp = get_git_files_last_commit_timestamp(dependencies); #else G_UNUSED(dependencies); diff --git a/prog/tools/ShaderCompiler2/linkShaders.h b/prog/tools/ShaderCompiler2/linkShaders.h index 4d12ac8f9..8aa4024cb 100644 --- a/prog/tools/ShaderCompiler2/linkShaders.h +++ b/prog/tools/ShaderCompiler2/linkShaders.h @@ -92,8 +92,6 @@ using BindumpPackingFlags = uint32_t; bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filename, bool strip_shaders_and_stcode, BindumpPackingFlags packing_flags); -extern bool use_git_timestamps; - #if _CROSS_TARGET_DX12 struct VertexProgramAndPixelShaderIdents { diff --git a/prog/tools/ShaderCompiler2/main.cpp b/prog/tools/ShaderCompiler2/main.cpp index 315802619..65fed00ed 100644 --- a/prog/tools/ShaderCompiler2/main.cpp +++ b/prog/tools/ShaderCompiler2/main.cpp @@ -24,6 +24,7 @@ #include "sha1_cache_version.h" #include "shLog.h" #include "shCompiler.h" +#include "globalConfig.h" #include "shadervarGenerator.h" #include #include "shCacheVer.h" @@ -75,6 +76,7 @@ void SleepEx(uint32_t ms, bool) { usleep(ms * 1000); } #elif _CROSS_TARGET_C2 #elif _CROSS_TARGET_DX12 +#include "dx12/asmShaderDXIL.h" #define OUTPUT_DIR "_output-dx12/" #elif _CROSS_TARGET_DX11 #define OUTPUT_DIR "_output-dx11/" @@ -94,28 +96,14 @@ size_t dagormem_next_pool_sz = 512 << 20; // unsigned int dagormem_next_pool_sz = 64 << 20; size_t dagormem_max_crt_pool_sz = 64 << 20; -size_t dictionary_size_in_kb = 4096; -size_t sh_group_size_in_kb = 1024; -ShadervarGeneratorMode shadervar_generator_mode = ShadervarGeneratorMode::None; -std::string shadervars_code_template_filename; -GeneratedPathInfos generated_path_infos; -std::vector exclude_from_generation; - extern int getShaderCacheVersion(); extern void reset_shaders_inc_base(); extern void add_shaders_inc_base(const char *base); -#ifdef _CROSS_TARGET_METAL -bool use_ios_token = false; -bool use_binary_msl = false; -bool use_metal_glslang = false; -#endif #if _CROSS_TARGET_METAL || _CROSS_TARGET_SPIRV extern const char *debug_output_dir; #endif -const char shader_compiler_version[] = "2.72"; - #define QUOTE(x) #x #define STR(x) QUOTE(x) static void show_header() @@ -139,7 +127,7 @@ static void show_header() #error "DX9 support dropped" #endif "\n\nCopyright (C) Gaijin Games KFT, 2023\n", - shader_compiler_version, _DUMP4C(SHADER_BINDUMP_VER), _DUMP4C(SHADER_CACHE_VER), sha1_cache_version + shc::config().version, _DUMP4C(SHADER_BINDUMP_VER), _DUMP4C(SHADER_CACHE_VER), sha1_cache_version #if _CROSS_TARGET_C1 @@ -157,22 +145,6 @@ static void show_header() #undef QUOTE #undef STR -String hlsl_defines; -#if _CROSS_TARGET_C1 - -#elif _CROSS_TARGET_C2 - -#elif _CROSS_TARGET_METAL -const char *cross_compiler = "metal"; -#elif _CROSS_TARGET_SPIRV -const char *cross_compiler = "spirv"; -#elif _CROSS_TARGET_EMPTY -const char *cross_compiler = "stub"; -#elif _CROSS_TARGET_DX12 -const char *cross_compiler = "dx12"; -#elif _CROSS_TARGET_DX11 //_TARGET_PC is also defined -const char *cross_compiler = "dx11"; -#endif // @TODO: update usage (-optionalAsBranches, maybe there is something else) static void showUsage() @@ -213,7 +185,8 @@ static void showUsage() " -skipvalidation - do not validate the generated code against known capabilities" " and constraints\n" " -nodisassembly - no hlsl disassembly output\n" - " -codeDump - always dump hlsl/Cg source code to be compiled to shaderlog\n" + " -codeDump - always dump hlsl/Cg source code to be compiled to shaderlog\n" + " -codeDumpSep - always dump hlsl/Cg source code to be compiled to separate files\n" " -codeDumpErr - dump hlsl/Cg source code to shaderlog when error occurs\n" " -validateIdenticalBytecode - dumps variants that were compiled but had identical bytecode\n" " -shaderOn - default shaders are on\n" @@ -280,60 +253,6 @@ static void showUsage() ); } -static SimpleString shaderSrcRoot; -const char *shc::getSrcRootFolder() { return shaderSrcRoot.empty() ? NULL : shaderSrcRoot.str(); } - -#if _CROSS_TARGET_C1 | _CROSS_TARGET_C2 - - -#endif -#if _CROSS_TARGET_DX12 -wchar_t *dx12_pdb_cache_dir = nullptr; -#endif -static bool forceRebuild = false; -static bool forceRelink = false; -static bool shortMessages = false; -static bool noSave = false; -bool hlslSavePPAsComments = false; -bool isDebugModeEnabled = false; -DebugLevel hlslDebugLevel = DebugLevel::NONE; -bool hlslEmbedSource = false; -bool hlslSkipValidation = false; -bool hlslNoDisassembly = false; -bool hlslShowWarnings = false; -bool hlslWarningsAsErrors = false; -bool hlslDumpCodeAlways = false, hlslDumpCodeOnError = false; -bool validateIdenticalBytecode = false; -bool hlsl2021 = false; -bool useCompression = true; -bool addTextureType = false; -#if USE_BINDLESS_FOR_STATIC_TEX -bool enableBindless = true; -#else -bool enableBindless = false; -#endif -int hlslOptimizationLevel = 4; -static const char *intermediate_dir = NULL, *compile_only_sh = NULL; -static const char *log_dir = NULL; -bool suppressLogs = false; -int hlsl_maximum_vsf_allowed = 2048; -int hlsl_maximum_psf_allowed = 2048; -bool optionalIntervalsAsBranches = false; -bool logExactCompilationTimes = false; -bool logFullPerFileCompilationStats = false; -bool autotest_mode = false; -#if _CROSS_TARGET_SPIRV -bool compilerHlslCc = false; -bool compilerDXC = false; -#endif -#if _CROSS_TARGET_DX12 -#include "dx12/asmShaderDXIL.h" -dx12::dxil::Platform targetPlatform = dx12::dxil::Platform::PC; -bool use_git_timestamps = true; -#else -bool use_git_timestamps = false; -#endif - #if _TARGET_PC_LINUX | _TARGET_PC_MACOSX static pthread_t sigint_handler_thread; #endif @@ -358,7 +277,7 @@ static bool doCompileModulesAsync(const ShVariantName &sv) int modules_cnt = 0; for (int i = 0; i < sv.sourceFilesList.size(); i++) { - if (!shc::should_recompile_sh(sv, sv.sourceFilesList[i]) && !forceRebuild) + if (!shc::should_recompile_sh(sv, sv.sourceFilesList[i]) && !shc::config().forceRebuild) continue; auto argv = commonArgv; @@ -386,7 +305,7 @@ static bool doCompileModulesAsync(const ShVariantName &sv) } float timeSec = float(get_time_msec() - timeMsec) * 1e-3; - if (logExactCompilationTimes) + if (shc::config().logExactCompilationTimes) { sh_debug(SHLOG_NORMAL, "[INFO] parallel compilation of %d modules using %d processes (x%d threads) done for %.4gs", modules_cnt, proc::max_proc_count(), shc::worker_count(), timeSec); @@ -401,8 +320,6 @@ static bool doCompileModulesAsync(const ShVariantName &sv) } static char sha1_cache_dir_buf[320] = {0}; -static bool purge_sha1 = false; -char *sha1_cache_dir = sha1_cache_dir_buf; static bool remove_recursive(const char *dirname) { @@ -426,26 +343,27 @@ static bool remove_recursive(const char *dirname) } static void compile(Tab &source_files, const char *fn, const char *bindump_fnprefix, const ShHardwareOptions &opt, - const char *blk_file_name, const char *cfg_dir, const char *binminidump_fnprefix, BindumpPackingFlags packing_flags) + const char *blk_file_name, const char *cfg_dir, const char *binminidump_fnprefix, BindumpPackingFlags packing_flags, + shc::CompilerConfig &config_rw) { ShVariantName sv(dd_get_fname(fn), opt); ShaderParser::AssembleShaderEvalCB::buildHwDefines(opt); sv.sourceFilesList = source_files; for (int i = 0; i < sv.sourceFilesList.size(); i++) simplify_fname(sv.sourceFilesList[i]); - if (compile_only_sh) + if (shc::config().singleCompilationShName) { for (int i = 0; i < sv.sourceFilesList.size(); i++) - if (sv.sourceFilesList[i] == compile_only_sh) + if (sv.sourceFilesList[i] == shc::config().singleCompilationShName) { clear_and_shrink(sv.sourceFilesList); - sv.sourceFilesList.push_back() = compile_only_sh; + sv.sourceFilesList.push_back() = shc::config().singleCompilationShName; break; } - if (sv.sourceFilesList.size() != 1 || sv.sourceFilesList[0] != compile_only_sh) + if (sv.sourceFilesList.size() != 1 || sv.sourceFilesList[0] != shc::config().singleCompilationShName) { - sh_debug(SHLOG_ERROR, "unknown source '%s', available are:", compile_only_sh); + sh_debug(SHLOG_ERROR, "unknown source '%s', available are:", shc::config().singleCompilationShName); int linesForStdout = min(100ul, sv.sourceFilesList.size()); for (int i = 0; i < linesForStdout; i++) @@ -462,9 +380,9 @@ static void compile(Tab &source_files, const char *fn, const char *bindu } } - if (intermediate_dir) + if (shc::config().intermediateDir) { - sv.intermediateDir = intermediate_dir; + sv.intermediateDir = shc::config().intermediateDir; } else { @@ -475,32 +393,32 @@ static void compile(Tab &source_files, const char *fn, const char *bindu sv.intermediateDir = intermediateDir; } String additionalDirStr; - additionalDirStr.aprintf(0, "-O%d", hlslOptimizationLevel); - if (hlslDebugLevel == DebugLevel::BASIC) + additionalDirStr.aprintf(0, "-O%d", shc::config().hlslOptimizationLevel); + if (shc::config().hlslDebugLevel == DebugLevel::BASIC) additionalDirStr += "D"; - else if (hlslDebugLevel == DebugLevel::FULL_DEBUG_INFO) + else if (shc::config().hlslDebugLevel == DebugLevel::FULL_DEBUG_INFO) additionalDirStr += "DFULL"; - else if (hlslDebugLevel == DebugLevel::AFTERMATH) + else if (shc::config().hlslDebugLevel == DebugLevel::AFTERMATH) additionalDirStr += "DAFTERMATH"; - if (isDebugModeEnabled) + if (shc::config().isDebugModeEnabled) additionalDirStr += "-debug"; - if (hlslEmbedSource) + if (shc::config().hlslEmbedSource) additionalDirStr += "-embed_src"; #if _CROSS_TARGET_SPIRV || _CROSS_TARGET_METAL - if (enableBindless) + if (shc::config().enableBindless) additionalDirStr += "-bindless"; #endif - if (autotest_mode) + if (shc::config().autotestMode) additionalDirStr += "-autotest"; sv.intermediateDir += additionalDirStr; dd_mkdir(sv.intermediateDir); - SNPRINTF(sha1_cache_dir_buf, sizeof(sha1_cache_dir_buf), "%s/../../shaders_sha~%s%s", sv.intermediateDir.c_str(), cross_compiler, - additionalDirStr.c_str()); - sha1_cache_dir = sha1_cache_dir_buf; - if (purge_sha1) + SNPRINTF(sha1_cache_dir_buf, sizeof(sha1_cache_dir_buf), "%s/../../shaders_sha~%s%s", sv.intermediateDir.c_str(), + shc::config().crossCompiler, additionalDirStr.c_str()); + config_rw.sha1CacheDir = sha1_cache_dir_buf; + if (shc::config().purgeSha1) { - debug("purging cache %s: %s", sha1_cache_dir, remove_recursive(sha1_cache_dir) ? "success" : "error"); + debug("purging cache %s: %s", shc::config().sha1CacheDir, remove_recursive(shc::config().sha1CacheDir) ? "success" : "error"); } sv.dest = String(0, "%s/%s", sv.intermediateDir, sv.dest); debug("dest: %s", sv.dest); @@ -520,7 +438,7 @@ static void compile(Tab &source_files, const char *fn, const char *bindu blk.removeParam("outMiniDumpName"); blk.removeParam("packBin"); blk.removeParam("packShGroups"); - if (addTextureType) + if (shc::config().addTextureType) blk.addBool("addTextureType", true); blk.saveToTextStream(*hasher); get_computed_hash(hasher, blkHash.data(), blkHash.size()); @@ -551,32 +469,34 @@ static void compile(Tab &source_files, const char *fn, const char *bindu if (isBlkChanged) { sh_debug(SHLOG_INFO, "'%s' changed. '%s' should be deleted to force rebuild", blk_file_name, (const char *)sv.intermediateDir); - forceRebuild = true; + config_rw.forceRebuild = true; } - if (forceRebuild && shc::relinkOnly) + if (shc::config().forceRebuild && shc::config().relinkOnly) { if (isBlkChanged) { - sh_debug(SHLOG_FATAL, "need to recompile %s but compilation is denied by -relinkOnly", compile_only_sh ? compile_only_sh : ""); + sh_debug(SHLOG_FATAL, "need to recompile %s but compilation is denied by -relinkOnly", + shc::config().singleCompilationShName ? shc::config().singleCompilationShName : ""); return; } else // caused by -r flag: -relinkOnly reduces -r to -forceRelink { - forceRebuild = false; - forceRelink = true; + config_rw.forceRebuild = false; + config_rw.forceRelink = true; sh_debug(SHLOG_NORMAL, "[WARNING] -r flag was reduced to -forceRelink because -relinkOnly was specified"); } } - if (forceRelink && compile_only_sh) + if (shc::config().forceRelink && shc::config().singleCompilationShName) { sh_debug(SHLOG_FATAL, "trying to compile single shader %s but relinking is enforced with -forceRelink or -r and -relinkOnly combination", - compile_only_sh); + shc::config().singleCompilationShName); return; } - if (forceRelink && noSave) + if (shc::config().forceRelink && shc::config().noSave) { - sh_debug(SHLOG_FATAL, "need to relink shaders but -nosave flag enforces no save or linkage", compile_only_sh); + sh_debug(SHLOG_FATAL, "need to relink shaders but -nosave flag enforces no save or linkage", + shc::config().singleCompilationShName); return; } @@ -586,15 +506,15 @@ static void compile(Tab &source_files, const char *fn, const char *bindu char bindump_fn[260]; char stcode_lib_path[260]; #if _CROSS_TARGET_SPIRV || _CROSS_TARGET_METAL - if (enableBindless) + if (shc::config().enableBindless) { - _snprintf(bindump_fn, 260, "%s.bindless.%s%s.shdump.bin", bindump_fnprefix, verStr, autotest_mode ? ".autotest" : ""); + _snprintf(bindump_fn, 260, "%s.bindless.%s%s.shdump.bin", bindump_fnprefix, verStr, shc::config().autotestMode ? ".autotest" : ""); _snprintf(stcode_lib_path, 260, "%s.bindless.%s-stcode", bindump_fnprefix, verStr); } else #endif { - _snprintf(bindump_fn, 260, "%s.%s%s.shdump.bin", bindump_fnprefix, verStr, autotest_mode ? ".autotest" : ""); + _snprintf(bindump_fn, 260, "%s.%s%s.shdump.bin", bindump_fnprefix, verStr, shc::config().autotestMode ? ".autotest" : ""); _snprintf(stcode_lib_path, 260, "%s.%s-stcode", bindump_fnprefix, verStr); } @@ -625,28 +545,27 @@ static void compile(Tab &source_files, const char *fn, const char *bindu #elif _CROSS_TARGET_DX12 - if (!noSave) + if (!shc::config().noSave) { String pdb(260, "%s_pdb/", destDir[0] ? bindump_fnprefix : "./"); - dd_mkdir(pdb); static wchar_t dx12_pdb_cache_dir_storage[260]; mbstowcs(dx12_pdb_cache_dir_storage, pdb, 260); - dx12_pdb_cache_dir = dx12_pdb_cache_dir_storage; + config_rw.dx12PdbCacheDir = dx12_pdb_cache_dir_storage; } #endif } prepare_stcode_directory(sv.intermediateDir); - CompilerAction compAction = forceRebuild ? CompilerAction::COMPILE_AND_LINK : shc::should_recompile(sv); - if (compile_only_sh) + CompilerAction compAction = shc::config().forceRebuild ? CompilerAction::COMPILE_AND_LINK : shc::should_recompile(sv); + if (shc::config().singleCompilationShName) { if (compAction == CompilerAction::COMPILE_AND_LINK) compAction = CompilerAction::COMPILE_ONLY; else if (compAction == CompilerAction::LINK_ONLY) compAction = CompilerAction::NOTHING; } - else if (forceRelink) + else if (shc::config().forceRelink) { if (compAction == CompilerAction::NOTHING) compAction = CompilerAction::LINK_ONLY; @@ -656,7 +575,7 @@ static void compile(Tab &source_files, const char *fn, const char *bindu if (compAction != CompilerAction::NOTHING) { - if (shortMessages && !compile_only_sh) + if (shc::config().shortMessages && !shc::config().singleCompilationShName) ATOMIC_PRINTF_IMM("[INFO] Building '%s'...\n", (char *)sv.dest); if (proc::is_multiproc()) { @@ -665,34 +584,36 @@ static void compile(Tab &source_files, const char *fn, const char *bindu if (compileResult) { - forceRebuild = false; + config_rw.forceRebuild = false; if (compAction == CompilerAction::COMPILE_AND_LINK) compAction = CompilerAction::LINK_ONLY; else if (compAction == CompilerAction::COMPILE_ONLY) compAction = CompilerAction::NOTHING; } } - shc::compileShader(sv, noSave, forceRebuild, compAction); - if (!suppressLogs) - ShaderCompilerStat::printReport((proc::is_multiproc() || compile_only_sh) ? NULL : (log_dir ? log_dir : cfg_dir)); + shc::compileShader(sv, shc::config().noSave, shc::config().forceRebuild, compAction); + if (!shc::config().suppressLogs) + ShaderCompilerStat::printReport((proc::is_multiproc() || shc::config().singleCompilationShName) + ? nullptr + : (shc::config().logDir ? shc::config().logDir : cfg_dir)); } else { sh_debug(SHLOG_INFO, "Skipping up-to-date '%s'", (char *)sv.dest); } shc::resetCompiler(); - if (compile_only_sh) + if (shc::config().singleCompilationShName) return; if (strcmp(bindump_fnprefix, "*") != 0) { dd_mkpath(bindump_fn); - shc::buildShaderBinDump(bindump_fn, sv.dest, forceRebuild, false, packing_flags); + shc::buildShaderBinDump(bindump_fn, sv.dest, shc::config().forceRebuild, false, packing_flags); } if (binminidump_fnprefix) { - _snprintf(bindump_fn, 260, "%s.%s%s.shdump.bin", binminidump_fnprefix, verStr, autotest_mode ? ".autotest" : ""); + _snprintf(bindump_fn, 260, "%s.%s%s.shdump.bin", binminidump_fnprefix, verStr, shc::config().autotestMode ? ".autotest" : ""); dd_mkpath(bindump_fn); shc::buildShaderBinDump(bindump_fn, sv.dest, dd_stricmp(binminidump_fnprefix, bindump_fnprefix) == 0, true, packing_flags); } @@ -772,7 +693,6 @@ static String makeShBinDumpName(const char *filename) return dump_fn; } -static eastl::vector dsc_include_paths; #define USE_FAST_INC_LOOKUP (__cplusplus >= 201703L) #if _TARGET_PC_MACOSX && MAC_OS_X_VERSION_MIN_REQUIRED < 101500 // macOS SDK < 10.15 #undef USE_FAST_INC_LOOKUP @@ -783,8 +703,7 @@ static eastl::vector dsc_include_paths; #include #include namespace fs = std::filesystem; -static ska::flat_hash_map file_to_full_path; // use power_of_two strategy, because we have good enough - // hashes for strings + inline eastl::string convert_dir_separator(const char *s_) { eastl::string s = s_; @@ -792,9 +711,9 @@ inline eastl::string convert_dir_separator(const char *s_) return s; } #endif -void add_include_path(const char *d) +void add_include_path(const char *d, shc::CompilerConfig &config_rw) { - dsc_include_paths.emplace_back(String(d)); + config_rw.dscIncludePaths.emplace_back(String(d)); #if USE_FAST_INC_LOOKUP G_ASSERT(d); fs::path dirPath(d); @@ -813,9 +732,9 @@ void add_include_path(const char *d) continue; eastl::string fn = convert_dir_separator(p.path().lexically_relative(dirPath).string().c_str()); // printf("%s: %s\n", d, fn.c_str()); - if (file_to_full_path.find(fn) == file_to_full_path.end()) + if (config_rw.fileToFullPath.find(fn) == config_rw.fileToFullPath.end()) { - file_to_full_path[fn] = (dir + "/") + fn; + config_rw.fileToFullPath[fn] = (dir + "/") + fn; } } #endif @@ -827,22 +746,22 @@ String shc::search_include_with_pathes(const char *fn) // we can save mem alloca // String s; if (strstr(fn, "\\")) { - auto it = file_to_full_path.find(convert_dir_separator(fn)); - if (it != file_to_full_path.end()) + auto it = shc::config().fileToFullPath.find(convert_dir_separator(fn)); + if (it != shc::config().fileToFullPath.end()) return String(it->second.c_str()); } else { - auto it = file_to_full_path.find_as(fn); - if (it != file_to_full_path.end()) + auto it = shc::config().fileToFullPath.find_as(fn); + if (it != shc::config().fileToFullPath.end()) return String(it->second.c_str()); } return String(fn); #else char buf[2048]; - for (int i = 0, e = (int)dsc_include_paths.size(); i < e; i++) + for (int i = 0, e = (int)shc::config().dscIncludePaths.size(); i < e; i++) { - SNPRINTF(buf, sizeof(buf), "%s/%s", dsc_include_paths[i].c_str(), fn); + SNPRINTF(buf, sizeof(buf), "%s/%s", shc::config().dscIncludePaths[i].c_str(), fn); if (dd_file_exist(buf)) return String(buf); // dd_simplify_fname_c(s); @@ -904,11 +823,11 @@ static void enable_breakpad() { breakpad::Product p; p.name = "ShaderCompiler"; - p.version = shader_compiler_version; + p.version = shc::config().version; breakpad::Configuration cfg; cfg.userAgent = "SC"; - if (suppressLogs) + if (shc::config().suppressLogs) cfg.dumpPath = "ShaderCrashDumps"; breakpad::init(eastl::move(p), eastl::move(cfg)); @@ -969,8 +888,8 @@ void ctrl_break_handler(int) } setvbuf(stdout, NULL, _IOLBF, 4096); - if (compile_only_sh) - ATOMIC_PRINTF_IMM("Cancelling compilation (%s)...\n", compile_only_sh); + if (shc::config().singleCompilationShName) + ATOMIC_PRINTF_IMM("Cancelling compilation (%s)...\n", shc::config().singleCompilationShName); else ATOMIC_PRINTF_IMM("Cancelling compilation (%d processes)...\n", proc::max_proc_count()); debug("SIGINT received!\n"); @@ -1038,10 +957,7 @@ int DagorWinMain(bool debugmode) return 0; } - // G_VERIFY(shaderopcode::formatUnittest()); - - bool singleBuild = false; - ShHardwareOptions singleOptions(4.0_sm); + shc::CompilerConfig &globalConfigRW = shc::acquire_rw_config(); const char *filename = __argv[1]; @@ -1049,25 +965,20 @@ int DagorWinMain(bool debugmode) if (strstr(filename, ".dshl") || strstr(filename, ".sh") || strstr(filename, ".SH")) { // this is a single shader file - singleBuild = true; + globalConfigRW.singleBuild = true; } - const char *outDumpNameConfig = NULL; - bool enableFp16 = false; - bool saveDumpOnCrash = false; - unsigned numProcesses = -1; - unsigned numWorkers = 0; - + bool shouldCancelRunningProcsOnFail = true; for (int i = 2; i < __argc; i++) { const char *s = __argv[i]; if (dd_stricmp(s, "-r") == 0) - forceRebuild = true; + globalConfigRW.forceRebuild = true; else if (dd_stricmp(s, "-depBlk") == 0) ; // no-op else if (dd_stricmp(s, "-q") == 0) { - shortMessages = true; - hlslNoDisassembly = true; + globalConfigRW.shortMessages = true; + globalConfigRW.hlslNoDisassembly = true; sh_console_quet_output(true); } else if (dd_stricmp(s, "-out") == 0) @@ -1075,73 +986,75 @@ int DagorWinMain(bool debugmode) i++; if (i >= __argc) goto usage_err; - outDumpNameConfig = __argv[i]; + globalConfigRW.outDumpNameConfig = __argv[i]; } else if (strnicmp(s, "-j", 2) == 0) - numWorkers = atoi(s + 2); + globalConfigRW.numWorkers = atoi(s + 2); else if (stricmp(s, "-relinkOnly") == 0) - shc::relinkOnly = true; + globalConfigRW.relinkOnly = true; else if (stricmp(s, "-forceRelink") == 0) - forceRelink = true; + globalConfigRW.forceRelink = true; else if (dd_stricmp(s, "-nosave") == 0) - noSave = true; + globalConfigRW.noSave = true; else if (dd_stricmp(s, "-debug") == 0) - isDebugModeEnabled = true; + globalConfigRW.isDebugModeEnabled = true; else if (dd_stricmp(s, "-pdb") == 0) - hlslDebugLevel = DebugLevel::BASIC; + globalConfigRW.hlslDebugLevel = DebugLevel::BASIC; else if (dd_stricmp(s, "-dfull") == 0 || dd_stricmp(s, "-debugfull") == 0) - hlslDebugLevel = DebugLevel::FULL_DEBUG_INFO; + globalConfigRW.hlslDebugLevel = DebugLevel::FULL_DEBUG_INFO; else if (dd_stricmp(s, "-embed_source") == 0) - hlslEmbedSource = true; + globalConfigRW.hlslEmbedSource = true; else if (dd_stricmp(s, "-daftermath") == 0) - hlslDebugLevel = DebugLevel::AFTERMATH; + globalConfigRW.hlslDebugLevel = DebugLevel::AFTERMATH; else if (dd_stricmp(s, "-commentPP") == 0) - hlslSavePPAsComments = true; + globalConfigRW.hlslSavePPAsComments = true; else if (dd_stricmp(s, "-codeDump") == 0) - hlslDumpCodeAlways = true; + globalConfigRW.hlslDumpCodeAlways = true; + else if (dd_stricmp(s, "-codeDumpSep") == 0) + globalConfigRW.hlslDumpCodeAlways = globalConfigRW.hlslDumpCodeSeparate = true; else if (dd_stricmp(s, "-codeDumpErr") == 0) - hlslDumpCodeOnError = true; + globalConfigRW.hlslDumpCodeOnError = true; else if (dd_stricmp(s, "-validateIdenticalBytecode") == 0) - validateIdenticalBytecode = true; + globalConfigRW.validateIdenticalBytecode = true; else if (dd_stricmp(s, "-w") == 0) { - hlslShowWarnings = true; + globalConfigRW.hlslShowWarnings = true; sh_console_print_warnings(true); } else if (dd_stricmp(s, "-O0") == 0) - hlslOptimizationLevel = 0; + globalConfigRW.hlslOptimizationLevel = 0; else if (dd_stricmp(s, "-O1") == 0) - hlslOptimizationLevel = 1; + globalConfigRW.hlslOptimizationLevel = 1; else if (dd_stricmp(s, "-O2") == 0) - hlslOptimizationLevel = 2; + globalConfigRW.hlslOptimizationLevel = 2; else if (dd_stricmp(s, "-O3") == 0) - hlslOptimizationLevel = 3; + globalConfigRW.hlslOptimizationLevel = 3; else if (dd_stricmp(s, "-O4") == 0) - hlslOptimizationLevel = 4; + globalConfigRW.hlslOptimizationLevel = 4; else if (dd_stricmp(s, "-maxVSF") == 0) { i++; if (i >= __argc) goto usage_err; - hlsl_maximum_vsf_allowed = atoi(__argv[i]); + globalConfigRW.hlslMaximumVsfAllowed = atoi(__argv[i]); } else if (dd_stricmp(s, "-maxPSF") == 0) { i++; if (i >= __argc) goto usage_err; - hlsl_maximum_psf_allowed = atoi(__argv[i]); + globalConfigRW.hlslMaximumPsfAllowed = atoi(__argv[i]); } else if (dd_stricmp(s, "-skipvalidation") == 0) { - hlslSkipValidation = true; + globalConfigRW.hlslSkipValidation = true; } else if (dd_stricmp(s, "-nodisassembly") == 0) - hlslNoDisassembly = true; + globalConfigRW.hlslNoDisassembly = true; else if (dd_stricmp(s, "-shaderOn") == 0) shc::setRequiredShadersDef(true); else if (dd_stricmp(s, "-supressLogs") == 0 || dd_stricmp(s, "-suppressLogs") == 0) - suppressLogs = true; + globalConfigRW.suppressLogs = true; else if (dd_stricmp(s, "-shadervar-generator-mode") == 0) { using namespace std::string_view_literals; @@ -1149,13 +1062,13 @@ int DagorWinMain(bool debugmode) if (i >= __argc) goto usage_err; if (__argv[i] == "none"sv) - shadervar_generator_mode = ShadervarGeneratorMode::None; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::None; else if (__argv[i] == "remove"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Remove; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Remove; else if (__argv[i] == "check"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Check; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Check; else if (__argv[i] == "generate"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Generate; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Generate; else printf("\n[WARNING] Unknown shadervar generator mode '%s'\n", __argv[i]); } @@ -1163,64 +1076,63 @@ int DagorWinMain(bool debugmode) shc::setInvalidAsNullDef(true); else if (dd_stricmp(s, "-no_sha1_cache") == 0) { - extern bool useSha1Cache, writeSha1Cache; - useSha1Cache = writeSha1Cache = false; + globalConfigRW.useSha1Cache = globalConfigRW.writeSha1Cache = false; } else if (dd_stricmp(s, "-no_compression") == 0) { - useCompression = false; + globalConfigRW.useCompression = false; } else if (dd_stricmp(s, "-addTextureType") == 0) { - addTextureType = true; + globalConfigRW.addTextureType = true; } else if (dd_stricmp(s, "-purge_sha1_cache") == 0) { - purge_sha1 = true; + globalConfigRW.purgeSha1 = true; } #if _CROSS_TARGET_SPIRV || _CROSS_TARGET_METAL else if (strnicmp(s, "-enableBindless:", 15) == 0) { if (strstr(s, "on")) - enableBindless = true; + globalConfigRW.enableBindless = true; else if (strstr(s, "off")) - enableBindless = false; + globalConfigRW.enableBindless = false; } #endif #if _CROSS_TARGET_DX12 else if (0 == dd_stricmp(s, "-platform-pc")) { - targetPlatform = dx12::dxil::Platform::PC; - cross_compiler = "dx12"; + globalConfigRW.targetPlatform = dx12::dxil::Platform::PC; + globalConfigRW.crossCompiler = "dx12"; } else if (0 == dd_stricmp(s, "-platform-xbox-one")) { - targetPlatform = dx12::dxil::Platform::XBOX_ONE; - cross_compiler = "xbox_one_dx12"; + globalConfigRW.targetPlatform = dx12::dxil::Platform::XBOX_ONE; + globalConfigRW.crossCompiler = "xbox_one_dx12"; } else if (0 == dd_stricmp(s, "-platform-xbox-scarlett")) { - targetPlatform = dx12::dxil::Platform::XBOX_SCARLETT; - cross_compiler = "scarlett_dx12"; + globalConfigRW.targetPlatform = dx12::dxil::Platform::XBOX_SCARLETT; + globalConfigRW.crossCompiler = "scarlett_dx12"; } else if (0 == dd_stricmp(s, "-HLSL2021")) { - hlsl2021 = true; + globalConfigRW.hlsl2021 = true; } else if (0 == dd_stricmp(s, "-enablefp16")) { - enableFp16 = true; + globalConfigRW.enableFp16 = true; } else if (0 == dd_stricmp(s, "-autotestMode")) { - autotest_mode = true; + globalConfigRW.autotestMode = true; } #endif #if _CROSS_TARGET_SPIRV else if (dd_stricmp(s, "-compiler-hlslcc") == 0) - compilerHlslCc = true; + globalConfigRW.compilerHlslCc = true; else if (dd_stricmp(s, "-compiler-dxc") == 0) - compilerDXC = true; + globalConfigRW.compilerDXC = true; #endif #if _CROSS_TARGET_C1 | _CROSS_TARGET_C2 @@ -1229,19 +1141,19 @@ int DagorWinMain(bool debugmode) #ifdef _CROSS_TARGET_METAL else if (dd_stricmp(s, "-metalios") == 0) { - use_ios_token = true; - cross_compiler = "metal-ios"; + globalConfigRW.useIosToken = true; + globalConfigRW.crossCompiler = "metal-ios"; } else if (dd_stricmp(s, "-metal-glslang") == 0) ; else if (dd_stricmp(s, "-metal-use-glslang") == 0) { - use_metal_glslang = true; + globalConfigRW.useMetalGlslang = true; } else if (dd_stricmp(s, "-metal-binary") == 0) { - use_binary_msl = true; - cross_compiler = "metal-binary"; + globalConfigRW.useBinaryMsl = true; + globalConfigRW.crossCompiler = "metal-binary"; } #endif #if _CROSS_TARGET_METAL || _CROSS_TARGET_SPIRV @@ -1257,29 +1169,29 @@ int DagorWinMain(bool debugmode) else if (dd_stricmp(s, "-wx") == 0) { sh_change_mode(SHLOG_WARNING, SHLOG_ERROR); - hlslWarningsAsErrors = true; + globalConfigRW.hlslWarningsAsErrors = true; } else if (dd_stricmp(s, "-wall") == 0) { sh_change_mode(SHLOG_SILENT_WARNING, SHLOG_WARNING); - hlslShowWarnings = true; + globalConfigRW.hlslShowWarnings = true; sh_console_print_warnings(true); } else if (strnicmp(s, "-fsh:", 5) == 0) { if (strstr(s, ":3.0")) - singleOptions.fshVersion = 3.0_sm; + globalConfigRW.singleOptions.fshVersion = 3.0_sm; #if _CROSS_TARGET_DX11 || _CROSS_TARGET_SPIRV || _CROSS_TARGET_METAL | _CROSS_TARGET_EMPTY else if (strstr(s, ":4.0")) - singleOptions.fshVersion = 4.0_sm; + globalConfigRW.singleOptions.fshVersion = 4.0_sm; else if (strstr(s, ":4.1")) - singleOptions.fshVersion = 4.1_sm; + globalConfigRW.singleOptions.fshVersion = 4.1_sm; else if (strstr(s, ":5.0")) - singleOptions.fshVersion = 5.0_sm; + globalConfigRW.singleOptions.fshVersion = 5.0_sm; else if (strstr(s, ":6.0")) - singleOptions.fshVersion = 6.0_sm; + globalConfigRW.singleOptions.fshVersion = 6.0_sm; else if (strstr(s, ":6.6")) - singleOptions.fshVersion = 6.6_sm; + globalConfigRW.singleOptions.fshVersion = 6.6_sm; #endif else { @@ -1300,24 +1212,26 @@ int DagorWinMain(bool debugmode) i++; if (i >= __argc) goto usage_err; - intermediate_dir = __argv[i]; + globalConfigRW.intermediateDir = __argv[i]; } else if (dd_stricmp(s, "-logdir") == 0) { i++; if (i >= __argc) goto usage_err; - log_dir = __argv[i]; + globalConfigRW.logDir = __argv[i]; } else if (dd_stricmp(s, "-c") == 0) { i++; if (i >= __argc) goto usage_err; - compile_only_sh = __argv[i]; + globalConfigRW.singleCompilationShName = __argv[i]; } + else if (stricmp(s, "-cjWait") == 0) + shouldCancelRunningProcsOnFail = false; else if (strnicmp(s, "-cj", 3) == 0) - numProcesses = strlen(s) > 3 ? atoi(s + 3) : -1; + globalConfigRW.numProcesses = strlen(s) > 3 ? atoi(s + 3) : -1; else if (dd_stricmp(s, "-belownormal") == 0) { #if _TARGET_PC_WIN @@ -1329,54 +1243,54 @@ int DagorWinMain(bool debugmode) i += 2; if (i >= __argc) goto usage_err; - hlsl_defines.aprintf(128, "#define %s %s\n", __argv[i - 1], __argv[i]); + globalConfigRW.hlslDefines.aprintf(128, "#define %s %s\n", __argv[i - 1], __argv[i]); } else if (dd_stricmp(s, "-optionalAsBranches") == 0) { - optionalIntervalsAsBranches = true; + globalConfigRW.optionalIntervalsAsBranches = true; } else if (dd_stricmp(s, "-logExactTiming") == 0) { - logExactCompilationTimes = true; + globalConfigRW.logExactCompilationTimes = true; } else if (dd_stricmp(s, "-perFileAllLogs") == 0) { - logFullPerFileCompilationStats = true; + globalConfigRW.logFullPerFileCompilationStats = true; } else if (strnicmp("-addpath:", __argv[i], 9) == 0) ; // skip else if (dd_stricmp(s, "-saveDumpOnCrash") == 0) { - saveDumpOnCrash = true; + globalConfigRW.saveDumpOnCrash = true; } else if (strnicmp("-useCpujobsBackend", __argv[i], 18) == 0) { - shc::use_threadpool = false; + globalConfigRW.useThreadpool = false; } else if (strnicmp("-cppStcode", __argv[i], 11) == 0) { - compile_cpp_stcode = true; + globalConfigRW.compileCppStcode = true; } else if (strnicmp("-cppUnityBuild", __argv[i], 15) == 0) { - cpp_stcode_unity_build = true; + globalConfigRW.cppStcodeUnityBuild = true; } else if (strnicmp("-cppStcodeArch", s, 15) == 0) { ++i; if (i >= __argc) goto usage_err; - if (!set_stcode_arch_from_arg(__argv[i])) + if (!set_stcode_arch_from_arg(__argv[i], globalConfigRW)) goto usage_err; } #if _CROSS_TARGET_DX12 else if (dd_stricmp(s, "-localTimestamp") == 0) { - use_git_timestamps = false; + globalConfigRW.useGitTimestamps = false; } #endif else if (dd_stricmp(s, "-noHlslHardcodedRegs") == 0) - ShaderParser::disallow_hlsl_hardcoded_regs = true; + globalConfigRW.disallowHlslHardcodedRegs = true; else { usage_err: @@ -1388,34 +1302,33 @@ int DagorWinMain(bool debugmode) } #if HAVE_BREAKPAD_BINDER - if (saveDumpOnCrash) + if (shc::config().saveDumpOnCrash) { dgs_fatal_handler = fatal_handler; enable_breakpad(); } #endif - extern bool useSha1Cache; - useSha1Cache &= (hlslDebugLevel == DebugLevel::NONE) && hlslNoDisassembly; - if (compile_only_sh) - numProcesses = 0; + globalConfigRW.useSha1Cache &= (shc::config().hlslDebugLevel == DebugLevel::NONE) && shc::config().hlslNoDisassembly; + if (shc::config().singleCompilationShName) + globalConfigRW.numProcesses = 0; else - printf("hlslOptimizationLevel is set to %d\n", hlslOptimizationLevel); + printf("hlslOptimizationLevel is set to %d\n", shc::config().hlslOptimizationLevel); #if _CROSS_TARGET_EMPTY noSave = true; #endif - if (!shortMessages && !compile_only_sh) + if (!shc::config().shortMessages && !shc::config().singleCompilationShName) show_header(); - shc::init_jobs(numWorkers); + shc::init_jobs(shc::config().numWorkers); DEFER(shc::deinit_jobs()); - proc::init(numProcesses); + proc::init(shc::config().numProcesses, shouldCancelRunningProcsOnFail); DEFER(proc::deinit()); - if (compile_only_sh || proc::is_multiproc()) + if (shc::config().singleCompilationShName || proc::is_multiproc()) setvbuf(stdout, NULL, _IOFBF, 4096); ErrorCounter::allCompilations().reset(); @@ -1428,18 +1341,18 @@ int DagorWinMain(bool debugmode) ShaderParser::renderStageToIdxMap.addNameId("decal"); ShaderParser::renderStageToIdxMap.addNameId("trans"); ShaderParser::renderStageToIdxMap.addNameId("distortion"); - if (singleBuild) + if (shc::config().singleBuild) { // compile single file ShaderCompilerStat::reset(); Tab sourceFiles(midmem); sourceFiles.push_back(String(filename)); - compile(sourceFiles, filename, makeShBinDumpName(filename), singleOptions, NULL, getDir(filename), NULL, - BindumpPackingFlagsBits::NONE); + compile(sourceFiles, filename, makeShBinDumpName(filename), shc::config().singleOptions, NULL, getDir(filename), NULL, + BindumpPackingFlagsBits::NONE, globalConfigRW); } else { - if (compile_only_sh || proc::is_multiproc()) + if (shc::config().singleCompilationShName || proc::is_multiproc()) AtomicPrintfMutex::init(dd_get_fname(__argv[0]), filename); // read data block with files @@ -1464,7 +1377,7 @@ int DagorWinMain(bool debugmode) printf("\n[FATAL ERROR] duplicate stage <%s> in renderStages{} in <%s> ?\n", b->getStr(i), filename); return 13; } - if (!compile_only_sh) + if (!shc::config().singleCompilationShName) sh_debug(SHLOG_NORMAL, "[info] render_stage \"%s\"=%d", b->getStr(i), ShaderParser::renderStageToIdxMap.getNameId(b->getStr(i))); } @@ -1494,15 +1407,15 @@ int DagorWinMain(bool debugmode) if (dd_dir_exists(folder.c_str())) { add_shaders_inc_base(folder.c_str()); - add_include_path(folder.c_str()); - if (!compile_only_sh) + add_include_path(folder.c_str(), globalConfigRW); + if (!shc::config().singleCompilationShName) sh_debug(SHLOG_INFO, "Using include dir: %s", folder.c_str()); } } } - if (outDumpNameConfig) - blk.setStr("outDumpName", outDumpNameConfig); + if (shc::config().outDumpNameConfig) + blk.setStr("outDumpName", shc::config().outDumpNameConfig); String defShBindDumpPrefix(makeShBinDumpName(filename)); if (blk.getStr("outDumpName", NULL)) defShBindDumpPrefix = blk.getStr("outDumpName", NULL); @@ -1510,7 +1423,7 @@ int DagorWinMain(bool debugmode) Tab sourceFiles(midmem); DataBlock *sourceBlk = blk.getBlockByName("source"); const char *shader_root = blk.getStr("shader_root_dir", NULL); - shaderSrcRoot = shader_root; + globalConfigRW.shaderSrcRoot = shader_root; if (!sourceBlk) { printf("Shader source files should be copied from shaders.sh\n" @@ -1533,7 +1446,7 @@ int DagorWinMain(bool debugmode) sourceFiles.push_back(String(sourceBlk->getStr(paramNo))); } else if (sourceBlk->getParamNameId(paramNo) == includePathId) - add_include_path(sourceBlk->getStr(paramNo)); + add_include_path(sourceBlk->getStr(paramNo), globalConfigRW); } } fflush(stdout); @@ -1570,7 +1483,7 @@ int DagorWinMain(bool debugmode) blk_cvv = NULL; if (blk_svg) { - shadervars_code_template_filename = blk_svg->getStr("code_template"); + globalConfigRW.shadervarsCodeTemplateFilename = blk_svg->getStr("code_template"); for (int b = blk_svg->findBlock("generated_path"); b != -1; b = blk_svg->findBlock("generated_path", b)) { DataBlock *blk_gp = blk_svg->getBlock(b); @@ -1579,26 +1492,26 @@ int DagorWinMain(bool debugmode) printf("\n[ERROR] Couldn't get block 'generated_path[%i]'\n", b); continue; } - auto &info = generated_path_infos.emplace_back(); + auto &info = globalConfigRW.generatedPathInfos.emplace_back(); info.matcher = blk_gp->getStr("matcher"); info.replacer = blk_gp->getStr("replacer"); } for (int p = blk_svg->findParam("exclude"); p != -1; p = blk_svg->findParam("exclude", p)) - exclude_from_generation.emplace_back(blk_svg->getStr(p)); + globalConfigRW.excludeFromGeneration.emplace_back(blk_svg->getStr(p)); - if (shadervar_generator_mode == ShadervarGeneratorMode::None) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::None) { using namespace std::string_view_literals; const char *mode = blk_svg->getStr("mode", "none"); if (mode == "none"sv) - shadervar_generator_mode = ShadervarGeneratorMode::None; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::None; else if (mode == "remove"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Remove; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Remove; else if (mode == "check"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Check; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Check; else if (mode == "generate"sv) - shadervar_generator_mode = ShadervarGeneratorMode::Generate; + globalConfigRW.shadervarGeneratorMode = ShadervarGeneratorMode::Generate; else printf("\n[WARNING] Unknown shadervar generator mode '%s'\n", mode); } @@ -1621,8 +1534,8 @@ int DagorWinMain(bool debugmode) if (fName[0] == '\\' || fName[0] == '/') fName = cfgDir + fName; - dictionary_size_in_kb = comp->getInt("dict_size_in_kb", dictionary_size_in_kb); - sh_group_size_in_kb = comp->getInt("group_size_in_kb", sh_group_size_in_kb); + globalConfigRW.dictionarySizeInKb = comp->getInt("dict_size_in_kb", shc::config().dictionarySizeInKb); + globalConfigRW.shGroupSizeInKb = comp->getInt("group_size_in_kb", shc::config().shGroupSizeInKb); ShHardwareOptions opt(4.0_sm); @@ -1655,7 +1568,7 @@ int DagorWinMain(bool debugmode) return 13; } } - opt.enableHalfProfile = comp->getBool("enableHalfProfile", true) || enableFp16; + opt.enableHalfProfile = comp->getBool("enableHalfProfile", true) || shc::config().enableFp16; DataBlock *blk_av = comp->getBlockByName("assume_vars"); DataBlock *blk_rs = comp->getBlockByName("required_shaders"); @@ -1709,7 +1622,7 @@ int DagorWinMain(bool debugmode) ShaderCompilerStat::reset(); BindumpPackingFlags packingFlags = 0; - if (useCompression) + if (shc::config().useCompression) { if (blk.getBool("packShGroups", true)) // Pack groups by default packingFlags |= BindumpPackingFlagsBits::SHADER_GROUPS; @@ -1717,32 +1630,32 @@ int DagorWinMain(bool debugmode) packingFlags |= BindumpPackingFlagsBits::WHOLE_BINARY; } compile(sourceFiles, fName, comp->getStr("outDumpName", defShBindDumpPrefix), opt, filename, getDir(filename), - blk.getStr("outMiniDumpName", NULL), packingFlags); + blk.getStr("outMiniDumpName", NULL), packingFlags, globalConfigRW); } } } - if (compile_only_sh) + if (shc::config().singleCompilationShName) { float timeSec = float(get_time_msec() - timeMsec) * 1e-3; int wholeSeconds = int(timeSec); String compCountMsg(""); - if (logFullPerFileCompilationStats) + if (shc::config().logFullPerFileCompilationStats) { int uniqueCompilationCount = ShaderCompilerStat::getUniqueCompilationCount(); compCountMsg.aprintf(64, " (%u compilation%s)", uniqueCompilationCount, uniqueCompilationCount == 1 ? "" : "s"); } - if (logFullPerFileCompilationStats || wholeSeconds > 5) + if (shc::config().logFullPerFileCompilationStats || wholeSeconds > 5) { - if (logExactCompilationTimes) - sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %.4gs%s", compile_only_sh, timeSec, compCountMsg); + if (shc::config().logExactCompilationTimes) + sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %.4gs%s", shc::config().singleCompilationShName, timeSec, compCountMsg); else { if (wholeSeconds > 60) - sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %dm:%02ds%s", compile_only_sh, wholeSeconds / 60, wholeSeconds % 60, - compCountMsg); + sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %dm:%02ds%s", shc::config().singleCompilationShName, wholeSeconds / 60, + wholeSeconds % 60, compCountMsg); else - sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %ds%s", compile_only_sh, wholeSeconds, compCountMsg); + sh_debug(SHLOG_NORMAL, "[INFO] done '%s' for %ds%s", shc::config().singleCompilationShName, wholeSeconds, compCountMsg); } } fflush(stdout); @@ -1755,7 +1668,7 @@ int DagorWinMain(bool debugmode) printf("\n"); float timeSec = float(get_time_msec() - timeMsec) * 1e-3; int wholeSeconds = int(timeSec); - if (logExactCompilationTimes && wholeSeconds > 1) + if (shc::config().logExactCompilationTimes && wholeSeconds > 1) printf("took %.4gs\n", timeSec); else { diff --git a/prog/tools/ShaderCompiler2/makeShBinDump.cpp b/prog/tools/ShaderCompiler2/makeShBinDump.cpp index dbd68f743..f1918aff4 100644 --- a/prog/tools/ShaderCompiler2/makeShBinDump.cpp +++ b/prog/tools/ShaderCompiler2/makeShBinDump.cpp @@ -10,6 +10,7 @@ #include "namedConst.h" #include "samplers.h" #include "shCompiler.h" +#include "globalConfig.h" #include "cppStcode.h" @@ -985,7 +986,7 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam // the compilation proc right after that. If then stcode is sorted again here, the remapping will be messed // up (runtime will be fetching wrong routines). However, if we move to cpp stcode completely, the sorting // won't make sense at all, so I do not think it is wise to accomodate this in the cpp stcode implementation. - bindumphlp::sortShaders(blocks, !compile_cpp_stcode); + bindumphlp::sortShaders(blocks, !shc::config().compileCppStcode); dag::Vector stcode_type(stCode.size()); // 1 - blk, 2 - shclass blk, 3 -- shclass for (int i = 0; i < blocks.size(); i++) @@ -1387,16 +1388,11 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam dag::Vector sh_ids; }; - extern size_t dictionary_size_in_kb; - extern size_t sh_group_size_in_kb; + const bool packGroups = (packing_flags & BindumpPackingFlagsBits::SHADER_GROUPS) && !shc::config().autotestMode; - extern bool autotest_mode; - - const bool packGroups = (packing_flags & BindumpPackingFlagsBits::SHADER_GROUPS) && !autotest_mode; - - const size_t dictSizeBytes = packGroups ? dictionary_size_in_kb << 10 : 0; + const size_t dictSizeBytes = packGroups ? shc::config().dictionarySizeInKb << 10 : 0; const bool needToTrainDict = dictSizeBytes > 0; - const size_t groupThresholdBytes = packGroups ? sh_group_size_in_kb << 10 : 0; + const size_t groupThresholdBytes = packGroups ? shc::config().shGroupSizeInKb << 10 : 0; const bool packEachShaderIntoSeparateGroup = groupThresholdBytes == 0; dag::Vector groups; @@ -1453,7 +1449,7 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam dag::Vector dict_buffer; dict_buffer.resize(dictSizeBytes); size_t dict_size = zstd_train_dict_buffer(make_span(dict_buffer), ZSTD_SH_CLEVEL, samples_buffer, samples_sizes); - debug("using dictionary %dK: trained from %d samples (%dK total size) to trained size=%dK (%d)", dictionary_size_in_kb, + debug("using dictionary %dK: trained from %d samples (%dK total size) to trained size=%dK (%d)", shc::config().dictionarySizeInKb, samples_sizes.size(), samples_total_size >> 10, dict_size >> 10, dict_size); dict_buffer.resize(dict_size); shaders_dump.dictionary = dict_buffer; @@ -1578,7 +1574,6 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam } // write shader classes - extern bool addTextureType; SharedStorage shInitCodeStorage; shaders_dump.classes.resize(dumpClasses.size()); shaders_dump.messagesByShclass.resize(dumpClasses.size()); @@ -1598,7 +1593,7 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam out_c.name = shaders_dump.shaderNameMap[out_c.nameId].getElementAddress(0); out_c.name.setCount(shaders_dump.shaderNameMap[out_c.nameId].size()); - if (addTextureType && !code.staticTextureTypesByCode.empty()) + if (shc::config().addTextureType && !code.staticTextureTypesByCode.empty()) out_c.staticTextureTypeBySlot = code.staticTextureTypesByCode.front(); shInitCodeStorage.getRef(out_c.initCode, shClass[i]->shInitCode.data(), shClass[i]->shInitCode.size(), 8); @@ -1609,7 +1604,7 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam } shaders_dump.shInitCodeStorage = eastl::move(shInitCodeStorage.getVecHolder()); - const bool packBin = (packing_flags & BindumpPackingFlagsBits::WHOLE_BINARY) && !autotest_mode; + const bool packBin = (packing_flags & BindumpPackingFlagsBits::WHOLE_BINARY) && !shc::config().autotestMode; const int compressedSize = shaders_dump_compressed.scriptedShadersBindumpCompressed.compress(shaders_dump, packBin ? ZSTD_SH_CLEVEL : -1); diff --git a/prog/tools/ShaderCompiler2/namedConst.cpp b/prog/tools/ShaderCompiler2/namedConst.cpp index e9e7cd0cc..e7cc4ffea 100644 --- a/prog/tools/ShaderCompiler2/namedConst.cpp +++ b/prog/tools/ShaderCompiler2/namedConst.cpp @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "namedConst.h" +#include "globalConfig.h" #include "shsyn.h" #include "shLog.h" #include "shsem.h" @@ -21,13 +22,11 @@ #if _CROSS_TARGET_DX12 #include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; #endif static constexpr const char *EMPTY_BLOCK_NAME = "__empty_block__"; static String tmpDigest; -extern bool enableBindless; const char *NamedConstBlock::nameSpaceToStr(NamedConstSpace name_space) { @@ -584,9 +583,6 @@ struct SamplerState SamplerState(const char *tname, int rIdx) : name(tname), regIdx(rIdx) {} }; -extern int hlsl_maximum_vsf_allowed; -extern int hlsl_maximum_psf_allowed; - static bool shall_remove_ns(NamedConstSpace ns, bool pixel_shader, bool compute_shader) { const bool vertex_shader = !compute_shader && !pixel_shader; @@ -736,7 +732,7 @@ void NamedConstBlock::buildStaticConstBufHlslDecl(String &out_text, const Merged const char *bindlessProlog = ""; const char *bindlessType = ""; - if (enableBindless) + if (shc::config().enableBindless) { #if _CROSS_TARGET_C1 || _CROSS_TARGET_C2 @@ -946,30 +942,8 @@ static void process_hardcoded_register_declarations(const char *hlsl_src, TF &&p #include "transcodeCommon.h" -extern String hlsl_defines; -// TODO: rename pixel_shader to pixel_or_compute_shader everywhere applicable in this file. Or just pass shader stage instead. -void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_shader, const MergedVariablesData &merged_vars, - int &max_const_no_used) +static void build_predefines_str(String &predefines, String &src, const char *hw_defines) { - max_const_no_used = -1; - static String res, name_buf, blk_name_buf; - int name_prefix_len = 0; - res.clear(); - const bool doesShaderGlobalExist = ShaderStateBlock::countBlock(ShaderStateBlock::LEV_GLOBAL_CONST) > 0; - -#if _CROSS_TARGET_C2 - -#else - int psrSignaturePos = -1; -#endif - if (psrSignaturePos != -1) - { - char *pp = &src.data()[psrSignaturePos]; - memset(pp, 0x20, sizeof("INCLUDE_SONY_PSR_LIB") - 1); - } - - if (hlsl_defines.length()) - src.insert(0, hlsl_defines.c_str()); // add target-specific predefines const char *predefines_str = #if _CROSS_TARGET_C1 @@ -977,12 +951,12 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha #elif _CROSS_TARGET_C2 #elif _CROSS_TARGET_DX12 - dx12::dxil::Platform::XBOX_ONE == targetPlatform + dx12::dxil::Platform::XBOX_ONE == shc::config().targetPlatform ? #include "predefines_dx12x.hlsl.inl" - : dx12::dxil::Platform::XBOX_SCARLETT == targetPlatform ? + : dx12::dxil::Platform::XBOX_SCARLETT == shc::config().targetPlatform ? #include "predefines_dx12xs.hlsl.inl" - : + : #include "predefines_dx12.hlsl.inl" #elif _CROSS_TARGET_DX11 #include "predefines_dx11.hlsl.inl" @@ -994,9 +968,8 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha nullptr #endif ; - if (predefines_str) - src.insert(0, predefines_str); + const char *predefines_add_str = nullptr; #if _CROSS_TARGET_C2 @@ -1005,8 +978,33 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha + + #endif + + predefines = hw_defines ? hw_defines : ""; + if (shc::config().hlslDefines.length()) + predefines += shc::config().hlslDefines; + if (predefines_str) + predefines += predefines_str; + if (predefines_add_str) + predefines += predefines_add_str; +} + +// TODO: rename pixel_shader to pixel_or_compute_shader everywhere applicable in this file. Or just pass shader stage instead. +void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_shader, const MergedVariablesData &merged_vars, + int &max_const_no_used, const char *hw_defines) +{ + max_const_no_used = -1; + static String res, name_buf, blk_name_buf; + int name_prefix_len = 0; + res.clear(); + const bool doesShaderGlobalExist = ShaderStateBlock::countBlock(ShaderStateBlock::LEV_GLOBAL_CONST) > 0; + + static String predefines; + build_predefines_str(predefines, src, hw_defines); + bool hasStaticCbuf = staticCbufType != StaticCbuf::NONE; { SCFastNameMap added_names; @@ -1014,12 +1012,10 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha if (hasStaticCbuf) buildStaticConstBufHlslDecl(res, merged_vars); buildHlslDeclText(res, pixel_shader, compute_shader, added_names, hasStaticCbuf); - } - if (const char *p = strstr(src, "#line ")) - src.insert(p - src.data(), res); - else src.insert(0, res); - clear_and_shrink(res); + res.clear(); + } + const char *text = src, *p, *start = text; const RegisterProperties NamedConstBlock::*regPropsMember = @@ -1040,7 +1036,7 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha // therefore we have to exclude them from this validation and trust the developers not to mess up with predefines. RegistersUsage internalHardcodedRegs, userHardcodedRegs; - process_hardcoded_register_declarations(predefines_str, + process_hardcoded_register_declarations(predefines, [&allHardcodedRegs, &internalHardcodedRegs](char regt_sym, int regt_id, eastl::string_view) { // @NOTE: this doesn't validate constants that take up >1 regs correctly. // However, this would require us to parse hlsl more seriously. @@ -1160,7 +1156,7 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha return eastl::make_pair(cap, max(cap - 1, 0)); }; - const int maxAllowedConsts = pixel_shader ? hlsl_maximum_psf_allowed : hlsl_maximum_vsf_allowed; + const int maxAllowedConsts = pixel_shader ? shc::config().hlslMaximumPsfAllowed : shc::config().hlslMaximumVsfAllowed; // Since we use this for cbuf size in driver, we have to check against all registers const auto [cRegRangeCap, cLastReg] = regRangeCapAndLast(HlslNameSpace::c, allHardcodedRegs); @@ -1397,10 +1393,7 @@ void NamedConstBlock::patchHlsl(String &src, bool pixel_shader, bool compute_sha #endif ps4_samplerstates.aprintf(128, "SamplerState %s_samplerstate: register(s%d);\n", samplers[i].name, samplers[i].regIdx); } - if (predefines_str) - src.printf(1024, "%s\n%s\n%s", predefines_str, ps4_samplerstates.str(), res.str() + strlen(predefines_str)); - else - src.printf(1024, "%s%s", ps4_samplerstates.str(), res.str()); + src.setStrCat4(predefines, "\n", ps4_samplerstates, res); } void NamedConstBlock::patchStcodeIndices(dag::Span stcode, StcodeRoutine &cpp_stcode, bool static_blk) diff --git a/prog/tools/ShaderCompiler2/namedConst.h b/prog/tools/ShaderCompiler2/namedConst.h index 331aaeb01..e55fd1bc2 100644 --- a/prog/tools/ShaderCompiler2/namedConst.h +++ b/prog/tools/ShaderCompiler2/namedConst.h @@ -99,7 +99,8 @@ struct NamedConstBlock int getRegForNamedConst(const char *name_buf, NamedConstSpace ns, bool pixel_shader); int getRegForNamedConstEx(const char *name_buf, const char *blk_name, NamedConstSpace ns, bool pixel_shader); - void patchHlsl(String &src, bool pixel_shader, bool compute_shader, const MergedVariablesData &merged_vars, int &max_const_no_used); + void patchHlsl(String &src, bool pixel_shader, bool compute_shader, const MergedVariablesData &merged_vars, int &max_const_no_used, + const char *hw_defines); void patchStcodeIndices(dag::Span stcode, StcodeRoutine &cpp_stcode, bool static_blk); CryptoHash getDigest(bool ps_const, bool cs_const, const MergedVariablesData &merged_vars) const; diff --git a/prog/tools/ShaderCompiler2/predefines_dx11.hlsl b/prog/tools/ShaderCompiler2/predefines_dx11.hlsl index ff53e6a3b..e4662b3f1 100644 --- a/prog/tools/ShaderCompiler2/predefines_dx11.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_dx11.hlsl @@ -1,6 +1,5 @@ #define NOP -#define _HARDWARE_DX11 1 #define _HARDWARE_JUST_DX11 1 struct TextureSampler @@ -31,4 +30,4 @@ struct TextureCubeArraySampler { TextureCubeArray tex; SamplerState smp; -}; \ No newline at end of file +}; diff --git a/prog/tools/ShaderCompiler2/predefines_dx12.hlsl b/prog/tools/ShaderCompiler2/predefines_dx12.hlsl index b7fac8228..2afb4662f 100644 --- a/prog/tools/ShaderCompiler2/predefines_dx12.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_dx12.hlsl @@ -1,6 +1,4 @@ -#define _HARDWARE_DX12 1 -#define _HARDWARE_DX11 1 struct TextureSampler { Texture2D tex; diff --git a/prog/tools/ShaderCompiler2/predefines_dx12x.hlsl b/prog/tools/ShaderCompiler2/predefines_dx12x.hlsl index a35699e84..59db17af7 100644 --- a/prog/tools/ShaderCompiler2/predefines_dx12x.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_dx12x.hlsl @@ -16,7 +16,6 @@ #define WaveAllMin_U32 __XB_WaveMin_U32 #define NOP -#define _HARDWARE_XBOX 1 struct TextureSampler { diff --git a/prog/tools/ShaderCompiler2/predefines_dx12xs.hlsl b/prog/tools/ShaderCompiler2/predefines_dx12xs.hlsl index d03469d8f..2c649a4ff 100644 --- a/prog/tools/ShaderCompiler2/predefines_dx12xs.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_dx12xs.hlsl @@ -16,8 +16,6 @@ #define WaveAllMin_U32 __XB_WaveMin_U32 #define NOP -#define _HARDWARE_XBOX 1 -#define _HARDWARE_SCARLETT 1 struct TextureSampler { @@ -47,4 +45,4 @@ struct TextureCubeArraySampler { TextureCubeArray tex; SamplerState smp; -}; \ No newline at end of file +}; diff --git a/prog/tools/ShaderCompiler2/predefines_metal.hlsl b/prog/tools/ShaderCompiler2/predefines_metal.hlsl index 636f9732b..6b2dc4ef3 100644 --- a/prog/tools/ShaderCompiler2/predefines_metal.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_metal.hlsl @@ -1,7 +1,7 @@ + #define RWBuffer RWStructuredBuffer #define NOP -#define _HARDWARE_METAL 1 struct TextureSampler { @@ -47,4 +47,3 @@ struct TextureCubeArraySampler #define WaveAllMin_F32 WaveActiveMin #define WaveAllMin_I32 WaveActiveMin #define WaveAllMin_U32 WaveActiveMin - diff --git a/prog/tools/ShaderCompiler2/predefines_spirv.hlsl b/prog/tools/ShaderCompiler2/predefines_spirv.hlsl index 816bca299..a857b0e25 100644 --- a/prog/tools/ShaderCompiler2/predefines_spirv.hlsl +++ b/prog/tools/ShaderCompiler2/predefines_spirv.hlsl @@ -1,6 +1,5 @@ #define NOP -#define _HARDWARE_VULKAN 1 struct TextureSampler { diff --git a/prog/tools/ShaderCompiler2/processes.cpp b/prog/tools/ShaderCompiler2/processes.cpp new file mode 100644 index 000000000..8fedc4f41 --- /dev/null +++ b/prog/tools/ShaderCompiler2/processes.cpp @@ -0,0 +1,186 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. + +#include "processes.h" +#include "processes_impl.h" +#include "shCompiler.h" +#include "defer.h" +#include +#include +#include + +namespace proc +{ + +// @TODO: add memory orders to cancelled. Beware, there are dances w/ shutdown, so acq_rel may not be automatically enough! + +/* How this is done: + * When the user calls perform, the function starts launching processes and collecting results. + * + * For this time, regular shutdown (inside a ^C handler) is not an option, so the shutdown is locked + * for the duration of the compilation. Instead, the user can call proc::cancel from any other thread, + * and the process loop will pick it up, drop all enqueued tasks and terminate ones running. + * + * This is implemented with an atomic flag (cancelled), which is read on each iteration of the loop, + * and an os event/pipe that gets signaled. When the loop waits for the next finished process, it also + * waits on the event, so that cancellation wakes it up too, and there are no delays. + * + * When the loop goes into cancellation mode, either because a process failed of because it was told to do so, + * it also awaits running processes, but now without the event and with a possible timeout. + * + * When the loop is done, it restores the ability of the app to shut down regularly. + */ + +static internal::ExecutionState g_state{}; + +void init(int max_proc_count, int should_cancel_on_fail) +{ + G_ASSERT(is_main_thread()); + G_ASSERT(cpujobs::is_inited()); + + g_state.maxProcs = max_proc_count; + g_state.shouldCancelOnProcFail = should_cancel_on_fail; + + // @TODO: adapt logic to different platforms. Seems like unix schedulers don't deal as well w/ proc x thread overloads. + if (g_state.maxProcs < 0) + g_state.maxProcs = cpujobs::get_physical_core_count(); + if (g_state.maxProcs < 2) + g_state.maxProcs = 0; + if (g_state.maxProcs > 24) // very small benefit from 24+ processes, but noticeable memory consumption + g_state.maxProcs = 24; + + internal::init_state(g_state); +} + +void deinit() +{ + G_ASSERT(is_main_thread()); + G_ASSERT(g_state.tasks.empty()); + G_ASSERT(g_state.processes.empty()); + + internal::deinit_state(g_state); +} + +int is_multiproc() { return g_state.maxProcs > 0; } +int max_proc_count() { return g_state.maxProcs; } + +void enqueue(ProcessTask &&task) +{ + G_ASSERT(is_main_thread()); + g_state.tasks.push_back(eastl::move(task)); +} + +bool execute() +{ + G_ASSERT(is_main_thread()); + + if (!shc::try_lock_shutdown()) + return false; + + internal::start_execution(g_state); + + // Reset when done (this does not 100% support reentrability, see comment at return) + DEFER_FUNC([] { + g_state.cancelled.store(false); + internal::end_execution(g_state); + }); + + bool failedWithoutCancellation = false; + + // When awaiting a process, decide if the fail should cause cancellation. + // If failed but should not cancel, we instead drop tasks and set the flag + auto awaitProcsAndDecideContinuation = [&] { + internal::AwaitResult res = internal::await_processes(g_state, true); + if (res == internal::AwaitResult::SOME_FAILED) + { + if (g_state.shouldCancelOnProcFail) + return false; + else + { + // With -cjWait we await all running procs, but drop queue + failedWithoutCancellation = true; + g_state.tasks.clear(); + } + } + else if (res != internal::AwaitResult::ALL_SUCCEEDED) + return false; + + return true; + }; + + // Scheduling loop + while (!g_state.tasks.empty()) + { + while (g_state.processes.size() >= g_state.maxProcs) + { + if (!awaitProcsAndDecideContinuation()) + goto cancel; + else if (failedWithoutCancellation) + goto final_wait; + } + + if (g_state.cancelled.load()) + goto cancel; + + ProcessTask nextTask = eastl::move(g_state.tasks.front()); + g_state.tasks.pop_front(); + + auto nextProcMaybe = internal::spawn_process(eastl::move(nextTask)); + if (!nextProcMaybe) + goto cancel; + + g_state.processes.push_back(eastl::move(*nextProcMaybe)); + } + +final_wait: + while (!g_state.processes.empty()) + { + if (!awaitProcsAndDecideContinuation()) + goto cancel; + } + + // Re-read g_state.cancelled after unlocking shutdown. + // + // If try_enter_shutdown failed in sighandler -- then it was before unlock_shutdown in mo, + // and preceding proc::cancel() hb the g_state.cancelled.load() and we read that we were cancelled. + // + // If try_enter_shutdown succeeded in sighandler -- the handler will perform the shutdown on it's own. + // + // @NOTE: this logic may break if we try to reenter proc::perform() instantly (not verified). + // However, this should not happen. Currently we call it once per run, + // so consider reentering proc::perform() not supported. + shc::unlock_shutdown(); + return !failedWithoutCancellation && !g_state.cancelled.load(); + +cancel: + g_state.tasks.clear(); + + // First, try regular "signal" + for (const auto &proc : g_state.processes) + internal::send_interrupt_signal_to_process(proc); + + // Wait with timeout, leasing at most 250 * procs/2 additional time (the impl is a bit iffy, but enough in practice) + int attempts = g_state.processes.size() * 3 / 2; + while (!g_state.processes.empty() && ((attempts--) > 0)) + internal::await_processes(g_state, false, 250); + + // If some processes hung dead, terminate them with fire + if (!g_state.processes.empty()) + { + for (const auto &proc : g_state.processes) + internal::kill_process(proc); + + while (!g_state.processes.empty()) + internal::await_processes(g_state, false); + } + + shc::unlock_shutdown(); + return false; +} + +void cancel() +{ + g_state.cancelled.store(true); + internal::fire_cancellation_event(g_state); +} + +} // namespace proc diff --git a/prog/tools/ShaderCompiler2/processes.h b/prog/tools/ShaderCompiler2/processes.h index ca81e8f15..82275c6a8 100644 --- a/prog/tools/ShaderCompiler2/processes.h +++ b/prog/tools/ShaderCompiler2/processes.h @@ -18,7 +18,7 @@ struct ProcessTask }; // Can only be called from the main thread -void init(int max_proc_count); +void init(int max_proc_count, int should_cancel_on_fail); void deinit(); int is_multiproc(); diff --git a/prog/tools/ShaderCompiler2/processes_impl.h b/prog/tools/ShaderCompiler2/processes_impl.h new file mode 100644 index 000000000..05d728f43 --- /dev/null +++ b/prog/tools/ShaderCompiler2/processes_impl.h @@ -0,0 +1,60 @@ +// Copyright (C) Gaijin Games KFT. All rights reserved. +#pragma once + +#include "processes.h" +#include +#include +#include +#include + +namespace proc +{ +namespace internal +{ +// Opaque types specified by the platform specific code +struct ProcessData; +struct ExtraStateData; + +struct ProcessHandle +{ + ProcessTask task; + ProcessData *processData = nullptr; +}; + +struct ExecutionState +{ + int maxProcs = -1; + bool shouldCancelOnProcFail = true; + + eastl::deque tasks{}; + eastl::deque processes{}; + + std::atomic_bool cancelled{false}; + + ExtraStateData *extraData = nullptr; +}; + +enum class AwaitResult +{ + ALL_SUCCEEDED, + SOME_FAILED, + CANCELLED_BY_USER, + TIMEOUT +}; + +constexpr int NO_TIMEOUT = -1; + +void init_state(ExecutionState &state); +void deinit_state(ExecutionState &state); + +void start_execution(ExecutionState &state); +void end_execution(ExecutionState &state); + +AwaitResult await_processes(ExecutionState &state, bool listen_to_cancellation_event, int timeout_ms = NO_TIMEOUT); +eastl::optional spawn_process(ProcessTask &&task); +void send_interrupt_signal_to_process(const ProcessHandle &process); +void kill_process(const ProcessHandle &process); + +void fire_cancellation_event(ExecutionState &state); +} // namespace internal +} // namespace proc diff --git a/prog/tools/ShaderCompiler2/processes_unix.cpp b/prog/tools/ShaderCompiler2/processes_unix.cpp index 442892f7c..e78c4efcb 100644 --- a/prog/tools/ShaderCompiler2/processes_unix.cpp +++ b/prog/tools/ShaderCompiler2/processes_unix.cpp @@ -1,19 +1,9 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "processes.h" -#include "shCompiler.h" -#include "defer.h" +#include "processes_impl.h" #include -#include -#include -#include -#include -#include -#include - -#include + #include -#include #if !_TARGET_PC || _TARGET_PC_WIN #error This file can only be used on unix systems @@ -29,27 +19,10 @@ #include #include -namespace proc +namespace proc::internal { - -// @TODO: add memory orders to cancelled. Beware, there are dances w/ shutdown, so acq_rel may not be automatically enough! - -/* How this is done: - * - * The main idea is the same as in processes_win.cpp. - * - * The difference is that we can't use sync primitives in select, so a pipe takes the place of the event. - * We also await not one process at a time, but always collect all zombies in a waitpid cycle. - */ - using Sigaction = struct sigaction; -struct ProcessHandle -{ - pid_t pid; - ProcessTask task; -}; - union Pipe { struct @@ -61,144 +34,108 @@ union Pipe static constexpr uint32_t CANCELLATION_TOKEN = 'stop'; -struct ExecutionState +struct ProcessData { - int maxProcs = -1; - - eastl::deque tasks{}; - eastl::deque processes{}; + pid_t pid; +}; - std::atomic_bool cancelled{false}; +struct ExtraStateData +{ Pipe cancellationPipe{}; - sigset_t initialSigmask{}; +}; + +// This has to be a separate static var, cause sigchld handler uses it +struct SigchldContext +{ Sigaction sigchldAction{}; pthread_t performerThreadHnd{}; }; -static ExecutionState g_state{}; +static SigchldContext g_sigchld_ctx{}; -void init(int max_proc_count) +void init_state(ExecutionState &state) { - G_ASSERT(is_main_thread()); - G_ASSERT(cpujobs::is_inited()); - - g_state.maxProcs = max_proc_count; + state.extraData = new ExtraStateData; - if (g_state.maxProcs < 0) - g_state.maxProcs = cpujobs::get_physical_core_count(); - if (g_state.maxProcs < 2) - g_state.maxProcs = 0; - if (g_state.maxProcs > 24) - g_state.maxProcs = 24; - - int res = pipe(g_state.cancellationPipe.fds); + int res = pipe(state.extraData->cancellationPipe.fds); G_VERIFY(res == 0); // This makes it so spawned procs don't inherit the pipe fds - fcntl(g_state.cancellationPipe.read_fd, F_SETFD, FD_CLOEXEC); - fcntl(g_state.cancellationPipe.write_fd, F_SETFD, FD_CLOEXEC); + fcntl(state.extraData->cancellationPipe.read_fd, F_SETFD, FD_CLOEXEC); + fcntl(state.extraData->cancellationPipe.write_fd, F_SETFD, FD_CLOEXEC); // This moves the pipe into non-blocking mode, which allows to use it as an event - int flags = fcntl(g_state.cancellationPipe.read_fd, F_GETFL, 0); - fcntl(g_state.cancellationPipe.read_fd, F_SETFL, flags | O_NONBLOCK); + int flags = fcntl(state.extraData->cancellationPipe.read_fd, F_GETFL, 0); + fcntl(state.extraData->cancellationPipe.read_fd, F_SETFL, flags | O_NONBLOCK); // We use sigchld signals for waking from pselect, thus it has to be masked off at all other times sigset_t excludedSigmask; - sigemptyset(&g_state.initialSigmask); + sigemptyset(&state.extraData->initialSigmask); sigemptyset(&excludedSigmask); sigaddset(&excludedSigmask, SIGCHLD); sigprocmask(SIG_SETMASK, &excludedSigmask, nullptr); // We set a sigchld handler so that this signal is not ignored and wakes us - g_state.sigchldAction.sa_handler = +[](int) { - sigaction(SIGCHLD, &g_state.sigchldAction, nullptr); + g_sigchld_ctx.sigchldAction.sa_handler = +[](int) { + sigaction(SIGCHLD, &g_sigchld_ctx.sigchldAction, nullptr); // If picked up by sigint handler thread, forward - if (!pthread_equal(g_state.performerThreadHnd, pthread_self())) - pthread_kill(g_state.performerThreadHnd, SIGCHLD); + if (!pthread_equal(g_sigchld_ctx.performerThreadHnd, pthread_self())) + pthread_kill(g_sigchld_ctx.performerThreadHnd, SIGCHLD); }; - g_state.sigchldAction.sa_flags = SA_RESTART; - - sigaction(SIGCHLD, &g_state.sigchldAction, nullptr); -} + g_sigchld_ctx.sigchldAction.sa_flags = SA_RESTART; -void deinit() -{ - G_ASSERT(is_main_thread()); - G_ASSERT(g_state.tasks.empty()); - G_ASSERT(g_state.processes.empty()); + sigaction(SIGCHLD, &g_sigchld_ctx.sigchldAction, nullptr); } +void deinit_state(ExecutionState &state) { delete state.extraData; } -int is_multiproc() { return g_state.maxProcs > 0; } -int max_proc_count() { return g_state.maxProcs; } +void start_execution(ExecutionState &state) { g_sigchld_ctx.performerThreadHnd = pthread_self(); } -void enqueue(ProcessTask &&task) +void end_execution(ExecutionState &state) { - G_ASSERT(is_main_thread()); - g_state.tasks.push_back(eastl::move(task)); + // Drain pipe just to be sure + uint32_t token; + while (read(state.extraData->cancellationPipe.read_fd, &token, sizeof(token)) > 0) {} } -static pid_t spawn_process(const ProcessTask &task) -{ - dag::Vector argv{}; - for (const eastl::string &arg : task.argv) - argv.push_back(arg.c_str()); - argv.push_back(nullptr); - - const char *cwd = task.cwd.has_value() ? task.cwd->c_str() : nullptr; - - pid_t pid = vfork(); - if (pid == 0) // Code in child process - { - if (cwd) - { - if (chdir(cwd) != 0) - exit(2); - } - - execvp(task.argv[0].c_str(), (char *const *)argv.data()); - exit(0); - } - - return pid; -} - -static bool await_done_processes(bool listen_to_cancellation_event, long timeout_ms = -1) +AwaitResult await_processes(ExecutionState &state, bool listen_to_cancellation_event, int timeout_ms) { timespec ts{timeout_ms / 1000, (timeout_ms % 1000) * 1'000'000}; - timespec *selectTimeoutPtr = timeout_ms >= 0 ? &ts : nullptr; + timespec *selectTimeoutPtr = timeout_ms == NO_TIMEOUT ? nullptr : &ts; + + ExtraStateData *extra = state.extraData; if (listen_to_cancellation_event) { fd_set fds; FD_ZERO(&fds); - FD_SET(g_state.cancellationPipe.read_fd, &fds); + FD_SET(extra->cancellationPipe.read_fd, &fds); - int eventCnt = pselect(1, &fds, nullptr, nullptr, selectTimeoutPtr, &g_state.initialSigmask); + int eventCnt = pselect(1, &fds, nullptr, nullptr, selectTimeoutPtr, &extra->initialSigmask); if (eventCnt == 0) // 0 is timeout, on signal it is -1 and errno == EINTR - return false; + return AwaitResult::TIMEOUT; else if (eventCnt > 0) { uint32_t token = 0; - while (int bytesRead = read(g_state.cancellationPipe.read_fd, &token, sizeof(token))) + while (int bytesRead = read(extra->cancellationPipe.read_fd, &token, sizeof(token))) { if (token == CANCELLATION_TOKEN) { - G_ASSERT(g_state.cancelled.load(std::memory_order_relaxed)); - return false; + G_ASSERT(state.cancelled.load(std::memory_order_relaxed)); + return AwaitResult::CANCELLED_BY_USER; } } } } else { - int eventCnt = pselect(0, nullptr, nullptr, nullptr, selectTimeoutPtr, &g_state.initialSigmask); + int eventCnt = pselect(0, nullptr, nullptr, nullptr, selectTimeoutPtr, &extra->initialSigmask); if (eventCnt == 0) // Timeout, it's -1 + EINTR on signal - return false; + return AwaitResult::TIMEOUT; } bool succeeded = true; @@ -212,12 +149,13 @@ static bool await_done_processes(bool listen_to_cancellation_event, long timeout break; ProcessTask task; - for (auto it = g_state.processes.cbegin(); it != g_state.processes.cend(); ++it) + for (auto it = state.processes.cbegin(); it != state.processes.cend(); ++it) { - if (it->pid == res) + if (it->processData->pid == res) { task = eastl::move(it->task); - g_state.processes.erase(it); + delete it->processData; + state.processes.erase(it); break; } } @@ -229,97 +167,46 @@ static bool await_done_processes(bool listen_to_cancellation_event, long timeout succeeded &= processSucceeded; } - return succeeded; + return succeeded ? AwaitResult::ALL_SUCCEEDED : AwaitResult::SOME_FAILED; } -bool execute() +eastl::optional spawn_process(ProcessTask &&task) { - G_ASSERT(is_main_thread()); - g_state.performerThreadHnd = pthread_self(); - - if (!shc::try_lock_shutdown()) - return false; - - // Reset when done - DEFER_FUNC([] { - g_state.cancelled.store(false); + dag::Vector argv{}; + for (const eastl::string &arg : task.argv) + argv.push_back(arg.c_str()); + argv.push_back(nullptr); - // Drain pipe just to be sure - uint32_t token; - while (read(g_state.cancellationPipe.read_fd, &token, sizeof(token)) > 0) {} - }); + const char *cwd = task.cwd.has_value() ? task.cwd->c_str() : nullptr; - while (!g_state.tasks.empty()) + pid_t pid = vfork(); + if (pid == 0) // Code in child process { - while (g_state.processes.size() >= g_state.maxProcs) + if (cwd) { - bool allSucceeded = await_done_processes(true); - if (!allSucceeded) - goto cancel; + if (chdir(cwd) != 0) + exit(2); } - if (g_state.cancelled.load()) - goto cancel; - - ProcessHandle nextProc{-1, eastl::move(g_state.tasks.front())}; - g_state.tasks.pop_front(); - - if ((nextProc.pid = spawn_process(nextProc.task)) == -1) - goto cancel; - - g_state.processes.push_back(eastl::move(nextProc)); - } - - while (!g_state.processes.empty()) - { - bool allSucceeded = await_done_processes(true); - if (!allSucceeded) - goto cancel; - } - - // Re-read g_state.cancelled after unlocking shutdown. - // - // If try_enter_shutdown failed in sighandler -- then it was before unlock_shutdown in mo, - // and preceding proc::cancel() hb the g_state.cancelled.load() and we read that we were cancelled. - // - // If try_enter_shutdown succeeded in sighandler -- the handler will perform the shutdown on it's own. - // - // @NOTE: this logic may break if we try to reenter proc::perform() instantly (not verified). - // However, this should not happen. Currently we call it once per run, - // so consider reentering proc::perform() not supported. - shc::unlock_shutdown(); - return !g_state.cancelled.load(); - -cancel: - g_state.tasks.clear(); - - // See processes_win.cpp for the description of cancellation, it's the same here but in unix language. - - for (const auto &proc : g_state.processes) - kill(proc.pid, SIGINT); - - int attempts = g_state.processes.size() * 3 / 2; - while (!g_state.processes.empty() && ((attempts--) > 0)) - await_done_processes(false, 250); - - if (!g_state.processes.empty()) - { - for (const auto &proc : g_state.processes) - kill(proc.pid, SIGKILL); - - while (!g_state.processes.empty()) - await_done_processes(false); + execvp(task.argv[0].c_str(), (char *const *)argv.data()); + exit(0); } + else if (pid == -1) + return eastl::nullopt; - shc::unlock_shutdown(); - return false; + ProcessHandle hnd; + hnd.task = eastl::move(task); + hnd.processData = new ProcessData{pid}; + return hnd; } -void cancel() +void send_interrupt_signal_to_process(const ProcessHandle &process) { kill(process.processData->pid, SIGINT); } +void kill_process(const ProcessHandle &process) { kill(process.processData->pid, SIGKILL); } + +void fire_cancellation_event(ExecutionState &state) { - g_state.cancelled.store(true); - int bytesWritten = write(g_state.cancellationPipe.write_fd, &CANCELLATION_TOKEN, sizeof(CANCELLATION_TOKEN)); + int bytesWritten = write(state.extraData->cancellationPipe.write_fd, &CANCELLATION_TOKEN, sizeof(CANCELLATION_TOKEN)); G_ASSERT(bytesWritten == sizeof(CANCELLATION_TOKEN)); } -} // namespace proc \ No newline at end of file +} // namespace proc::internal diff --git a/prog/tools/ShaderCompiler2/processes_win.cpp b/prog/tools/ShaderCompiler2/processes_win.cpp index 5a06162b4..53ba431c4 100644 --- a/prog/tools/ShaderCompiler2/processes_win.cpp +++ b/prog/tools/ShaderCompiler2/processes_win.cpp @@ -1,17 +1,12 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. -#include "processes.h" -#include "shCompiler.h" -#include "defer.h" +#include "processes_impl.h" #include #include -#include #include -#include -#include #include -#include +#include #if !_TARGET_PC_WIN #error This file can only be used on windows @@ -19,107 +14,58 @@ #include -namespace proc +namespace proc::internal { - -// @TODO: add memory orders to cancelled. Beware, there are dances w/ shutdown, so acq_rel may not be automatically enough! - -/* How this is done: - * When the user calls perform, the function starts launching processes and collecting results. - * - * For this time, regular shutdown (inside a ^C handler) is not an option, so the shutdown is locked - * for the duration of the compilation. Instead, the user can call proc::cancel from any other thread, - * and the process loop will pick it up, drop all enqueued tasks and terminate ones running. - * - * This is implemented with an atomic flag (cancelled), which is read on each iteration of the loop, - * and a windows event that gets signaled. When the loop waits for the next finished process, it also - * waits on the event, so that cancellation wakes it up too, and there are no delays. - * - * When the loop goes into cancellation mode, either because a process failed of because it was told to do so, - * it also awaits running processes, but now without the event and with a possible timeout. - * - * When the loop is done, it restores the ability of the app to shut down regularly. - */ - -struct ProcessHandle +struct ProcessData : PROCESS_INFORMATION { - PROCESS_INFORMATION pi; - ProcessTask task; + ProcessData(const PROCESS_INFORMATION &pi) : PROCESS_INFORMATION(pi) {} }; -struct ExecutionState +struct ExtraStateData { - int maxProcs = -1; - - eastl::deque tasks{}; - eastl::deque processes{}; - - std::atomic_bool cancelled{false}; HANDLE cancellationEventHnd{}; }; -static ExecutionState g_state{}; - -void init(int max_proc_count) +void init_state(ExecutionState &state) { - G_ASSERT(is_main_thread()); - G_ASSERT(cpujobs::is_inited()); - - g_state.maxProcs = max_proc_count; - - // @TODO: adapt logic to different platforms. Seems like unix schedulers don't deal as well w/ proc x thread overloads. - if (g_state.maxProcs < 0) - g_state.maxProcs = cpujobs::get_physical_core_count(); - if (g_state.maxProcs < 2) - g_state.maxProcs = 0; - if (g_state.maxProcs > 24) // very small benefit from 24+ processes, but noticeable memory consumption - g_state.maxProcs = 24; - - g_state.cancellationEventHnd = CreateEventEx(nullptr, nullptr, 0, SYNCHRONIZE | DELETE); + state.extraData = new ExtraStateData{CreateEventEx(nullptr, nullptr, 0, SYNCHRONIZE | DELETE)}; } -void deinit() +void deinit_state(ExecutionState &state) { - G_ASSERT(is_main_thread()); - G_ASSERT(g_state.tasks.empty()); - G_ASSERT(g_state.processes.empty()); - - CloseHandle(g_state.cancellationEventHnd); + CloseHandle(state.extraData->cancellationEventHnd); + delete state.extraData; } -int is_multiproc() { return g_state.maxProcs > 0; } -int max_proc_count() { return g_state.maxProcs; } +void start_execution(ExecutionState &state) {} +void end_execution(ExecutionState &state) { ResetEvent(state.extraData->cancellationEventHnd); } -void enqueue(ProcessTask &&task) -{ - G_ASSERT(is_main_thread()); - g_state.tasks.push_back(eastl::move(task)); -} - -static DWORD await_one_process(bool listen_to_cancellation_event, DWORD timeout_ms = INFINITE) +AwaitResult await_processes(ExecutionState &state, bool listen_to_cancellation_event, int timeout_ms) { auto scrapeHandlesForWait = [&] { dag::Vector handles{}; - handles.resize(g_state.processes.size()); - eastl::transform(g_state.processes.cbegin(), g_state.processes.cend(), handles.begin(), - [](const ProcessHandle &hnd) { return hnd.pi.hProcess; }); + handles.resize(state.processes.size()); + eastl::transform(state.processes.cbegin(), state.processes.cend(), handles.begin(), + [](const ProcessHandle &hnd) { return hnd.processData->hProcess; }); if (listen_to_cancellation_event) - handles.push_back(g_state.cancellationEventHnd); + handles.push_back(state.extraData->cancellationEventHnd); return handles; }; dag::Vector winHandles = scrapeHandlesForWait(); - DWORD waitRes = WaitForMultipleObjectsEx(winHandles.size(), winHandles.data(), false, timeout_ms, false); + DWORD timeoutMsDw = timeout_ms == NO_TIMEOUT ? INFINITE : timeout_ms; + + DWORD waitRes = WaitForMultipleObjectsEx(winHandles.size(), winHandles.data(), false, timeoutMsDw, false); if (waitRes == WAIT_TIMEOUT) - return -1; + return AwaitResult::TIMEOUT; G_VERIFY(waitRes >= WAIT_OBJECT_0 && waitRes < WAIT_OBJECT_0 + winHandles.size()); if (listen_to_cancellation_event && waitRes == winHandles.size() - 1) // Hit event { - G_ASSERT(g_state.cancelled.load(std::memory_order_relaxed)); - return -1; // Same as if terminated with an error + G_ASSERT(state.cancelled.load(std::memory_order_relaxed)); + return AwaitResult::CANCELLED_BY_USER; } size_t handleId = waitRes - WAIT_OBJECT_0; @@ -129,140 +75,73 @@ static DWORD await_one_process(bool listen_to_cancellation_event, DWORD timeout_ G_VERIFY(exitCodeSuccess); G_VERIFY(exitCode != STILL_ACTIVE); - CloseHandle(g_state.processes[handleId].pi.hThread); - CloseHandle(g_state.processes[handleId].pi.hProcess); + CloseHandle(state.processes[handleId].processData->hThread); + CloseHandle(state.processes[handleId].processData->hProcess); + delete state.processes[handleId].processData; if (exitCode != 0) - g_state.processes[handleId].task.cleanupOnFail(); + state.processes[handleId].task.cleanupOnFail(); - g_state.processes.erase(g_state.processes.cbegin() + handleId); + state.processes.erase(state.processes.cbegin() + handleId); - return exitCode; + return exitCode == 0 ? AwaitResult::ALL_SUCCEEDED : AwaitResult::SOME_FAILED; } -bool execute() +eastl::optional spawn_process(ProcessTask &&task) { - G_ASSERT(is_main_thread()); - - if (!shc::try_lock_shutdown()) - return false; - - // Reset when done (this does not 100% support reentrability, see comment at return) - DEFER_FUNC([] { - g_state.cancelled.store(false); - ResetEvent(g_state.cancellationEventHnd); - }); - - // Scheduling loop - while (!g_state.tasks.empty()) - { - while (g_state.processes.size() >= g_state.maxProcs) - { - DWORD exitCode = await_one_process(true); - if (exitCode != 0) - goto cancel; - } - - if (g_state.cancelled.load()) - goto cancel; - - ProcessTask nextTask = eastl::move(g_state.tasks.front()); - g_state.tasks.pop_front(); - - PROCESS_INFORMATION pi; - STARTUPINFO si; - ZeroMemory(&si, sizeof(STARTUPINFO)); - si.cb = sizeof(STARTUPINFO); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = SW_HIDE; - - G_ASSERT(!nextTask.argv.empty()); - eastl::string cmdline = nextTask.argv[0]; - for (size_t i = 1; i < nextTask.argv.size(); ++i) - { - cmdline += " "; - cmdline += nextTask.argv[i]; - } - - const char *cwd = nullptr; - - char cwdStorage[DAGOR_MAX_PATH]; - if (nextTask.cwd.has_value()) - { - if (is_path_abs(nextTask.cwd->c_str())) - strncpy(cwdStorage, nextTask.cwd->c_str(), sizeof(cwdStorage)); - else - { - DWORD len = GetCurrentDirectory(sizeof(cwdStorage), cwdStorage); - strncat_s(cwdStorage, sizeof(cwdStorage), "\\", 1); - strncat_s(cwdStorage, sizeof(cwdStorage), nextTask.cwd->c_str(), nextTask.cwd->length()); - } - dd_simplify_fname_c(cwdStorage); - - cwd = cwdStorage; - } - - // External programs (non-dsc) are presumed to be able to handle ^C, fail w/ a non-zero exit code and cause loop exit this way. - // This is needed, because not all programs handle CtrlBreak like we want them to, so a new proc groups leads to them ignoring our - // ^C. On the other hand, clone dsc processes need to have a separate group, cause otherwise the signal crashes the parent terminal - // instance. - DWORD dwCreationFlags = nextTask.isExternal ? 0 : CREATE_NEW_PROCESS_GROUP; - if (!CreateProcessA(nextTask.argv[0].c_str(), cmdline.data(), NULL, NULL, TRUE, dwCreationFlags, NULL, cwd, &si, &pi)) - goto cancel; - - g_state.processes.push_back(ProcessHandle{pi, eastl::move(nextTask)}); - } - - while (!g_state.processes.empty()) + PROCESS_INFORMATION pi; + STARTUPINFO si; + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + + G_ASSERT(!task.argv.empty()); + eastl::string cmdline = task.argv[0]; + for (size_t i = 1; i < task.argv.size(); ++i) { - DWORD exitCode = await_one_process(true); - if (exitCode != 0) - goto cancel; + cmdline += " "; + cmdline += task.argv[i]; } - // Re-read g_state.cancelled after unlocking shutdown. - // - // If try_enter_shutdown failed in sighandler -- then it was before unlock_shutdown in mo, - // and preceding proc::cancel() hb the g_state.cancelled.load() and we read that we were cancelled. - // - // If try_enter_shutdown succeeded in sighandler -- the handler will perform the shutdown on it's own. - // - // @NOTE: this logic may break if we try to reenter proc::perform() instantly (not verified). - // However, this should not happen. Currently we call it once per run, - // so consider reentering proc::perform() not supported. - shc::unlock_shutdown(); - return !g_state.cancelled.load(); - -cancel: - g_state.tasks.clear(); + const char *cwd = nullptr; - // First, try regular "signal" - for (const auto &proc : g_state.processes) - GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, proc.pi.dwProcessId); - - // Wait with timeout, leasing at most 250 * procs/2 additional time (the impl is a bit iffy, but enough in practice) - int attempts = g_state.processes.size() * 3 / 2; - while (!g_state.processes.empty() && ((attempts--) > 0)) - await_one_process(false, 250); - - // If some processes hung dead, terminate them with fire - if (!g_state.processes.empty()) + char cwdStorage[DAGOR_MAX_PATH]; + if (task.cwd.has_value()) { - for (const auto &proc : g_state.processes) - TerminateProcess(proc.pi.hProcess, 1); + if (is_path_abs(task.cwd->c_str())) + strncpy(cwdStorage, task.cwd->c_str(), sizeof(cwdStorage)); + else + { + DWORD len = GetCurrentDirectory(sizeof(cwdStorage), cwdStorage); + strncat_s(cwdStorage, sizeof(cwdStorage), "\\", 1); + strncat_s(cwdStorage, sizeof(cwdStorage), task.cwd->c_str(), task.cwd->length()); + } + dd_simplify_fname_c(cwdStorage); - while (!g_state.processes.empty()) - await_one_process(false); + cwd = cwdStorage; } - shc::unlock_shutdown(); - return false; + // External programs (non-dsc) are presumed to be able to handle ^C, fail w/ a non-zero exit code and cause loop exit this way. + // This is needed, because not all programs handle CtrlBreak like we want them to, so a new proc groups leads to them ignoring our + // ^C. On the other hand, clone dsc processes need to have a separate group, cause otherwise the signal crashes the parent terminal + // instance. + DWORD dwCreationFlags = task.isExternal ? 0 : CREATE_NEW_PROCESS_GROUP; + if (!CreateProcessA(task.argv[0].c_str(), cmdline.data(), NULL, NULL, TRUE, dwCreationFlags, NULL, cwd, &si, &pi)) + return eastl::nullopt; + + ProcessHandle hnd; + hnd.processData = new ProcessData{pi}; + hnd.task = eastl::move(task); + return hnd; } -void cancel() +void send_interrupt_signal_to_process(const ProcessHandle &process) { - g_state.cancelled.store(true); - SetEvent(g_state.cancellationEventHnd); + GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, process.processData->dwProcessId); } -} // namespace proc \ No newline at end of file +void kill_process(const ProcessHandle &process) { TerminateProcess(process.processData->hProcess, 1); } +void fire_cancellation_event(ExecutionState &state) { SetEvent(state.extraData->cancellationEventHnd); } + +} // namespace proc::internal diff --git a/prog/tools/ShaderCompiler2/shCompiler.cpp b/prog/tools/ShaderCompiler2/shCompiler.cpp index acd9e1254..92f54f7ce 100644 --- a/prog/tools/ShaderCompiler2/shCompiler.cpp +++ b/prog/tools/ShaderCompiler2/shCompiler.cpp @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "shCompiler.h" +#include "globalConfig.h" #include "codeBlocks.h" #include #include @@ -32,7 +33,6 @@ #if _CROSS_TARGET_DX12 #include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; #endif extern void parse_shader_script(const char *fn, const ShHardwareOptions &opt, Tab *out_filenames); @@ -52,7 +52,6 @@ static String updbPath; bool relinkOnly = false; static SCFastNameMap explicitGlobVarRef; -bool use_threadpool = true; static unsigned worker_cnt = 0; static constexpr size_t WORKER_STACK_SIZE = 1 << 20; @@ -121,7 +120,7 @@ Job::Job() { G_ASSERT(is_main_thread()); - if (!use_threadpool) + if (!shc::config().useThreadpool) { // Must always seq-before (in program order) the respective notifyJobRelease jobs_in_flight_count.fetch_add(1, std::memory_order_relaxed); @@ -140,7 +139,7 @@ void Job::releaseJob() { releaseJobBody(); - if (!use_threadpool) + if (!shc::config().useThreadpool) { // @HACK: allowed from jobs to enable termination from error processing (that can happen in jobs) @@ -155,7 +154,7 @@ void init_jobs(unsigned num_workers) worker_cnt = num_workers; - if (use_threadpool) + if (shc::config().useThreadpool) cpujobs::init(-1, false); else cpujobs::init(); @@ -171,7 +170,7 @@ void init_jobs(unsigned num_workers) return; } - if (use_threadpool) + if (shc::config().useThreadpool) { threadpool::init(worker_cnt, THREADPOOL_QUEUE_SIZE, WORKER_STACK_SIZE); debug("started threadpool"); @@ -211,7 +210,7 @@ void deinit_jobs() if (!is_multithreaded()) return; - if (use_threadpool) + if (shc::config().useThreadpool) { // @TODO: specific drop & shutdown? If so, do up threadpool or spoof jobs w/ flag? threadpool::shutdown(); @@ -237,13 +236,13 @@ void deinit_jobs() unsigned worker_count() { return worker_cnt; } bool is_multithreaded() { return worker_cnt > 1; } -bool is_in_worker() { return use_threadpool ? threadpool::get_current_worker_id() != -1 : cpujobs::is_in_job(); } +bool is_in_worker() { return shc::config().useThreadpool ? threadpool::get_current_worker_id() != -1 : cpujobs::is_in_job(); } void await_all_jobs(void (*on_released_cb)()) { G_ASSERT(!is_in_worker()); - if (use_threadpool) + if (shc::config().useThreadpool) { if (jobs_in_flight.empty()) return; @@ -287,7 +286,7 @@ void add_job(Job *job, JobMgrChoiceStrategy mgr_choice_strat) return; } - if (use_threadpool) + if (shc::config().useThreadpool) { jobs_in_flight.push_back(job); threadpool::add(jobs_in_flight.back(), threadpool::PRIO_DEFAULT, queue_pos, threadpool::AddFlags::IgnoreNotDone); @@ -479,7 +478,7 @@ void compileShader(const ShVariantName &variant_name, bool no_save, bool should_ parse_shader_script(sourceFileName, variant_name.opt, &dependenciesList); #if _CROSS_TARGET_DX12 - if (use_two_phase_compilation(targetPlatform)) + if (use_two_phase_compilation(shc::config().targetPlatform) && !shc::config().autotestMode) recompile_shaders(); #endif diff --git a/prog/tools/ShaderCompiler2/shCompiler.h b/prog/tools/ShaderCompiler2/shCompiler.h index f8d13e8a8..c581635ba 100644 --- a/prog/tools/ShaderCompiler2/shCompiler.h +++ b/prog/tools/ShaderCompiler2/shCompiler.h @@ -73,7 +73,6 @@ String search_include_with_pathes(const char *fn); void setOutputUpdbPath(const char *path); const char *getOutputUpdbPath(); -const char *getSrcRootFolder(); struct Job : cpujobs::IJob { @@ -100,7 +99,4 @@ bool is_multithreaded(); bool is_in_worker(); void await_all_jobs(void (*on_released_cb)() = nullptr); void add_job(Job *job, JobMgrChoiceStrategy mgr_choice_strat); - -extern bool relinkOnly; -extern bool use_threadpool; } // namespace shc diff --git a/prog/tools/ShaderCompiler2/shHardwareOpt.h b/prog/tools/ShaderCompiler2/shHardwareOpt.h index 685d6da87..6b12c09ba 100644 --- a/prog/tools/ShaderCompiler2/shHardwareOpt.h +++ b/prog/tools/ShaderCompiler2/shHardwareOpt.h @@ -3,6 +3,7 @@ #include #include +#include struct ShHardwareOptions { diff --git a/prog/tools/ShaderCompiler2/shLog.cpp b/prog/tools/ShaderCompiler2/shLog.cpp index cec510b41..3afa931be 100644 --- a/prog/tools/ShaderCompiler2/shLog.cpp +++ b/prog/tools/ShaderCompiler2/shLog.cpp @@ -106,7 +106,7 @@ void sh_debug(ShLogMode mode, const char *fmt, const DagorSafeArg *arg, int anum String s = current_variant->getVarStringInfo(); debug("\n== S.variant: %s", (char *)s); if (dup_stdout && !lockShaderOutput) - printf("\n== S.variant: shader=%s %s\n", current_shader, (char *)s); + ATOMIC_PRINTF("\n== S.variant: shader=%s %s\n", current_shader, (char *)s); } } @@ -118,7 +118,7 @@ void sh_debug(ShLogMode mode, const char *fmt, const DagorSafeArg *arg, int anum String s = current_dyn_variant->getVarStringInfo(); debug(" = D.variant: %s", (char *)s); if (dup_stdout && !lockShaderOutput) - printf(" = D.variant: %s\n", (char *)s); + ATOMIC_PRINTF(" = D.variant: %s\n", (char *)s); } } @@ -222,8 +222,9 @@ void sh_process_errors() shc::deinit_jobs(); if (usePrintf) { - printf("\n\nCompilation aborted after %d error(s)\n", ErrorCounter::allShaders().err); - printf("See shaderlog for more info\n"); + ATOMIC_PRINTF_IMM("\n\nCompilation aborted after %d error(s)\n" + "See shaderlog for more info\n", + ErrorCounter::allShaders().err); quit_game(13); } else diff --git a/prog/tools/ShaderCompiler2/shSemCode.cpp b/prog/tools/ShaderCompiler2/shSemCode.cpp index ce32c4ac4..9966d1683 100644 --- a/prog/tools/ShaderCompiler2/shSemCode.cpp +++ b/prog/tools/ShaderCompiler2/shSemCode.cpp @@ -1,6 +1,7 @@ // Copyright (C) Gaijin Games KFT. All rights reserved. #include "shSemCode.h" +#include "globalConfig.h" #include #include "shaderVariant.h" #include @@ -19,7 +20,6 @@ #if _CROSS_TARGET_DX12 #include "dx12/asmShaderDXIL.h" -extern dx12::dxil::Platform targetPlatform; #endif extern int opcode_usage[2][256]; @@ -64,7 +64,6 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS Tab cvar(tmpmem); cvar.resize(vars.size()); int ofs = 0; - extern bool addTextureType; for (int i = 0; i < vars.size(); ++i) { @@ -80,7 +79,7 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS } cvar[i] = ofs; ofs += sz; - if (addTextureType && vars[i].slot >= 0) + if (shc::config().addTextureType && vars[i].slot >= 0) { if (vars[i].slot >= code->staticTextureTypes.size()) for (int j = code->staticTextureTypes.size(); j <= vars[i].slot; j++) @@ -251,7 +250,7 @@ void ShaderSemCode::convert_passes(ShaderSemCode::Pass &semP, ShaderCode::Pass & else { #if _CROSS_TARGET_DX12 - if (use_two_phase_compilation(targetPlatform)) + if (use_two_phase_compilation(shc::config().targetPlatform) && !shc::config().autotestMode) { auto idents = add_phase_one_progs(semP.vpr, semP.hs, semP.ds, semP.gs, semP.fsh, semP.enableFp16); p.vprog = idents.vprog; diff --git a/prog/tools/ShaderCompiler2/shadervarGenerator.cpp b/prog/tools/ShaderCompiler2/shadervarGenerator.cpp index aa6ccc162..ab495b28c 100644 --- a/prog/tools/ShaderCompiler2/shadervarGenerator.cpp +++ b/prog/tools/ShaderCompiler2/shadervarGenerator.cpp @@ -5,6 +5,7 @@ #if _TARGET_PC_WIN #include "shLog.h" +#include "globalConfig.h" #include #include #include @@ -14,19 +15,14 @@ #include #include -extern ShadervarGeneratorMode shadervar_generator_mode; -extern std::string shadervars_code_template_filename; -extern GeneratedPathInfos generated_path_infos; -extern std::vector exclude_from_generation; - static std::string get_generated_shadervars_template() { - if (shadervars_code_template_filename.empty()) + if (shc::config().shadervarsCodeTemplateFilename.empty()) return ""; - std::ifstream file(shadervars_code_template_filename); + std::ifstream file(shc::config().shadervarsCodeTemplateFilename); if (!file.good()) { - sh_debug(SHLOG_FATAL, "Could not open file %s", shadervars_code_template_filename.c_str()); + sh_debug(SHLOG_FATAL, "Could not open file %s", shc::config().shadervarsCodeTemplateFilename.c_str()); return ""; } std::string result((std::istreambuf_iterator(file)), std::istreambuf_iterator()); @@ -36,7 +32,7 @@ static std::string get_generated_shadervars_template() static std::pair get_generated_file_name(const std::string &shader_file_name) { int no = 0; - for (auto &[matcher, replacer] : generated_path_infos) + for (auto &[matcher, replacer] : shc::config().generatedPathInfos) { no++; std::regex folder_matcher(matcher.c_str()); @@ -45,7 +41,7 @@ static std::pair get_generated_file_name(const std::string &sh } std::string matchers; - for (auto &[matcher, _] : generated_path_infos) + for (auto &[matcher, _] : shc::config().generatedPathInfos) matchers += matcher + ", "; sh_debug(SHLOG_FATAL, "Couldn't match shader file %s with regexps %s", shader_file_name.c_str(), matchers.c_str()); return {"", no}; @@ -55,7 +51,7 @@ static std::string get_code_to_write_to_generated_file(const std::string &file_n { if (!dd_file_exist(file_name.c_str())) { - if (shadervar_generator_mode == ShadervarGeneratorMode::Check) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Check) sh_debug(SHLOG_ERROR, "File doesn't exist %s", file_name.c_str()); return std::string(code); } @@ -64,7 +60,7 @@ static std::string get_code_to_write_to_generated_file(const std::string &file_n std::string file_content_str((std::istreambuf_iterator(file)), std::istreambuf_iterator()); if (file_content_str.empty()) { - if (shadervar_generator_mode == ShadervarGeneratorMode::Check) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Check) sh_debug(SHLOG_ERROR, "File is empty %s", file_name.c_str()); return std::string(code); } @@ -86,7 +82,7 @@ static std::string get_code_to_write_to_generated_file(const std::string &file_n if (file_content == code) return std::string(); - if (shadervar_generator_mode == ShadervarGeneratorMode::Check) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Check) { sh_debug(SHLOG_ERROR, "Generated content is different from the file %s", file_name.c_str()); show_diff(); @@ -110,7 +106,7 @@ static std::string get_code_to_write_to_generated_file(const std::string &file_n str << code.substr(0, code.rfind("} // namespace intervals")); str << file_content_str.substr(namespace_pos); - if (shadervar_generator_mode == ShadervarGeneratorMode::Check) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Check) { sh_debug(SHLOG_ERROR, "Generated content is different from the file %s with header", file_name.c_str()); show_diff(); @@ -186,7 +182,7 @@ static bool process_template(std::stringstream &output, std::string_view code, NEXT_KEY(for shadervars) FOR_EACH(shadervar, shadervars.size()) NEXT_KEY(template) - output << shadervars_code_template_filename; + output << shc::config().shadervarsCodeTemplateFilename; NEXT_KEY(for intervals) FOR_EACH(interval, intervals.size()) NEXT_KEY(interval_name) @@ -215,14 +211,14 @@ static bool process_template(std::stringstream &output, std::string_view code, void ShadervarGenerator::addShadervarsAndIntervals(dag::Span shadervars, const IntervalList &intervals) { - if (shadervar_generator_mode == ShadervarGeneratorMode::None) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::None) return; auto add_entry = [](const char *fname, const char *vname, auto &entries, auto &var) { char buf[DAGOR_MAX_PATH]; const char *path = dd_get_fname_without_path_and_ext(buf, DAGOR_MAX_PATH, fname); - if (std::ranges::find(exclude_from_generation, path) != exclude_from_generation.end()) + if (std::ranges::find(shc::config().excludeFromGeneration, path) != shc::config().excludeFromGeneration.end()) return; dd_get_fname_location(buf, fname); @@ -264,7 +260,7 @@ void ShadervarGenerator::addShadervarsAndIntervals(dag::Span void ShadervarGenerator::generateShadervars() { - if (shadervar_generator_mode == ShadervarGeneratorMode::None) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::None) return; std::string code_template = get_generated_shadervars_template(); @@ -287,7 +283,7 @@ void ShadervarGenerator::generateShadervars() for (auto &[generated_file_name, shadervars] : shadervars_by_file) { - if (shadervar_generator_mode == ShadervarGeneratorMode::Remove) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Remove) { remove_generated_file(generated_file_name); continue; @@ -299,7 +295,7 @@ void ShadervarGenerator::generateShadervars() std::string code_to_write = get_code_to_write_to_generated_file(generated_file_name, output.str()); if (!code_to_write.empty()) { - if (shadervar_generator_mode == ShadervarGeneratorMode::Check) + if (shc::config().shadervarGeneratorMode == ShadervarGeneratorMode::Check) { sh_debug(SHLOG_FATAL, "The generated code does not match the one that has already been saved to the file"); continue; diff --git a/prog/tools/ShaderCompiler2/shadervarGenerator.h b/prog/tools/ShaderCompiler2/shadervarGenerator.h index 4959d53f3..2788d0d76 100644 --- a/prog/tools/ShaderCompiler2/shadervarGenerator.h +++ b/prog/tools/ShaderCompiler2/shadervarGenerator.h @@ -7,7 +7,7 @@ #include #include -enum class ShadervarGeneratorMode +enum class ShadervarGeneratorMode : uint8_t { None, Remove, diff --git a/prog/tools/ShaderCompiler2/shlexterm.cpp b/prog/tools/ShaderCompiler2/shlexterm.cpp index 82dc64a53..2613b7703 100644 --- a/prog/tools/ShaderCompiler2/shlexterm.cpp +++ b/prog/tools/ShaderCompiler2/shlexterm.cpp @@ -20,6 +20,11 @@ using namespace ShaderTerminal; #include #include #include "cppStcodeUtils.h" +#if _TARGET_PC_WIN +#include +#elif _TARGET_PC_LINUX | _TARGET_APPLE | _TARGET_C3 +#include +#endif IMemAlloc *sh_symbolsmem = NULL; @@ -28,13 +33,24 @@ static Tab inc_base(inimem); void reset_shaders_inc_base() { inc_base.clear(); } void add_shaders_inc_base(const char *base) { inc_base.push_back() = base; } +static char compiler_cwd[DAGOR_MAX_PATH] = {0}; +static const char *get_cwd() +{ + if (compiler_cwd[0]) + return compiler_cwd; + if (getcwd(compiler_cwd, DAGOR_MAX_PATH)) + dd_append_slash_c(compiler_cwd); + else + memcpy(compiler_cwd, "./", 3); + return compiler_cwd; +} // parse include statement static bool process_include(String &inc_fpath, const char *inc_fn, int inc_fn_len) { for (int i = 0; i < inc_base.size(); i++) { - inc_fpath.printf(260, "%s/%.*s", inc_base[i].str(), inc_fn_len, inc_fn); + inc_fpath.printf(260, "%s%s/%.*s", get_cwd(), inc_base[i].str(), inc_fn_len, inc_fn); if (dd_file_exists(inc_fpath)) return true; } @@ -53,9 +69,8 @@ static bool parseInclude(ShaderLexParser *_this, bool optional = false) const char *inc_fn = _this->get_lexeme() + 1; int inc_fn_len = _this->get_lexeme_length() - 2; String inc_fpath; - process_include(inc_fpath, inc_fn, inc_fn_len); - if (inc_fpath.empty()) + if (!process_include(inc_fpath, inc_fn, inc_fn_len)) { char fn[1024]; ::dd_get_fname_location(fn, _this->__input_stream()->get_filename(_this->get_cur_file())); @@ -229,16 +244,17 @@ Terminal *ShaderLexParser::get_terminal() struct MyShaderSyntaxParser : public ShaderSyntaxParser { using ShaderSyntaxParser::ShaderSyntaxParser; + bool shaderDebugModeEnabled = true; // clang-format off // clang-format breaks alignment - void add_shader(shader_decl *d) override { ShaderParser::add_shader(d, *this); } + void add_shader(shader_decl *d) override { ShaderParser::add_shader(d, *this, shaderDebugModeEnabled); } void add_block(block_decl *d) override { ShaderParser::add_block(d, *this); } void add_global_var(global_var_decl *d) override { ShaderParser::add_global_var(d, *this); } void add_sampler(sampler_decl *d) override { ShaderParser::add_sampler(d, *this); } void add_global_interval(interval &i) override { ShaderParser::add_global_interval(i, *this); } void add_global_assume(assume_stat &a) override { ShaderParser::add_global_assume(a, *this); } void add_global_bool(bool_decl &d) override { ShaderParser::add_global_bool(d, *this); } - void add_hlsl(hlsl_global_decl_class &d) override { ShaderParser::add_hlsl(d, *this); } + void add_hlsl(hlsl_global_decl_class &d) override { ShaderParser::add_hlsl(d, *this, shaderDebugModeEnabled); } // clang-format on }; @@ -422,8 +438,11 @@ void parse_shader_script(const char *fn, const ShHardwareOptions &opt, Tabget_filename(term->file_start); - text.aprintf(32, - "#line 1 \"precompiled\"\n" - "#undef _FILE_\n" - "#define _FILE_ %d\n" - "#line %d \"%s\"\n" - "%s", - glob_string_table.addNameId(filename), term->line_start, filename, src); + if (need_file_idx) + text.aprintf(32, "#line 1 \"precompiled\"\n#undef _FILE_\n#define _FILE_ %d\n", glob_string_table.addNameId(filename)); + text.aprintf(32, "#line %d \"%s\"\n%s", term->line_start, filename, src); } -void ShaderParser::addSourceCode(String &text, SHTOK_hlsl_text *src, ShaderSyntaxParser &p) { addSourceCode(text, src, src->text, p); } +void ShaderParser::addSourceCode(String &text, SHTOK_hlsl_text *src, ShaderSyntaxParser &p, bool need_file_idx) +{ + addSourceCode(text, src, src->text, p, need_file_idx); +} void ShaderSemCode::dump() @@ -379,7 +380,7 @@ static bool is_compute(hlsl_compile_class &hlsl_compile) void eval_shader(shader_decl &sh, ShaderEvalCB &cb) { BoolVar::clear(true); - if (optionalIntervalsAsBranches) + if (shc::config().optionalIntervalsAsBranches) { bool isCompute = false; for (int i = 0; i < sh.stat.size(); ++i) @@ -616,7 +617,7 @@ static bool validate_cs(ShaderClass *sclass, ShaderSemCode *ssc, int staticVaria return ErrorCounter::curShader().err == 0; } -static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *shname) +static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *shname, bool &out_shaderDebugModeEnabled) { if (!shc::isShaderRequired(shname->text)) return; @@ -633,7 +634,7 @@ static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *sh // gather static variant vars parser.get_lex_parser().begin_shader(); GatherVarShaderEvalCB stVarCB(parser, currentShaderOptions, shname, hlsl_glob_vs, hlsl_glob_hs, hlsl_glob_ds, hlsl_glob_gs, - hlsl_glob_ps, hlsl_glob_cs, hlsl_glob_ms, hlsl_glob_as); + hlsl_glob_ps, hlsl_glob_cs, hlsl_glob_ms, hlsl_glob_as, out_shaderDebugModeEnabled); ShaderClass *sclass = new ShaderClass(shname->text); @@ -694,9 +695,7 @@ static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *sh Tab usageInfo(tmpmem); Tab shInitCodeLast(tmpmem); - float debug_mode_value = -1.0f; - shc::getAssumedValue(debug_mode_enabled_interval, shname->text, true, debug_mode_value); - if (debug_mode_value > 0.0f) + if (stVarCB.shaderDebugModeEnabled) { for (int i = 0; i < stVarCB.get_messages().nameCount(); i++) { @@ -926,13 +925,9 @@ static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *sh } } - if (debug_mode_value > 0.0f) - { + if (stVarCB.shaderDebugModeEnabled) for (int i = 0; i < sclass->uniqueStrings.nameCount(); i++) - { sclass->messages.emplace_back(sclass->uniqueStrings.getName(i)); - } - } shc::prepareTestVariantShader(NULL); if (has_first_static_variant) @@ -964,13 +959,14 @@ static void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, Terminal *sh } -void add_shader(shader_decl *sh, ShaderSyntaxParser &parser) +void add_shader(shader_decl *sh, ShaderSyntaxParser &parser, bool &out_shaderDebugModeEnabled) { if (!sh) return; for (int i = 0; i < sh->name.size(); ++i) - add_shader(sh, parser, sh->name[i]); + add_shader(sh, parser, sh->name[i], out_shaderDebugModeEnabled); + out_shaderDebugModeEnabled = true; } static Tab curBlockStat; @@ -1126,7 +1122,7 @@ void add_block(block_decl *bl, ShaderSyntaxParser &parser) } } -void add_hlsl(hlsl_global_decl_class &sh, ShaderSyntaxParser &parser) +void add_hlsl(hlsl_global_decl_class &sh, ShaderSyntaxParser &parser, bool need_file_idx) { if (!validate_hardcoded_regs_in_hlsl_block(sh.text)) return; @@ -1162,21 +1158,21 @@ void add_hlsl(hlsl_global_decl_class &sh, ShaderSyntaxParser &parser) hlsl_types |= HLSL_MS; if (hlsl_types & HLSL_PS) - addSourceCode(hlsl_glob_ps, sh.text, parser); + addSourceCode(hlsl_glob_ps, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_CS) - addSourceCode(hlsl_glob_cs, sh.text, parser); + addSourceCode(hlsl_glob_cs, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_VS) - addSourceCode(hlsl_glob_vs, sh.text, parser); + addSourceCode(hlsl_glob_vs, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_GS) - addSourceCode(hlsl_glob_gs, sh.text, parser); + addSourceCode(hlsl_glob_gs, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_DS) - addSourceCode(hlsl_glob_ds, sh.text, parser); + addSourceCode(hlsl_glob_ds, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_HS) - addSourceCode(hlsl_glob_hs, sh.text, parser); + addSourceCode(hlsl_glob_hs, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_MS) - addSourceCode(hlsl_glob_ms, sh.text, parser); + addSourceCode(hlsl_glob_ms, sh.text, parser, need_file_idx); if (hlsl_types & HLSL_AS) - addSourceCode(hlsl_glob_as, sh.text, parser); + addSourceCode(hlsl_glob_as, sh.text, parser, need_file_idx); } #undef REPORT_ERR diff --git a/prog/tools/ShaderCompiler2/shsem.h b/prog/tools/ShaderCompiler2/shsem.h index 599c37310..d74297fbe 100644 --- a/prog/tools/ShaderCompiler2/shsem.h +++ b/prog/tools/ShaderCompiler2/shsem.h @@ -73,24 +73,25 @@ class ShaderBoolEvalCB virtual int eval_interval_value(const char *ival_name) = 0; virtual void decl_bool_alias(const char *name, bool_expr &expr) {} virtual int add_message(const char *message, bool file_name) { return 0; } + virtual int is_debug_mode_enabled() { return false; } }; void eval_shader(shader_decl &sh, ShaderEvalCB &cb); ShVarBool eval_shader_bool(bool_expr &, ShaderBoolEvalCB &cb); -void add_shader(shader_decl *, ShaderSyntaxParser &); +void add_shader(shader_decl *, ShaderSyntaxParser &, bool &out_shaderDebugModeEnabled); void add_block(block_decl *, ShaderSyntaxParser &); // add a global bool var void add_global_bool(ShaderTerminal::bool_decl &bool_var, ShaderTerminal::ShaderSyntaxParser &parser); -void add_hlsl(hlsl_global_decl_class &, ShaderSyntaxParser &); +void add_hlsl(hlsl_global_decl_class &, ShaderSyntaxParser &, bool need_file_idx); void build_bool_expr_string(bool_expr &e, String &out, bool clr_str = true); -void addSourceCode(String &text, SHTOK_hlsl_text *source_text, ShaderSyntaxParser &parser); -void addSourceCode(String &text, Symbol *term, const char *source_text, ShaderSyntaxParser &parser); +void addSourceCode(String &text, SHTOK_hlsl_text *source_text, ShaderSyntaxParser &parser, bool need_file_idx); +void addSourceCode(String &text, Symbol *term, const char *source_text, ShaderSyntaxParser &parser, bool need_file_idx); bool_expr *parse_condition(const char *cond_str, int cond_str_len, const char *file_name, int line); shader_stat *parse_shader_stat(const char *stat_str, int stat_str_len, IMemAlloc *alloc = nullptr); diff --git a/prog/tools/ShaderCompiler2/winmain_con.cpp b/prog/tools/ShaderCompiler2/winmain_con.cpp index 311b49cc3..26c0e975c 100644 --- a/prog/tools/ShaderCompiler2/winmain_con.cpp +++ b/prog/tools/ShaderCompiler2/winmain_con.cpp @@ -53,7 +53,7 @@ static const char *get_debug_fname() else SNPRINTF(log_fn, sizeof(log_fn), "%s.c/%s.log", log_prefix, __argv[i + 1]); for (char *p = log_fn + strlen(log_prefix) + (log_dir ? strlen(log_dir) + 1 : 0) + 3; *p; p++) - if (*p == '\\' || *p == '/') + if (strchr("\\/:", *p)) *p = '_'; dd_mkpath(log_fn); return log_fn; diff --git a/prog/tools/libTools/EditorCore/ec_ViewportWindowStatSettingsDialog.cpp b/prog/tools/libTools/EditorCore/ec_ViewportWindowStatSettingsDialog.cpp index df33a416c..f7b13662e 100644 --- a/prog/tools/libTools/EditorCore/ec_ViewportWindowStatSettingsDialog.cpp +++ b/prog/tools/libTools/EditorCore/ec_ViewportWindowStatSettingsDialog.cpp @@ -6,8 +6,6 @@ #include #include -using hdpi::_pxScaled; - ViewportWindowStatSettingsDialog::ViewportWindowStatSettingsDialog(ViewportWindow &_viewport, bool *_rootEnable, hdpi::Px width, hdpi::Px height) : DialogWindow(nullptr, width, height, "Viewport stat display settings"), @@ -23,7 +21,7 @@ PropPanel::TLeafHandle ViewportWindowStatSettingsDialog::addGroup(int group, con { PropPanel::ContainerPropertyControl *panel = getPanel(); G_ASSERT(panel); - tree = panel->createTreeCheckbox(CM_STATS_SETTINGS_TREE, "", _pxScaled(380), /*new_line*/ false, /*icons_show*/ true); + tree = panel->createTreeCheckbox(CM_STATS_SETTINGS_TREE, "", hdpi::Px(0), /*new_line*/ false, /*icons_show*/ true); root = tree->createTreeLeaf(nullptr, "Show stats", nullptr); tree->setBool(root, true); tree->setCheckboxValue(root, *rootEnable); @@ -215,15 +213,3 @@ void ViewportWindowStatSettingsDialog::onChange(int pcb_id, PropPanel::Container if (changed) updateColors(); } - -void ViewportWindowStatSettingsDialog::updateImguiDialog() -{ - const float panelHeight = getButtonPanelHeight(); - if (panelHeight > 0.0f) - { - const float treeHeight = ImGui::GetContentRegionAvail().y - panelHeight - ImGui::GetStyle().ItemSpacing.y; - tree->setHeight(hdpi::Px(treeHeight)); - } - - DialogWindow::updateImguiDialog(); -} \ No newline at end of file diff --git a/prog/tools/libTools/EditorCore/ec_outlinerModel.h b/prog/tools/libTools/EditorCore/ec_outlinerModel.h index fbeab76d2..a2d8ecb0e 100644 --- a/prog/tools/libTools/EditorCore/ec_outlinerModel.h +++ b/prog/tools/libTools/EditorCore/ec_outlinerModel.h @@ -750,7 +750,7 @@ class OutlinerModel private: ska::flat_hash_map objectToTreeItemMap; OutlinerTreeItem *focusedTreeItem = nullptr; // Use getSelectionHead() instead! - int selectionCountPerItemType[OutlinerTreeItem::ItemType::Count]; + int selectionCountPerItemType[(int)OutlinerTreeItem::ItemType::Count]; bool showAssetNameUnderObjects = true; }; diff --git a/prog/tools/libTools/propPanel/commonWindow/colorDialog.cpp b/prog/tools/libTools/propPanel/commonWindow/colorDialog.cpp index 80c4fd395..6255c55ef 100644 --- a/prog/tools/libTools/propPanel/commonWindow/colorDialog.cpp +++ b/prog/tools/libTools/propPanel/commonWindow/colorDialog.cpp @@ -225,8 +225,8 @@ class ColorNameDialogImgui : public DialogWindow, public ICustomControl CPPalette ColorDialog::palette; int ColorDialog::rb_sel = ID_RADIO_H; -ColorDialog::ColorDialog(void *phandle, const char caption[], E3DCOLOR color) : - DialogWindow(phandle, _pxScaled(760), _pxScaled(370), caption, false) +ColorDialog::ColorDialog(void *phandle, const char caption[], E3DCOLOR color, hdpi::Px w, hdpi::Px h) : + DialogWindow(phandle, w, h, caption, false) { setColor(color); fillPanel(ColorDialog::getPanel()); diff --git a/prog/tools/libTools/propPanel/commonWindow/dialogWindow.cpp b/prog/tools/libTools/propPanel/commonWindow/dialogWindow.cpp index 5f2630585..ad54abc77 100644 --- a/prog/tools/libTools/propPanel/commonWindow/dialogWindow.cpp +++ b/prog/tools/libTools/propPanel/commonWindow/dialogWindow.cpp @@ -312,10 +312,6 @@ void DialogWindow::updateImguiDialog() // NOTE: ImGui porting: BeginChild did not fare well with auto sizing, so using manual bottom alignment for the buttons. // Good test dialogs: Viewport grid settings vs. Settings/Camera settings vs Settings/Project settings. - const float regionAvailYStart = ImGui::GetContentRegionAvail().y; - const float windowFluffHeight = ImGui::GetWindowHeight() - regionAvailYStart; // Border, title bar, padding, ... - const float minimumContentHeight = initialHeight - windowFluffHeight; // initialHeight is the minimum height of the window. - // This needs to saved because otherwise ImGui::GetFrameHeightWithSpacing() could return an incorrect value when // queried from a child control. (For example ContainerPropertyControl::updateImgui changes the // vertical spacing.) @@ -324,7 +320,30 @@ void DialogWindow::updateImguiDialog() buttonPanelHeight = buttonsVisible ? (ImGui::GetFrameHeightWithSpacing() + separatorHeightWithSpacing) : 0.0f; if (propertiesPanel) - propertiesPanel->updateImgui(); + { + const ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoBackground; + + // Render without the child window while auto sizing to get the required size. Size determination did not work + // correctly with BeginChild, so using a roundabout way. + if (autoSizingRequestedForFrames > 0) + { + // Allocate the space for the child window too. + ImGui::BeginChild("c", ImVec2(1.0f, 1.0f), ImGuiChildFlags_None, windowFlags); + ImGui::EndChild(); + + propertiesPanel->updateImgui(); + } + else + { + const float regionAvailYStart = ImGui::GetContentRegionAvail().y; + const float propertiesPanelHeight = max(regionAvailYStart - buttonPanelHeight - ImGui::GetStyle().ItemSpacing.y, 0.0f); + + // "c" stands for child. It could be anything. + if (ImGui::BeginChild("c", ImVec2(0.0f, propertiesPanelHeight), ImGuiChildFlags_None, windowFlags)) + propertiesPanel->updateImgui(); + ImGui::EndChild(); + } + } if (buttonsVisible) { diff --git a/prog/tools/libTools/propPanel/control/panelWindow.cpp b/prog/tools/libTools/propPanel/control/panelWindow.cpp index 30ec67717..58d10f33c 100644 --- a/prog/tools/libTools/propPanel/control/panelWindow.cpp +++ b/prog/tools/libTools/propPanel/control/panelWindow.cpp @@ -42,6 +42,8 @@ PanelWindowPropertyControl::PanelWindowPropertyControl(int id, ControlEventHandl ContainerPropertyControl(id, event_handler, parent, x, y, w, h), controlCaption(caption) {} +PanelWindowPropertyControl::~PanelWindowPropertyControl() {} + int PanelWindowPropertyControl::getScrollPos() { ImGuiWindow *window = ImGui::FindWindowByName(controlCaption); diff --git a/prog/tools/libTools/shaderResBuilder/rendInstResSrc.cpp b/prog/tools/libTools/shaderResBuilder/rendInstResSrc.cpp index 9f42bb11d..92be6dfed 100644 --- a/prog/tools/libTools/shaderResBuilder/rendInstResSrc.cpp +++ b/prog/tools/libTools/shaderResBuilder/rendInstResSrc.cpp @@ -855,7 +855,7 @@ static void remove_parameter_from_mat_script(eastl::string &script, const eastl: return; size_t end = script.find("\n", start); - script.erase(start, end); + script.erase(start, end - start); } bool RenderableInstanceLodsResSrc::addLod(int lod_index, const char *filename, real range, LodsEqualMaterialGather &mat_gather, diff --git a/prog/tools/sceneTools/assetExp/exporters/exp_rendInst.cpp b/prog/tools/sceneTools/assetExp/exporters/exp_rendInst.cpp index 4e60c1608..a2caa3c1f 100644 --- a/prog/tools/sceneTools/assetExp/exporters/exp_rendInst.cpp +++ b/prog/tools/sceneTools/assetExp/exporters/exp_rendInst.cpp @@ -26,7 +26,7 @@ class RendInstExporter : public IDagorAssetExporter virtual unsigned __stdcall getGameResClassId() const { return RendInstGameResClassId; } virtual unsigned __stdcall getGameResVersion() const { - const int ord_ver = 3; + const int ord_ver = 4; const int base_ver = 26 + ord_ver * 6 + (splitMatToDescBin && !shadermeshbuilder_strip_d3dres ? 3 : 0); return base_ver + (ShaderMeshData::preferZstdPacking ? (ShaderMeshData::allowOodlePacking ? 2 : 1) : 0); } diff --git a/prog/tools/sceneTools/daEditorX/de_ProjectSettings.cpp b/prog/tools/sceneTools/daEditorX/de_ProjectSettings.cpp index 2869aefe2..4c80c8c32 100644 --- a/prog/tools/sceneTools/daEditorX/de_ProjectSettings.cpp +++ b/prog/tools/sceneTools/daEditorX/de_ProjectSettings.cpp @@ -33,7 +33,7 @@ //============================================================================== ProjectSettingsDlg::ProjectSettingsDlg(void *phandle, bool &use_dir_light) : - DialogWindow(phandle, hdpi::_pxScaled(500), hdpi::_pxScaled(750), "Project settings") + DialogWindow(phandle, hdpi::_pxScaled(550), hdpi::_pxScaled(750), "Project settings") { PropPanel::ContainerPropertyControl *_panel = getPanel(); G_ASSERT(_panel && "No panel in CamerasConfigDlg"); diff --git a/prog/tools/sceneTools/daEditorX/de_startdlg.cpp b/prog/tools/sceneTools/daEditorX/de_startdlg.cpp index 16cdc35b8..21678cbcc 100644 --- a/prog/tools/sceneTools/daEditorX/de_startdlg.cpp +++ b/prog/tools/sceneTools/daEditorX/de_startdlg.cpp @@ -60,6 +60,7 @@ StartupDlg::StartupDlg(const char *caption, DeWorkspace &wsp, const char *wsp_bl mPanel->createRadioGroup(ID_GROUP, "Select action:"); reloadWsp(); + autoSize(/*auto_center = */ false); } diff --git a/prog/tools/shaderInfo/jamfile b/prog/tools/shaderInfo/jamfile index 6dabdace0..48ae30c9f 100644 --- a/prog/tools/shaderInfo/jamfile +++ b/prog/tools/shaderInfo/jamfile @@ -29,6 +29,7 @@ UseProgLibs = engine/lib3d engine/drv/drv3d_null 3rdPartyLibs/eastl + 3rdPartyLibs/hash/BLAKE3 engine/shaders engine/perfMon/daProfilerStub ; diff --git a/prog/tools/shaderInfo/shaderInfo.cpp b/prog/tools/shaderInfo/shaderInfo.cpp index 6b8b9ddbe..57dc4ac67 100644 --- a/prog/tools/shaderInfo/shaderInfo.cpp +++ b/prog/tools/shaderInfo/shaderInfo.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -14,12 +15,14 @@ #include #include #include +#include +#define USE_SHA1_HASH 0 static void showUsage() { - printf("\nUsage:\n shaderInfo-dev.exe [out] [-asm] [-variants] [-stcode] [-shader:]\n"); + printf("\nUsage:\n shaderInfo-dev.exe [out] [-asm] [-shaders:] [-variants] [-stcode] [-shader:]\n"); } -static void dumpCurrentShaders(bool dump_asm, bool dump_variants, bool dump_stcode, const char *single_shader); +static void dumpCurrentShaders(bool dump_asm, bool dump_variants, bool dump_stcode, const char *single_shader, const char *sh_dir); int DagorWinMain(bool debugmode) { @@ -33,12 +36,15 @@ int DagorWinMain(bool debugmode) } const char *output_log_fn = "shader_dump"; bool out_asm = false; + const char *out_shaders = nullptr; bool out_variants = false; bool out_stcode = false; const char *single_shader = nullptr; for (int i = 2; i < __argc; i++) if (strcmp(__argv[i], "-asm") == 0) out_asm = true; + else if (strncmp(__argv[i], "-shaders:", 9) == 0) + out_shaders = __argv[i] + 9; else if (strcmp(__argv[i], "-variants") == 0) out_variants = true; else if (strcmp(__argv[i], "-stcode") == 0) @@ -70,17 +76,19 @@ int DagorWinMain(bool debugmode) printf("loaded binary dump %s (memSize=%uK), dumping contents to: \"%s\" [VARS SHADERS %s %s %s], %d shaders, %d globvars\n", __argv[1], (uint32_t)(shBinDumpOwner().getDumpSize() >> 10), output_log_fn, out_variants ? "VARIANT_TABLES" : "", out_asm ? "ASM" : "", out_stcode ? "STCODE" : "", (int)shBinDump().classes.size(), shBinDump().globVars.v.size()); + if (out_shaders) + printf("(dumping shaders with content-like names to folder: %s/ )\n", out_shaders); if (single_shader) printf("(dumping only contents of <%s> shader)\n", single_shader); int t0 = get_time_msec(); - dumpCurrentShaders(out_asm, out_variants, out_stcode, single_shader); + dumpCurrentShaders(out_asm, out_variants, out_stcode, single_shader, out_shaders); printf("\ndumped for %.1f seconds\n", (get_time_msec() - t0) / 1000.0f); return 0; } #include -static void disassembleShader(dag::ConstSpan native_code) +static void disassembleShader(dag::ConstSpan native_code, const char *out_fn = nullptr) { if (native_code.empty()) return; @@ -103,8 +111,16 @@ static void disassembleShader(dag::ConstSpan native_code) } if (hr == S_OK && disassembly && disassembly->GetBufferPointer() && *(char *)disassembly->GetBufferPointer()) - debug("%s", disassembly->GetBufferPointer()); - else + { + if (out_fn) + { + FullFileSaveCB cwr(out_fn); + cwr.write(disassembly->GetBufferPointer(), disassembly->GetBufferSize()); + } + else + debug("%s", disassembly->GetBufferPointer()); + } + else if (!out_fn) { String dump_str(native_code.size() * 3 + 64, " [%d words]\n", native_code.size()); for (const uint32_t *c = native_code.data(), *c_e = c + native_code.size(); c < c_e; c += 16) @@ -125,7 +141,53 @@ static void disassembleShader(dag::ConstSpan native_code) disassembly->Release(); } -static void dumpCurrentShaders(bool dump_asm, bool dump_variants, bool dump_stcode, const char *single_shader) +static String mk_str_cat3(const char *s1, const char *s2, const char *s3) +{ + String s; + s.setStrCat3(s1, s2, s3); + return s; +} + +static String mk_str_cat4(const char *s1, const char *s2, const char *s3, const char *s4) +{ + String s; + s.setStrCat4(s1, s2, s3, s4); + return s; +} + +#if USE_SHA1_HASH +#include +#define HASH_SIZE 20 +#define HASH_CONTEXT sha1_context +#define HASH_UPDATE sha1_update +#define HASH_INIT sha1_starts +#define HASH_FINISH sha1_finish + +#else +#include + +#define HASH_SIZE 32 +inline void blake3_finalize_32(const blake3_hasher *h, unsigned char *hash) { blake3_hasher_finalize(h, hash, HASH_SIZE); } +#define HASH_CONTEXT blake3_hasher +#define HASH_UPDATE blake3_hasher_update +#define HASH_INIT blake3_hasher_init +#define HASH_FINISH blake3_finalize_32 +#endif +static String calc_sha1(dag::ConstSpan native_code) +{ + HASH_CONTEXT sha1; + unsigned char srcSha1[HASH_SIZE]; + + HASH_INIT(&sha1); + HASH_UPDATE(&sha1, (const unsigned char *)native_code.data(), data_size(native_code)); + HASH_FINISH(&sha1, srcSha1); + + String s; + data_to_str_hex(s, srcSha1, sizeof(srcSha1)); + return s; +} + +static void dumpCurrentShaders(bool dump_asm, bool dump_variants, bool dump_stcode, const char *single_shader, const char *sh_dir) { if (single_shader) { @@ -166,8 +228,34 @@ static void dumpCurrentShaders(bool dump_asm, bool dump_variants, bool dump_stco debug("\nmaxreg count = %d\n", shBinDump().maxRegSize); - if (!dump_asm) + if (!dump_asm && !sh_dir) debug("\n******* %d vertex shaders\n******* %d pixel shaders", shBinDump().vprId.size(), shBinDump().fshId.size()); + else if (sh_dir) + { + ShaderBytecode tmpbuf; + debug(""); + dd_mkdir(String::mk_str_cat(sh_dir, "/vs")); + for (int i = 0; i < shBinDump().vprId.size(); i++) + { + String sha1 = calc_sha1(shBinDumpOwner().getCode(i, ShaderCodeType::VERTEX, tmpbuf)); + debug("Vertex shader --v%d-- %s/vs/%s (%d bytes)", i, sh_dir, sha1, data_size(tmpbuf)); + FullFileSaveCB cwr(mk_str_cat3(sh_dir, "/vs/", sha1)); + cwr.write(tmpbuf.data(), data_size(tmpbuf)); + if (dump_asm) + disassembleShader(tmpbuf, mk_str_cat4(sh_dir, "/vs/", sha1, ".asm")); + } + + dd_mkdir(String::mk_str_cat(sh_dir, "/ps")); + for (int i = 0; i < shBinDump().fshId.size(); i++) + { + String sha1 = calc_sha1(shBinDumpOwner().getCode(i, ShaderCodeType::PIXEL, tmpbuf)); + debug("Pixel shader --p%d-- %s/ps/%s (%d bytes)", i, sh_dir, sha1, data_size(tmpbuf)); + FullFileSaveCB cwr(mk_str_cat3(sh_dir, "/ps/", sha1)); + cwr.write(tmpbuf.data(), data_size(tmpbuf)); + if (dump_asm) + disassembleShader(tmpbuf, mk_str_cat4(sh_dir, "/ps/", sha1, ".asm")); + } + } else { ShaderBytecode tmpbuf; diff --git a/prog/tools/sharedInclude/EditorCore/ec_ViewportWindowStatSettingsDialog.h b/prog/tools/sharedInclude/EditorCore/ec_ViewportWindowStatSettingsDialog.h index b94f03682..e2a9c94cf 100644 --- a/prog/tools/sharedInclude/EditorCore/ec_ViewportWindowStatSettingsDialog.h +++ b/prog/tools/sharedInclude/EditorCore/ec_ViewportWindowStatSettingsDialog.h @@ -38,7 +38,6 @@ class ViewportWindowStatSettingsDialog : public PropPanel::DialogWindow void updateColors(); virtual void onChange(int pcb_id, PropPanel::ContainerPropertyControl *panel) override; - virtual void updateImguiDialog() override; ViewportWindow &viewport; }; diff --git a/prog/tools/sharedInclude/propPanel/commonWindow/colorDialog.h b/prog/tools/sharedInclude/propPanel/commonWindow/colorDialog.h index fe3ef1a01..45e657c89 100644 --- a/prog/tools/sharedInclude/propPanel/commonWindow/colorDialog.h +++ b/prog/tools/sharedInclude/propPanel/commonWindow/colorDialog.h @@ -69,7 +69,8 @@ class CPPalette class ColorDialog : public DialogWindow, public ICustomControl { public: - ColorDialog(void *phandle, const char caption[], E3DCOLOR color); + ColorDialog(void *phandle, const char caption[], E3DCOLOR color, hdpi::Px w = hdpi::_pxScaled(760), + hdpi::Px h = hdpi::_pxScaled(390)); ~ColorDialog(); // DialogWindow diff --git a/prog/tools/sharedInclude/propPanel/control/panelWindow.h b/prog/tools/sharedInclude/propPanel/control/panelWindow.h index 4e2ac7518..03a7670c0 100644 --- a/prog/tools/sharedInclude/propPanel/control/panelWindow.h +++ b/prog/tools/sharedInclude/propPanel/control/panelWindow.h @@ -18,6 +18,7 @@ class PanelWindowPropertyControl : public ContainerPropertyControl public: PanelWindowPropertyControl(int id, ControlEventHandler *event_handler, ContainerPropertyControl *parent, int x, int y, hdpi::Px w, hdpi::Px h, const char caption[]); + ~PanelWindowPropertyControl(); virtual unsigned getTypeMaskForSet() const override { return CONTROL_CAPTION; } virtual unsigned getTypeMaskForGet() const override { return 0; } diff --git a/samples/skiesSample/prog/test_app.cpp b/samples/skiesSample/prog/test_app.cpp index 0e9363103..618cc02b8 100644 --- a/samples/skiesSample/prog/test_app.cpp +++ b/samples/skiesSample/prog/test_app.cpp @@ -417,6 +417,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub const int reflW = width / 6, reflH = height / 6; + daSkies.initSky(); PreparedSkiesParams refl_params; // required for each point of view (or the only one if panorama, for panorama center) refl_pov_data = @@ -442,8 +443,6 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub if (global_cls_drv_pnt) global_cls_drv_pnt->getDevice(0)->setClipRect(0, 0, width, height); - daSkies.initSky(); - createMainPovData(); PreparedSkiesParams cubeParams; @@ -460,7 +459,9 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub waterFoamTexId = ::get_tex_gameres(foamTexName); // mem leak G_ASSERTF(waterFoamTexId != BAD_TEXTUREID, "water foam texture '%s' not found.", foamTexName); static ShaderVariableInfo foam_tex("foam_tex"); + static ShaderVariableInfo foam_tex_samplerstate("foam_tex_samplerstate", true); foam_tex.set_texture(waterFoamTexId); + foam_tex_samplerstate.set_sampler(get_texture_separate_sampler(waterFoamTexId)); } { @@ -468,7 +469,9 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub perlinTexId = ::get_tex_gameres(perlinName); // mem leak G_ASSERTF(perlinTexId != BAD_TEXTUREID, "water perlin noise texture '%s' not found.", perlinName); static ShaderVariableInfo perlin_noise("perlin_noise"); + static ShaderVariableInfo perlin_noise_samplerstate("perlin_noise_samplerstate", true); perlin_noise.set_texture(perlinTexId); + perlin_noise_samplerstate.set_sampler(get_texture_separate_sampler(perlinTexId)); } { @@ -1040,6 +1043,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub } HeightmapRenderer heightmapRenderer; UniqueTexHolder heightmap; + d3d::SamplerHandle heightmapSampler; float heightmapCellSize = 1.f, heightmapScale = 1.f, heightmapMin = 0.f, hmapMaxHt = 1.f; @@ -1079,7 +1083,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub return; heightmap.setVar(); static ShaderVariableInfo hmap_ldetail("hmap_ldetail", true); + static ShaderVariableInfo hmap_ldetail_samplerstate("hmap_ldetail_samplerstate", true); + static ShaderVariableInfo heightmap_samplerstate("heightmap_samplerstate", true); hmap_ldetail.set_texture(heightmap.getTexId()); + hmap_ldetail_samplerstate.set_sampler(heightmapSampler); + heightmap_samplerstate.set_sampler(heightmapSampler); heightmapRenderer.render(lodGrid, defaultCullData); } @@ -1267,8 +1275,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .handle(); registry.read("ssr_target").texture().atStage(dabfg::Stage::PS).bindToShaderVar(); + registry.read("ssr_target_sampler").blob().bindToShaderVar("ssr_target_samplerstate"); registry.read("ssao_tex").texture().atStage(dabfg::Stage::PS).bindToShaderVar(); + registry.read("ssao_sampler").blob().bindToShaderVar("ssao_tex_samplerstate"); registry.read("csm").texture().atStage(dabfg::Stage::PS).bindToShaderVar("shadow_cascade_depth_tex"); + registry.read("csm_sampler").blob().bindToShaderVar("shadow_cascade_depth_tex_samplerstate"); auto resShading = eastl::make_unique("deferred_shading"); return [this, depthHandle, resolvedHandle, mainViewRes, camHndl, resolveShading = eastl::move(resShading)]() { @@ -1344,7 +1355,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .handle(); auto prevFddHandle = registry.readTextureHistory("far_downsampled_depth") .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("prev_downsampled_far_depth_tex") + .useAs(dabfg::Usage::SHADER_RESOURCE) .handle(); return [this, camHndl, mainSkiesDataHndl, fddHandle, prevFddHandle]() { @@ -1360,10 +1371,6 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub auto mainSkiesDataHndl = registry.read("main_cam_skies_data").blob().handle(); registry.read("far_downsampled_depth").texture().atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("downsampled_far_depth_tex"); - registry.historyFor("far_downsampled_depth") - .texture() - .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("prev_downsampled_far_depth_tex"); auto resolvedFrameHndl = registry.modify("resolved_frame").texture().atStage(dabfg::Stage::POST_RASTER).useAs(dabfg::Usage::COLOR_ATTACHMENT).handle(); @@ -1377,8 +1384,6 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub const auto &cam = camHndl.ref(); - depthHndl.view()->texfilter(TEXFILTER_POINT); - daSkies.renderSky(mainSkiesDataHndl.ref(), cam.viewTm, cam.projTm, cam.persp, true, aurora.get()); }; }); @@ -1390,10 +1395,6 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .atStage(dabfg::Stage::PS_OR_CS) .bindToShaderVar("downsampled_far_depth_tex") .handle(); - auto prevFddHandle = registry.readTextureHistory("far_downsampled_depth") - .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("prev_downsampled_far_depth_tex") - .handle(); auto mainSkiesDataHndl = registry.read("main_cam_skies_data").blob().handle(); @@ -1403,18 +1404,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub auto depthHndl = eastl::move(depthReq).atStage(dabfg::Stage::POST_RASTER).useAs(dabfg::Usage::DEPTH_ATTACHMENT_AND_SHADER_RESOURCE).handle(); - return [depthHndl, fddHandle, prevFddHandle, mainSkiesDataHndl, camHndl, this]() { + return [depthHndl, fddHandle, mainSkiesDataHndl, camHndl, this]() { const auto &cam = camHndl.ref(); - fddHandle.view()->texfilter(TEXFILTER_POINT); - prevFddHandle.view()->texfilter(TEXFILTER_LINEAR); - prevFddHandle.view()->texaddr(TEXADDR_CLAMP); - depthHndl.view()->texfilter(TEXFILTER_POINT); - daSkies.renderClouds(render_panel.infinite_skies, fddHandle.view(), depthHndl.d3dResId(), mainSkiesDataHndl.ref(), cam.viewTm, cam.projTm); - - prevFddHandle.view()->texaddr(TEXADDR_BORDER); }; }); @@ -1429,14 +1423,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub bind_camera(registry, "main_camera"); registry.readTexture("downsampled_normals").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar(); - auto fddHandle = registry.readTexture("far_downsampled_depth") - .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("downsampled_far_depth_tex") - .handle(); - auto prevFddHandle = registry.readTextureHistory("far_downsampled_depth") - .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("prev_downsampled_far_depth_tex") - .handle(); + registry.readTexture("far_downsampled_depth").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("downsampled_far_depth_tex"); uint32_t fmt = 0; SSRQuality tmpQuality = SSRQuality::Low; @@ -1449,14 +1436,14 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .atStage(dabfg::Stage::PS_OR_CS) .useAs(dabfg::Usage::COLOR_ATTACHMENT) .handle(); + registry.create("ssr_target_sampler", dabfg::History::No) + .blob(d3d::request_sampler({})) + .bindToShaderVar("ssr_target_samplerstate"); auto ssrTargetHistHndl = registry.historyFor("ssr_target").texture().atStage(dabfg::Stage::PS_OR_CS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); auto ssr = eastl::make_unique(width / 2, height / 2, 1, fmt, SSRQuality::Low, SSRFlag::None); - return [this, fddHandle, prevFddHandle, ssrTargetHndl, ssrTargetHistHndl, ssr = eastl::move(ssr)]() { - fddHandle.view()->texfilter(TEXFILTER_POINT); - prevFddHandle.view()->texfilter(TEXFILTER_LINEAR); - + return [this, ssrTargetHndl, ssrTargetHistHndl, ssr = eastl::move(ssr)]() { TMatrix itm; curCamera->getInvViewMatrix(itm); const DPoint3 worldPos = DPoint3(itm.getcol(3)); @@ -1474,14 +1461,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub bind_camera(registry, "main_camera"); registry.readTexture("downsampled_normals").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar(); + registry.read("downsampled_normals_sampler").blob().bindToShaderVar("downsampled_normals_samplerstate"); auto fddHandle = registry.readTexture("far_downsampled_depth") .atStage(dabfg::Stage::PS_OR_CS) .bindToShaderVar("downsampled_far_depth_tex") .handle(); - auto prevFddHandle = registry.readTextureHistory("far_downsampled_depth") - .atStage(dabfg::Stage::PS_OR_CS) - .bindToShaderVar("prev_downsampled_far_depth_tex") - .handle(); const auto halfMainViewRes = registry.getResolution<2>("main_view", 0.5f); const auto fmt = ssao_detail::creation_flags_to_format(SSAO_NONE); @@ -1495,17 +1479,24 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub auto ssaoHistHndl = registry.historyFor("ssao_tex").texture().atStage(dabfg::Stage::PS).useAs(dabfg::Usage::SHADER_RESOURCE).handle(); + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + smpInfo.border_color = d3d::BorderColor::Color::OpaqueWhite; + registry.create("ssao_sampler", dabfg::History::No) + .blob(d3d::request_sampler(smpInfo)) + .bindToShaderVar("ssao_tex_samplerstate") + .bindToShaderVar("ssao_prev_tex_samplerstate"); + } + auto ssaoTmpHndl = registry.create("ssao_tmp_tex", dabfg::History::No) .texture({fmt | TEXCF_RTARGET, halfMainViewRes}) .atStage(dabfg::Stage::PS) .useAs(dabfg::Usage::COLOR_ATTACHMENT) .handle(); - auto ssao = eastl::make_unique(width / 2, height / 2, 1, SSAO_NONE, false); - return [this, fddHandle, prevFddHandle, ssaoHndl, ssaoHistHndl, ssaoTmpHndl, ssao = eastl::move(ssao)]() { - fddHandle.view()->texfilter(TEXFILTER_POINT); - prevFddHandle.view()->texfilter(TEXFILTER_LINEAR); - + auto ssao = eastl::make_unique(width / 2, height / 2, 1, SSAO_SKIP_RANDOM_PATTERN_GENERATION, false); + return [this, fddHandle, ssaoHndl, ssaoHistHndl, ssaoTmpHndl, ssao = eastl::move(ssao)]() { TMatrix itm; curCamera->getInvViewMatrix(itm); const DPoint3 worldPos = DPoint3(itm.getcol(3)); @@ -1536,6 +1527,12 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .atStage(dabfg::Stage::POST_RASTER) .useAs(dabfg::Usage::DEPTH_ATTACHMENT) .handle(); + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + smpInfo.filter_mode = d3d::FilterMode::Compare; + registry.create("csm_sampler", dabfg::History::No).blob(d3d::request_sampler(smpInfo)); + } return [this, csmHndl]() { auto csmView = csmHndl.view(); csm->renderShadowsCascadesCb( @@ -1545,8 +1542,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub }, csmView); - csmView->texfilter(TEXFILTER_COMPARE); - csmView->texaddr(TEXADDR_CLAMP); + csmView->disableSampler(); }; }); return result; @@ -1586,6 +1582,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub .atStage(dabfg::Stage::POST_RASTER) .useAs(dabfg::Usage::COLOR_ATTACHMENT) .handle(); + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + registry.create("downsampled_normals_sampler", dabfg::History::No).blob(d3d::request_sampler(smpInfo)); + } // downsampled depth uint32_t numMips = min(get_log2w(width / 2), get_log2w(height / 2)) - 1; @@ -1609,11 +1610,6 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub return [gbufDepthHandle, farDownsampledDepthHandle, downsampledNormalsHandle, this]() { auto farDownsampledDepth = farDownsampledDepthHandle.view(); - // TODO: move this to texture properties - farDownsampledDepth.getTex2D()->texaddr(TEXADDR_BORDER); - farDownsampledDepth.getTex2D()->texbordercolor(0); - farDownsampledDepth.getTex2D()->texfilter(TEXFILTER_POINT); - TIME_D3D_PROFILE(downsample_depth); downsample_depth::downsample(gbufDepthHandle.view(), width, height, farDownsampledDepth, ManagedTexView{} /* closest_depth */, @@ -1646,6 +1642,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub result.renderPostFx = dabfg::register_node("render_postfx", DABFG_PP_NODE_SRC, [this](dabfg::Registry registry) { registry.readTexture("color_for_transparent").atStage(dabfg::Stage::PS).bindToShaderVar("frame_tex"); + registry.create("frame_sampler", dabfg::History::No).blob(d3d::request_sampler({})).bindToShaderVar("frame_tex_samplerstate"); registry.requestRenderPass().color({"backbuffer"}); @@ -1796,6 +1793,9 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub registry.requestRenderPass().color({reflTexReq}); registry.readTexture("water_reflection_tex_temp").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar(); + registry.create("water_reflection_tex_temp_sampler", dabfg::History::No) + .blob(d3d::request_sampler({})) + .bindToShaderVar("water_reflection_tex_temp_samplerstate"); return [this, clipWaterReflection = PostFxRenderer("clip_water_reflection")]() { clipWaterReflection.render(); }; }); @@ -1812,10 +1812,19 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub result.render = dabfg::register_node("render_water", DABFG_PP_NODE_SRC, [this](dabfg::Registry registry) { auto camHndl = bind_camera(registry, "main_camera").handle(); - auto fddHandle = - registry.readTexture("far_downsampled_depth").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("depth_tex").handle(); + registry.readTexture("far_downsampled_depth").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("depth_tex"); + { + d3d::SamplerInfo smpInfo; + smpInfo.filter_mode = d3d::FilterMode::Point; + registry.create("water_fdd_sampler", dabfg::History::No) + .blob(d3d::request_sampler(smpInfo)) + .bindToShaderVar("depth_tex_samplerstate"); + } (registry.root() / "water_refl").readTexture("water_reflection_tex").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar(); + registry.create("water_reflection_tex_sampler", dabfg::History::No) + .blob(d3d::request_sampler({})) + .bindToShaderVar("water_reflection_tex_samplerstate"); registry.setPriority(-100); registry.requestRenderPass().color({"color_for_transparent"}).depthRo("depth_for_transparent"); @@ -1823,10 +1832,11 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub registry.requestState().allowWireframe(); registry.readTextureHistory("prev_frame").atStage(dabfg::Stage::PS_OR_CS).bindToShaderVar("water_refraction_tex"); + registry.create("water_refraction_tex_sampler", dabfg::History::No) + .blob(d3d::request_sampler({})) + .bindToShaderVar("water_refraction_tex_samplerstate"); - return [fddHandle, camHndl, this]() { - fddHandle.view()->texfilter(TEXFILTER_POINT); - + return [camHndl, this]() { if (!(fftWater && water_panel.enabled)) return; @@ -2005,7 +2015,9 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub } } static ShaderVariableInfo envi_probe_specular("envi_probe_specular", true); + static ShaderVariableInfo envi_probe_specular_samplerstate("envi_probe_specular_samplerstate", true); envi_probe_specular.set_texture(light_probe::getManagedTex(enviProbe.get())->getTexId()); + envi_probe_specular_samplerstate.set_sampler(d3d::request_sampler({})); } IGameCamera *curCamera; // for console made publuc @@ -2546,6 +2558,11 @@ wind_dep0(S[0].windDependency), wind_dep1(S[1].windDependency), wind_dep2(S[2].w }; virtual void releaseJob() { delete this; } }; + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + heightmapSampler = d3d::request_sampler(smpInfo); + } heightmap.close(); water_panel.water_level = dgs_get_settings()->getReal("heightmapWaterLevel", water_panel.water_level); diff --git a/samples/testGI/prog/test_app.cpp b/samples/testGI/prog/test_app.cpp index 4f6e66f9b..62fc2b0ca 100644 --- a/samples/testGI/prog/test_app.cpp +++ b/samples/testGI/prog/test_app.cpp @@ -134,47 +134,57 @@ typedef StrmSceneHolder scene_type_t; #define SKY_GUI 1 #define TEST_GUI 0 -#define GLOBAL_VARS_LIST \ - VAR(new_ambient) \ - VAR(new_screen_specular) \ - VAR(prev_ambient_age) \ - VAR(prev_ambient) \ - VAR(prev_screen_specular) \ - VAR(screen_ambient) \ - VAR(ambient_reproject) \ - VAR(prev_gbuffer_depth) \ - VAR(screen_specular) \ - VAR(voxelize_world_to_rasterize_space_mul) \ - VAR(voxelize_world_to_rasterize_space_add) \ - VAR(water_level) \ - VAR(dynamic_lights_count) \ - VAR(zn_zfar) \ - VAR(view_vecLT) \ - VAR(view_vecRT) \ - VAR(view_vecLB) \ - VAR(view_vecRB) \ - VAR(world_view_pos) \ - VAR(upscale_half_res_depth_tex) \ - VAR(lowres_tex_size) \ - VAR(downsampled_far_depth_tex) \ - VAR(prev_downsampled_far_depth_tex) \ - VAR(downsampled_close_depth_tex) \ - VAR(prev_downsampled_close_depth_tex) \ - VAR(downsampled_normals) \ - VAR(prev_downsampled_normals) \ - VAR(from_sun_direction) \ - VAR(rasterize_collision_type) \ - VAR(downsample_depth_type) \ - VAR(local_light_probe_tex) \ - VAR(envi_probe_specular) - -#define GLOBAL_VARS_OPT_LIST \ - VAR(gbuffer_for_treesabove) \ - VAR(downsampled_checkerboard_depth_tex) \ - VAR(sphere_time) \ - VAR(prev_globtm_psf_0) \ - VAR(prev_globtm_psf_1) \ - VAR(prev_globtm_psf_2) \ +#define GLOBAL_VARS_LIST \ + VAR(new_ambient) \ + VAR(new_screen_specular) \ + VAR(prev_ambient_age) \ + VAR(prev_ambient) \ + VAR(prev_screen_specular) \ + VAR(screen_ambient) \ + VAR(ambient_reproject) \ + VAR(prev_gbuffer_depth) \ + VAR(screen_specular) \ + VAR(voxelize_world_to_rasterize_space_mul) \ + VAR(voxelize_world_to_rasterize_space_add) \ + VAR(water_level) \ + VAR(dynamic_lights_count) \ + VAR(zn_zfar) \ + VAR(view_vecLT) \ + VAR(view_vecRT) \ + VAR(view_vecLB) \ + VAR(view_vecRB) \ + VAR(world_view_pos) \ + VAR(upscale_half_res_depth_tex) \ + VAR(upscale_half_res_depth_tex_samplerstate) \ + VAR(lowres_tex_size) \ + VAR(downsampled_far_depth_tex) \ + VAR(downsampled_far_depth_tex_samplerstate) \ + VAR(prev_downsampled_far_depth_tex) \ + VAR(prev_downsampled_far_depth_tex_samplerstate) \ + VAR(downsampled_close_depth_tex) \ + VAR(downsampled_close_depth_tex_samplerstate) \ + VAR(prev_downsampled_close_depth_tex) \ + VAR(prev_downsampled_close_depth_tex_samplerstate) \ + VAR(downsampled_normals) \ + VAR(downsampled_normals_samplerstate) \ + VAR(prev_downsampled_normals) \ + VAR(prev_downsampled_normals_samplerstate) \ + VAR(from_sun_direction) \ + VAR(rasterize_collision_type) \ + VAR(downsample_depth_type) \ + VAR(local_light_probe_tex) \ + VAR(envi_probe_specular) \ + VAR(local_light_probe_tex_samplerstate) \ + VAR(envi_probe_specular_samplerstate) + +#define GLOBAL_VARS_OPT_LIST \ + VAR(gbuffer_for_treesabove) \ + VAR(downsampled_checkerboard_depth_tex) \ + VAR(downsampled_checkerboard_depth_tex_samplerstate) \ + VAR(sphere_time) \ + VAR(prev_globtm_psf_0) \ + VAR(prev_globtm_psf_1) \ + VAR(prev_globtm_psf_2) \ VAR(prev_globtm_psf_3) #define VAR(a) static ShaderVariableInfo a##VarId(#a, true); @@ -473,8 +483,6 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace ShaderGlobal::set_texture(downsampled_far_depth_texVarId, farDownsampledDepth[currentDownsampledDepth]); ShaderGlobal::set_texture(prev_downsampled_far_depth_texVarId, farDownsampledDepth[1 - currentDownsampledDepth]); - downsampled_close_depth_tex[currentDownsampledDepth]->texaddr(TEXADDR_CLAMP); - ShaderGlobal::set_texture(downsampled_close_depth_texVarId, downsampled_close_depth_tex[currentDownsampledDepth]); ShaderGlobal::set_texture(prev_downsampled_close_depth_texVarId, downsampled_close_depth_tex[1 - currentDownsampledDepth]); ShaderGlobal::set_texture(downsampled_normalsVarId, downsampledNormals[currentDownsampledDepth]); @@ -646,8 +654,10 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace { prevFrame.close(); prevFrame = dag::create_tex(NULL, frameInfo.w / 2, frameInfo.h / 2, frameInfo.cflg, 1, "prev_frame_tex"); - prevFrame->texaddr(TEXADDR_CLAMP); - // prevFrame.getTex2D()->texfilter(TEXFILTER_POINT); + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + ShaderGlobal::set_sampler(get_shader_variable_id("prev_frame_tex_samplerstate"), d3d::request_sampler(smpInfo)); + prevFrame->disableSampler(); } } @@ -718,6 +728,7 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace combined_shadows.close(); combined_shadows = dag::create_tex(NULL, w, h, TEXFMT_L8 | TEXCF_RTARGET, 1, "combined_shadows"); + ShaderGlobal::set_sampler(get_shader_variable_id("combined_shadows_samplerstate"), d3d::request_sampler({})); debugTexOverlay.setTargetSize(Point2(w, h)); int halfW = w / 2, halfH = h / 2; @@ -754,21 +765,43 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace { String name(128, "far_downsampled_depth%d", i); farDownsampledDepth[i] = dag::create_tex(NULL, w / 2, h / 2, rfmt | TEXCF_RTARGET, numMips, name); - farDownsampledDepth[i]->texaddr(TEXADDR_BORDER); - farDownsampledDepth[i]->texbordercolor(0); - farDownsampledDepth[i]->texfilter(TEXFILTER_POINT); - farDownsampledDepth[i]->texmipmap(TEXMIPMAP_POINT); + farDownsampledDepth[i]->disableSampler(); downsampled_close_depth_tex[i].close(); name.printf(128, "close_downsampled_depth%d", i); downsampled_close_depth_tex[i] = dag::create_tex(NULL, w / 2, h / 2, rfmt | TEXCF_RTARGET, numMips, name); - downsampled_close_depth_tex[i]->texaddr(TEXADDR_CLAMP); - downsampled_close_depth_tex[i]->texfilter(TEXFILTER_POINT); - downsampled_close_depth_tex[i]->texmipmap(TEXMIPMAP_POINT); + downsampled_close_depth_tex[i]->disableSampler(); name.printf(128, "close_downsampled_normals%d", i); downsampledNormals[i].close(); downsampledNormals[i] = dag::create_tex(NULL, w / 2, h / 2, TEXCF_RTARGET, 1, name); // TEXFMT_A2B10G10R10 | - downsampledNormals[i]->texaddr(TEXADDR_CLAMP); + downsampledNormals[i]->disableSampler(); + } + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Border; + smpInfo.border_color = d3d::BorderColor::Color::TransparentBlack; + smpInfo.filter_mode = d3d::FilterMode::Point; + smpInfo.mip_map_mode = d3d::MipMapMode::Point; + d3d::SamplerHandle smp = d3d::request_sampler(smpInfo); + ShaderGlobal::set_sampler(downsampled_far_depth_tex_samplerstateVarId, smp); + ShaderGlobal::set_sampler(prev_downsampled_far_depth_tex_samplerstateVarId, smp); + } + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + smpInfo.filter_mode = d3d::FilterMode::Point; + smpInfo.mip_map_mode = d3d::MipMapMode::Point; + d3d::SamplerHandle smp = d3d::request_sampler(smpInfo); + ShaderGlobal::set_sampler(downsampled_close_depth_tex_samplerstateVarId, smp); + ShaderGlobal::set_sampler(prev_downsampled_close_depth_tex_samplerstateVarId, smp); + ShaderGlobal::set_sampler(upscale_half_res_depth_tex_samplerstateVarId, smp); + } + { + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + d3d::SamplerHandle smp = d3d::request_sampler(smpInfo); + ShaderGlobal::set_sampler(downsampled_normals_samplerstateVarId, smp); + ShaderGlobal::set_sampler(prev_downsampled_normals_samplerstateVarId, smp); } upscale_tex.reset(); upscale_tex.reset(new UpscaleSamplingTex(w, h, "close_")); @@ -778,6 +811,7 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace downsampled_checkerboard_depth_tex = dag::create_tex(NULL, w / 2, h / 2, rfmt | TEXCF_RTARGET, 1, "downsampled_checkerboard_depth_tex"); ShaderGlobal::set_texture(downsampled_checkerboard_depth_texVarId, downsampled_checkerboard_depth_tex.getTexId()); + ShaderGlobal::set_sampler(downsampled_checkerboard_depth_tex_samplerstateVarId, d3d::request_sampler({})); } uint32_t rtFmt = TEXFMT_R11G11B10F; if (!(d3d::get_texformat_usage(rtFmt) & d3d::USAGE_RTARGET)) @@ -785,8 +819,10 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace if (!prevFrame) { prevFrame = dag::create_tex(NULL, w / 2, h / 2, rtFmt | TEXCF_RTARGET, 1, "prev_frame_tex"); - prevFrame->texaddr(TEXADDR_CLAMP); - // prevFrame.getTex2D()->texfilter(TEXFILTER_POINT); + d3d::SamplerInfo smpInfo; + smpInfo.address_mode_u = smpInfo.address_mode_v = smpInfo.address_mode_w = d3d::AddressMode::Clamp; + ShaderGlobal::set_sampler(get_shader_variable_id("prev_frame_tex_samplerstate"), d3d::request_sampler(smpInfo)); + prevFrame->disableSampler(); } frame.close(); frame = dag::create_tex(NULL, w, h, rtFmt | TEXCF_RTARGET, 1, "frame_tex"); @@ -794,6 +830,8 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace taaHistory[1].close(); taaHistory[0] = dag::create_tex(NULL, w, h, rtFmt | TEXCF_RTARGET, 1, "taa_history_tex"); taaHistory[1] = dag::create_tex(NULL, w, h, rtFmt | TEXCF_RTARGET, 1, "taa_history_tex2"); + ShaderGlobal::set_sampler(get_shader_variable_id("taa_history_tex_samplerstate"), d3d::request_sampler({})); + ShaderGlobal::set_sampler(get_shader_variable_id("frame_tex_samplerstate"), d3d::request_sampler({})); if (use_snapdragon_super_resolution) { int fw, fh; @@ -1325,9 +1363,11 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace { int taaHistoryI = taaFrame & 1; d3d::set_render_target(taaHistory[1 - taaHistoryI].getTex2D(), 0); - frame->texfilter(TEXFILTER_POINT); ShaderGlobal::set_texture(get_shader_variable_id("taa_history_tex"), taaHistory[taaHistoryI]); ShaderGlobal::set_texture(get_shader_variable_id("taa_frame_tex"), frame); + d3d::SamplerInfo smpInfo; + smpInfo.filter_mode = d3d::FilterMode::Point; + ShaderGlobal::set_sampler(get_shader_variable_id("taa_frame_tex_samplerstate"), d3d::request_sampler(smpInfo)); taaRender.render(); ShaderGlobal::set_texture(frame.getVarId(), taaHistory[1 - taaHistoryI]); } @@ -2044,6 +2084,8 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace UniqueTex enviProbe0; void initEnviProbe() { + local_light_probe_tex_samplerstateVarId.set_sampler(d3d::request_sampler({})); + envi_probe_specular_samplerstateVarId.set_sampler(d3d::request_sampler({})); enviProbe0.close(); enviProbe0 = dag::create_cubetex(64, TEXCF_RTARGET | TEXFMT_A16B16G16R16F | TEXCF_GENERATEMIPS | TEXCF_CLEAR_ON_CREATE, 1, "envi_probe_specular0"); @@ -2399,9 +2441,6 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace TIME_D3D_PROFILE(envi) TMatrix itm; curCamera->getInvViewMatrix(itm); - target->getDepth()->texfilter(TEXFILTER_POINT); - farDownsampledDepth[currentDownsampledDepth]->texfilter(TEXFILTER_POINT); - farDownsampledDepth[1 - currentDownsampledDepth]->texaddr(TEXADDR_CLAMP); TMatrix view; d3d::gettm(TM_VIEW, view); TMatrix4 projTm; @@ -2411,7 +2450,6 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace daSkies.renderEnvi(render_panel.infinite_skies, dpoint3(itm.getcol(3)), dpoint3(itm.getcol(2)), 3, farDownsampledDepth[currentDownsampledDepth], farDownsampledDepth[1 - currentDownsampledDepth], target->getDepthId(), main_pov_data, view, projTm, persp); - farDownsampledDepth[1 - currentDownsampledDepth].getTex2D()->texaddr(TEXADDR_BORDER); } struct FilePanel { @@ -2839,7 +2877,7 @@ class DemoGameScene final : public DagorGameScene, public IRenderDynamicCubeFace if (bvhLruMeshBase) { - bvh::update_instances(bvhCtx, Point3::ZERO, Frustum(), nullptr, nullptr); + bvh::update_instances(bvhCtx, Point3::ZERO, Frustum(), nullptr, nullptr, nullptr); auto accept = [](auto) { return LRUCollision::ObjectClass::Accept; }; auto addInstance = [this](size_t i, mat43f_cref tm, bbox3f_cref, bbox3f_cref) {