Update GPU proto
- Add GpuCounterDescriptor to DataSourceDescriptor.
- Change counter value to double.
Change-Id: Ie8ea4f0eb5a9e39972a805b1534353d7d84110ed
diff --git a/Android.bp b/Android.bp
index dbc57c5..36bb2bc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -954,6 +954,7 @@
"protos/perfetto/common/commit_data_request.proto",
"protos/perfetto/common/data_source_descriptor.proto",
"protos/perfetto/common/descriptor.proto",
+ "protos/perfetto/common/gpu_counter_descriptor.proto",
"protos/perfetto/common/observable_events.proto",
"protos/perfetto/common/sys_stats_counters.proto",
"protos/perfetto/common/trace_stats.proto",
@@ -968,6 +969,7 @@
"external/perfetto/protos/perfetto/common/commit_data_request.pb.cc",
"external/perfetto/protos/perfetto/common/data_source_descriptor.pb.cc",
"external/perfetto/protos/perfetto/common/descriptor.pb.cc",
+ "external/perfetto/protos/perfetto/common/gpu_counter_descriptor.pb.cc",
"external/perfetto/protos/perfetto/common/observable_events.pb.cc",
"external/perfetto/protos/perfetto/common/sys_stats_counters.pb.cc",
"external/perfetto/protos/perfetto/common/trace_stats.pb.cc",
@@ -983,6 +985,7 @@
"protos/perfetto/common/commit_data_request.proto",
"protos/perfetto/common/data_source_descriptor.proto",
"protos/perfetto/common/descriptor.proto",
+ "protos/perfetto/common/gpu_counter_descriptor.proto",
"protos/perfetto/common/observable_events.proto",
"protos/perfetto/common/sys_stats_counters.proto",
"protos/perfetto/common/trace_stats.proto",
@@ -997,6 +1000,7 @@
"external/perfetto/protos/perfetto/common/commit_data_request.pb.h",
"external/perfetto/protos/perfetto/common/data_source_descriptor.pb.h",
"external/perfetto/protos/perfetto/common/descriptor.pb.h",
+ "external/perfetto/protos/perfetto/common/gpu_counter_descriptor.pb.h",
"external/perfetto/protos/perfetto/common/observable_events.pb.h",
"external/perfetto/protos/perfetto/common/sys_stats_counters.pb.h",
"external/perfetto/protos/perfetto/common/trace_stats.pb.h",
@@ -1015,6 +1019,7 @@
"protos/perfetto/common/commit_data_request.proto",
"protos/perfetto/common/data_source_descriptor.proto",
"protos/perfetto/common/descriptor.proto",
+ "protos/perfetto/common/gpu_counter_descriptor.proto",
"protos/perfetto/common/observable_events.proto",
"protos/perfetto/common/sys_stats_counters.proto",
"protos/perfetto/common/trace_stats.proto",
@@ -1030,6 +1035,7 @@
"external/perfetto/protos/perfetto/common/commit_data_request.pbzero.cc",
"external/perfetto/protos/perfetto/common/data_source_descriptor.pbzero.cc",
"external/perfetto/protos/perfetto/common/descriptor.pbzero.cc",
+ "external/perfetto/protos/perfetto/common/gpu_counter_descriptor.pbzero.cc",
"external/perfetto/protos/perfetto/common/observable_events.pbzero.cc",
"external/perfetto/protos/perfetto/common/sys_stats_counters.pbzero.cc",
"external/perfetto/protos/perfetto/common/trace_stats.pbzero.cc",
@@ -1045,6 +1051,7 @@
"protos/perfetto/common/commit_data_request.proto",
"protos/perfetto/common/data_source_descriptor.proto",
"protos/perfetto/common/descriptor.proto",
+ "protos/perfetto/common/gpu_counter_descriptor.proto",
"protos/perfetto/common/observable_events.proto",
"protos/perfetto/common/sys_stats_counters.proto",
"protos/perfetto/common/trace_stats.proto",
@@ -1060,6 +1067,7 @@
"external/perfetto/protos/perfetto/common/commit_data_request.pbzero.h",
"external/perfetto/protos/perfetto/common/data_source_descriptor.pbzero.h",
"external/perfetto/protos/perfetto/common/descriptor.pbzero.h",
+ "external/perfetto/protos/perfetto/common/gpu_counter_descriptor.pbzero.h",
"external/perfetto/protos/perfetto/common/observable_events.pbzero.h",
"external/perfetto/protos/perfetto/common/sys_stats_counters.pbzero.h",
"external/perfetto/protos/perfetto/common/trace_stats.pbzero.h",
diff --git a/include/perfetto/tracing/core/data_source_descriptor.h b/include/perfetto/tracing/core/data_source_descriptor.h
index 8e96b0d..3df53c9 100644
--- a/include/perfetto/tracing/core/data_source_descriptor.h
+++ b/include/perfetto/tracing/core/data_source_descriptor.h
@@ -81,11 +81,19 @@
handles_incremental_state_clear_ = value;
}
+ const std::string& gpu_counter_descriptor_raw() const {
+ return gpu_counter_descriptor_;
+ }
+ void set_gpu_counter_descriptor_raw(const std::string& raw) {
+ gpu_counter_descriptor_ = raw;
+ }
+
private:
std::string name_{};
bool will_notify_on_stop_{};
bool will_notify_on_start_{};
bool handles_incremental_state_clear_{};
+ std::string gpu_counter_descriptor_; // [lazy=true]
// Allows to preserve unknown protobuf fields for compatibility
// with future versions of .proto files.
diff --git a/protos/BUILD b/protos/BUILD
index 3705c24..78eb883 100644
--- a/protos/BUILD
+++ b/protos/BUILD
@@ -32,6 +32,7 @@
"perfetto/common/commit_data_request.proto",
"perfetto/common/data_source_descriptor.proto",
"perfetto/common/descriptor.proto",
+ "perfetto/common/gpu_counter_descriptor.proto",
"perfetto/common/observable_events.proto",
"perfetto/common/sys_stats_counters.proto",
"perfetto/common/trace_stats.proto",
@@ -75,6 +76,7 @@
"perfetto/common/commit_data_request.proto",
"perfetto/common/data_source_descriptor.proto",
"perfetto/common/descriptor.proto",
+ "perfetto/common/gpu_counter_descriptor.proto",
"perfetto/common/observable_events.proto",
"perfetto/common/sys_stats_counters.proto",
"perfetto/common/trace_stats.proto",
diff --git a/protos/perfetto/common/BUILD.gn b/protos/perfetto/common/BUILD.gn
index e70b03c..88b9a26 100644
--- a/protos/perfetto/common/BUILD.gn
+++ b/protos/perfetto/common/BUILD.gn
@@ -21,6 +21,7 @@
"commit_data_request.proto",
"data_source_descriptor.proto",
"descriptor.proto",
+ "gpu_counter_descriptor.proto",
"observable_events.proto",
"sys_stats_counters.proto",
"tracing_service_state.proto",
diff --git a/protos/perfetto/common/data_source_descriptor.proto b/protos/perfetto/common/data_source_descriptor.proto
index 08ed058..1c8cd49 100644
--- a/protos/perfetto/common/data_source_descriptor.proto
+++ b/protos/perfetto/common/data_source_descriptor.proto
@@ -19,6 +19,8 @@
package perfetto.protos;
+import "perfetto/common/gpu_counter_descriptor.proto";
+
// When editing this file run ./tools/gen_tracing_cpp_headers_from_protos.py
// to reflect changes in the corresponding C++ headers.
@@ -42,4 +44,7 @@
// set if the data source writes packets that refer to previous trace
// contents, and knows how to stop referring to the already-emitted data.
optional bool handles_incremental_state_clear = 4;
+
+ // Optional specification about available GPU counters.
+ optional GpuCounterDescriptor gpu_counter_descriptor = 5 [lazy = true];
}
diff --git a/protos/perfetto/common/gpu_counter_descriptor.proto b/protos/perfetto/common/gpu_counter_descriptor.proto
new file mode 100644
index 0000000..7e2401e
--- /dev/null
+++ b/protos/perfetto/common/gpu_counter_descriptor.proto
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * 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.
+ */
+
+syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+
+package perfetto.protos;
+
+// Description of GPU counters.
+// This message is sent by a GPU counter producer to specify the counters available in the hardware.
+message GpuCounterDescriptor {
+ message GpuCounterSpec {
+ optional uint32 counter_id = 1;
+ optional string name = 2;
+ optional string description = 3;
+ }
+ repeated GpuCounterSpec specs = 1;
+}
diff --git a/protos/perfetto/trace/gpu/gpu_counter_event.proto b/protos/perfetto/trace/gpu/gpu_counter_event.proto
index 59eb069..0a1d103 100644
--- a/protos/perfetto/trace/gpu/gpu_counter_event.proto
+++ b/protos/perfetto/trace/gpu/gpu_counter_event.proto
@@ -19,20 +19,20 @@
package perfetto.protos;
+import "perfetto/common/gpu_counter_descriptor.proto";
+
message GpuCounterEvent {
// The first trace packet of each session should include counter_spec.
- message GpuCounterSpec {
- optional uint32 counter_id = 1;
- optional string name = 2;
- optional string description = 3;
- }
- repeated GpuCounterSpec counter_specs = 1;
+ optional GpuCounterDescriptor counter_descriptor = 1;
message GpuCounter {
// required. Identifier for counter.
optional uint32 counter_id = 1;
// required. Value of the counter.
- optional int64 value = 2;
+ oneof value {
+ int64 int_value = 2;
+ double double_value = 3;
+ }
}
repeated GpuCounter counters = 2;
}
diff --git a/src/trace_processor/proto_trace_parser.cc b/src/trace_processor/proto_trace_parser.cc
index 18a8877..7e0f672 100644
--- a/src/trace_processor/proto_trace_parser.cc
+++ b/src/trace_processor/proto_trace_parser.cc
@@ -42,6 +42,7 @@
#include "src/trace_processor/variadic.h"
#include "perfetto/common/android_log_constants.pbzero.h"
+#include "perfetto/common/gpu_counter_descriptor.pbzero.h"
#include "perfetto/common/trace_stats.pbzero.h"
#include "perfetto/ext/base/string_writer.h"
#include "perfetto/trace/android/android_log.pbzero.h"
@@ -1948,9 +1949,10 @@
void ProtoTraceParser::ParseGpuCounterEvent(int64_t ts, ConstBytes blob) {
protos::pbzero::GpuCounterEvent::Decoder event(blob.data, blob.size);
+ protos::pbzero::GpuCounterDescriptor::Decoder desc(event.counter_descriptor());
// Add counter spec to ID map.
- for (auto it = event.counter_specs(); it; ++it) {
- protos::pbzero::GpuCounterEvent_GpuCounterSpec::Decoder spec(it->data(), it->size());
+ for (auto it = desc.specs(); it; ++it) {
+ protos::pbzero::GpuCounterDescriptor_GpuCounterSpec::Decoder spec(it->data(), it->size());
if (!spec.has_counter_id()) {
PERFETTO_ELOG("Counter spec missing counter id");
context_->storage->IncrementStats(stats::gpu_counters_invalid_spec);
@@ -1978,9 +1980,8 @@
for (auto it = event.counters(); it; ++it) {
protos::pbzero::GpuCounterEvent_GpuCounter::Decoder counter(it->data(), it->size());
- if (counter.has_counter_id() && counter.has_value()) {
+ if (counter.has_counter_id() && (counter.has_int_value() || counter.has_double_value())) {
auto counter_id = counter.counter_id();
- auto value = counter.value();
// Check missing counter_id
if (gpu_counter_ids_.find(counter_id) == gpu_counter_ids_.end()) {
char buffer[64];
@@ -1993,8 +1994,13 @@
context_->storage->InternString(writer.GetStringView()));
context_->storage->IncrementStats(stats::gpu_counters_missing_spec);
}
- context_->event_tracker->PushCounter(
- ts, value, gpu_counter_ids_[counter_id], 0, RefType::kRefGpuId);
+ if (counter.has_int_value()) {
+ context_->event_tracker->PushCounter(
+ ts, counter.int_value(), gpu_counter_ids_[counter_id], 0, RefType::kRefGpuId);
+ } else {
+ context_->event_tracker->PushCounter(
+ ts, counter.double_value(), gpu_counter_ids_[counter_id], 0, RefType::kRefGpuId);
+ }
}
}
}
diff --git a/src/tracing/core/data_source_descriptor.cc b/src/tracing/core/data_source_descriptor.cc
index 9879be1..daf747d 100644
--- a/src/tracing/core/data_source_descriptor.cc
+++ b/src/tracing/core/data_source_descriptor.cc
@@ -49,7 +49,8 @@
(will_notify_on_stop_ == other.will_notify_on_stop_) &&
(will_notify_on_start_ == other.will_notify_on_start_) &&
(handles_incremental_state_clear_ ==
- other.handles_incremental_state_clear_);
+ other.handles_incremental_state_clear_) &&
+ (gpu_counter_descriptor_ == other.gpu_counter_descriptor_);
}
#pragma GCC diagnostic pop
@@ -82,6 +83,8 @@
handles_incremental_state_clear_ =
static_cast<decltype(handles_incremental_state_clear_)>(
proto.handles_incremental_state_clear());
+
+ gpu_counter_descriptor_ = proto.gpu_counter_descriptor().SerializeAsString();
unknown_fields_ = proto.unknown_fields();
}
@@ -112,6 +115,9 @@
proto->set_handles_incremental_state_clear(
static_cast<decltype(proto->handles_incremental_state_clear())>(
handles_incremental_state_clear_));
+
+ proto->mutable_gpu_counter_descriptor()->ParseFromString(
+ gpu_counter_descriptor_);
*(proto->mutable_unknown_fields()) = unknown_fields_;
}
diff --git a/tools/install-build-deps b/tools/install-build-deps
index 9527465..a3a9196 100755
--- a/tools/install-build-deps
+++ b/tools/install-build-deps
@@ -195,8 +195,8 @@
# Example traces for regression tests.
('buildtools/test_data.zip',
- 'https://storage.googleapis.com/perfetto/test-data-20190624-145359.zip',
- '05a430cc85a62db14608a86157c64f3795acdfbf',
+ 'https://storage.googleapis.com/perfetto/test-data-20190627-112237.zip',
+ 'e43e0622db13d81603f8bc6a88fe39958e4182db',
'all',
),