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',
   ),