Files
Aethera/mcp/core/runtime/Datoviz_Observation_Json.cpp

110 lines
5.4 KiB
C++

#include "Datoviz_Observation_Json.hpp"
#include <magic_enum/magic_enum.hpp>
#include <nlohmann/json.hpp>
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<double>(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;
}
}