#include "Datoviz_Observation_Json.hpp" #include #include namespace aethera::mcp { nlohmann::json datoviz_observation_json( const render_3d::Datoviz_Frame_Observation& value) { const auto milliseconds = [](std::uint64_t nanoseconds) { return static_cast(nanoseconds) / 1'000'000.0; }; nlohmann::json result{ {"render_sequence", value.render_sequence}, {"path", magic_enum::enum_name(value.path)}, {"gpu_timing_requested", value.gpu_timing_requested}, {"readback_requested", value.readback_requested}, {"controller_input_applied", value.controller_input_applied}, { "prepare_released_after_submission", value.prepare_released_after_submission }, { "timings_ms", { {"queue_submit_wait", milliseconds(value.queue_submit_wait_ns)}, {"target_acquire", milliseconds(value.target_acquire_ns)}, {"structure_check", milliseconds(value.structure_check_ns)}, {"apply", milliseconds(value.apply_ns)}, {"query", milliseconds(value.query_ns)}, {"runtime_plan", milliseconds(value.runtime_plan_ns)}, {"runtime_plan_cpu", milliseconds(value.runtime_plan_cpu_ns)}, {"runtime_execute", milliseconds(value.runtime_execute_ns)}, {"runtime_execute_cpu", milliseconds(value.runtime_execute_cpu_ns)}, {"mvp_update", milliseconds(value.mvp_update_ns)}, {"frame_begin", milliseconds(value.frame_begin_ns)}, {"frame_plan", milliseconds(value.frame_plan_ns)}, {"frame_plan_cpu", milliseconds(value.frame_plan_cpu_ns)}, {"emit_replay_dirty", milliseconds(value.emit_replay_dirty_ns)}, {"emit_layout", milliseconds(value.emit_layout_ns)}, {"emit_prepare", milliseconds(value.emit_prepare_ns)}, {"emit_plan_build", milliseconds(value.emit_plan_build_ns)}, {"emit_contract", milliseconds(value.emit_contract_ns)}, {"emit_stream", milliseconds(value.emit_stream_ns)}, {"emit_stream_freeze", milliseconds(value.emit_stream_freeze_ns)}, {"emit_commit", milliseconds(value.emit_commit_ns)}, {"emit_plan_reset", milliseconds(value.emit_plan_reset_ns)}, {"emit_artifact_create", milliseconds(value.emit_artifact_create_ns)}, {"emit_artifact_freeze", milliseconds(value.emit_artifact_freeze_ns)}, {"emit_packet_encode", milliseconds(value.emit_packet_encode_ns)}, {"external_register", milliseconds(value.external_register_ns)}, {"frame_attach", milliseconds(value.frame_attach_ns)}, {"frame_execute", milliseconds(value.frame_execute_ns)}, {"frame_execute_cpu", milliseconds(value.frame_execute_cpu_ns)}, {"frame_finish", milliseconds(value.frame_finish_ns)}, {"drp_validation", milliseconds(value.drp_validation_ns)}, {"drp_state", milliseconds(value.drp_state_ns)}, {"drp_buffer_create", milliseconds(value.drp_buffer_create_ns)}, {"drp_texture_create", milliseconds(value.drp_texture_create_ns)}, {"drp_shader_create", milliseconds(value.drp_shader_create_ns)}, {"drp_shader_compile", milliseconds(value.drp_shader_compile_ns)}, {"drp_shader_module_create", milliseconds(value.drp_shader_module_create_ns)}, {"drp_pipeline_create", milliseconds(value.drp_pipeline_create_ns)}, {"drp_binding_create", milliseconds(value.drp_binding_create_ns)}, {"drp_upload", milliseconds(value.drp_upload_ns)}, {"drp_transfer", milliseconds(value.drp_transfer_ns)}, {"drp_record", milliseconds(value.drp_record_ns)}, {"submit", milliseconds(value.submit_ns)}, {"gpu_completion_observation", milliseconds(value.gpu_completion_observation_ns)}, {"completion_task_queue", milliseconds(value.completion_task_queue_ns)}, {"readback", milliseconds(value.readback_ns)} } }, { "traffic", { {"uploaded_bytes", value.uploaded_bytes}, {"readback_bytes", value.readback_bytes}, {"pipeline_create_count", value.drp_pipeline_create_count} } }, { "frame_plan", { {"resource_version", value.artifact_resource_version}, {"frame_index", value.artifact_frame_index}, {"status", value.artifact_status} } }, { "validation", { {"performed", value.validation_performed}, {"ok", value.validation_ok}, {"code", value.validation_code}, {"command_index", value.validation_command_index} } } }; if (value.gpu) { result["gpu_ms"] = { {"render", milliseconds(value.gpu->render_ns)}, {"transition", milliseconds(value.gpu->transition_ns)}, {"copy", milliseconds(value.gpu->copy_ns)}, {"total", milliseconds(value.gpu->total_ns)} }; } if (!value.artifact_json.empty()) result["frame_plan"]["artifact_json"] = value.artifact_json; return result; } }