blob: 731fa8f986d6fc2c7b61dc46a9286161d8071dc2 [file] [edit]
// Copyright 2022 The clvk authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "tracing.hpp"
#include "config.hpp"
#include "queue.hpp"
#ifdef CLVK_PERFETTO_ENABLE
PERFETTO_TRACK_EVENT_STATIC_STORAGE();
#ifdef CLVK_PERFETTO_BACKEND_INPROCESS
static std::unique_ptr<perfetto::TracingSession> gTracingSession;
#endif
#endif // CLVK_PERFETTO_ENABLE
void init_tracing() {
#ifdef CLVK_PERFETTO_ENABLE
perfetto::TracingInitArgs args;
#ifdef CLVK_PERFETTO_BACKEND_INPROCESS
args.backends |= perfetto::kInProcessBackend;
#else
args.backends |= perfetto::kSystemBackend;
#endif
perfetto::Tracing::Initialize(args);
perfetto::TrackEvent::Register();
#ifdef CLVK_PERFETTO_BACKEND_INPROCESS
perfetto::protos::gen::TrackEventConfig track_event_cfg;
perfetto::TraceConfig cfg;
cfg.add_buffers()->set_size_kb(config.perfetto_trace_max_size);
auto* ds_cfg = cfg.add_data_sources()->mutable_config();
ds_cfg->set_name("track_event");
ds_cfg->set_track_event_config_raw(track_event_cfg.SerializeAsString());
gTracingSession = perfetto::Tracing::NewTrace();
gTracingSession->Setup(cfg);
gTracingSession->StartBlocking();
#endif
#endif // CLVK_PERFETTO_ENABLE
}
void term_tracing() {
#ifdef CLVK_PERFETTO_ENABLE
#ifdef CLVK_PERFETTO_BACKEND_INPROCESS
gTracingSession->StopBlocking();
std::vector<char> trace_data(gTracingSession->ReadTraceBlocking());
std::ofstream output;
output.open(config.perfetto_trace_dest, std::ios::out | std::ios::binary);
output.write(&trace_data[0], trace_data.size());
output.close();
#else
perfetto::TrackEvent::Flush();
#endif
#endif // CLVK_PERFETTO_ENABLE
}