Add new protobuf for SurfaceFlinger graphics frame events.

Test: Manually tested
Change-Id: I269c6a3e023c337e13631bc1dcf087f4ac7f7913
diff --git a/Android.bp b/Android.bp
index 7be3725..0000e25 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1411,6 +1411,7 @@
   name: "perfetto_protos_perfetto_trace_android_lite_gen",
   srcs: [
     "protos/perfetto/trace/android/android_log.proto",
+    "protos/perfetto/trace/android/graphics_frame_event.proto",
     "protos/perfetto/trace/android/packages_list.proto",
   ],
   tools: [
@@ -1419,6 +1420,7 @@
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
   out: [
     "external/perfetto/protos/perfetto/trace/android/android_log.pb.cc",
+    "external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pb.cc",
     "external/perfetto/protos/perfetto/trace/android/packages_list.pb.cc",
   ],
 }
@@ -1428,6 +1430,7 @@
   name: "perfetto_protos_perfetto_trace_android_lite_gen_headers",
   srcs: [
     "protos/perfetto/trace/android/android_log.proto",
+    "protos/perfetto/trace/android/graphics_frame_event.proto",
     "protos/perfetto/trace/android/packages_list.proto",
   ],
   tools: [
@@ -1436,6 +1439,7 @@
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
   out: [
     "external/perfetto/protos/perfetto/trace/android/android_log.pb.h",
+    "external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pb.h",
     "external/perfetto/protos/perfetto/trace/android/packages_list.pb.h",
   ],
   export_include_dirs: [
@@ -1448,6 +1452,7 @@
   name: "perfetto_protos_perfetto_trace_android_zero_gen",
   srcs: [
     "protos/perfetto/trace/android/android_log.proto",
+    "protos/perfetto/trace/android/graphics_frame_event.proto",
     "protos/perfetto/trace/android/packages_list.proto",
   ],
   tools: [
@@ -1457,6 +1462,7 @@
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_protozero_plugin___gn_standalone_toolchain_gcc_like_host_) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/protos $(in)",
   out: [
     "external/perfetto/protos/perfetto/trace/android/android_log.pbzero.cc",
+    "external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.cc",
   ],
 }
@@ -1466,6 +1472,7 @@
   name: "perfetto_protos_perfetto_trace_android_zero_gen_headers",
   srcs: [
     "protos/perfetto/trace/android/android_log.proto",
+    "protos/perfetto/trace/android/graphics_frame_event.proto",
     "protos/perfetto/trace/android/packages_list.proto",
   ],
   tools: [
@@ -1475,6 +1482,7 @@
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_protozero_plugin___gn_standalone_toolchain_gcc_like_host_) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/protos $(in)",
   out: [
     "external/perfetto/protos/perfetto/trace/android/android_log.pbzero.h",
+    "external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pbzero.h",
     "external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.h",
   ],
   export_include_dirs: [
diff --git a/protos/BUILD b/protos/BUILD
index 0c88c40..873da66 100644
--- a/protos/BUILD
+++ b/protos/BUILD
@@ -418,6 +418,7 @@
     name = "trace_android",
     srcs = [
         "perfetto/trace/android/android_log.proto",
+        "perfetto/trace/android/graphics_frame_event.proto",
         "perfetto/trace/android/packages_list.proto",
     ],
     has_services = 1,
@@ -458,6 +459,7 @@
     name = "trace_android_zero",
     srcs = [
         "perfetto/trace/android/android_log.proto",
+        "perfetto/trace/android/graphics_frame_event.proto",
         "perfetto/trace/android/packages_list.proto",
     ],
     deps = [
diff --git a/protos/perfetto/trace/android/BUILD.gn b/protos/perfetto/trace/android/BUILD.gn
index 72a3e3c..9a382aa 100644
--- a/protos/perfetto/trace/android/BUILD.gn
+++ b/protos/perfetto/trace/android/BUILD.gn
@@ -18,6 +18,7 @@
 
 android_proto_names = [
   "android_log.proto",
+  "graphics_frame_event.proto",
   "packages_list.proto",
 ]
 
diff --git a/protos/perfetto/trace/android/graphics_frame_event.proto b/protos/perfetto/trace/android/graphics_frame_event.proto
new file mode 100644
index 0000000..68248f9
--- /dev/null
+++ b/protos/perfetto/trace/android/graphics_frame_event.proto
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+// Generated by Android's SurfaceFlinger.
+message GraphicsFrameEvent {
+  enum BufferEventType {
+    UNSPECIFIED = 0;
+    DEQUEUE = 1;
+    QUEUE = 2;
+    POST = 3;
+    ACQUIRE_FENCE = 4;
+    LATCH = 5;
+    HWC_COMPOSITION_QUEUED = 6;  // HWC will compose this buffer
+    FALLBACK_COMPOSITION = 7;    // renderEngine composition
+    PRESENT_FENCE = 8;
+    RELEASE_FENCE = 9;
+    MODIFY = 10;
+  }
+
+  message BufferEvent {
+    optional uint32 frame_number = 1;
+    optional BufferEventType type = 2;
+    optional string layer_name = 3;
+    // If no duration is set, the event is an instant event.
+    optional uint64 duration_ns = 4;
+    // Unique buffer identifier.
+    optional uint32 buffer_id = 5;
+  }
+
+  optional BufferEvent buffer_event = 1;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index e52ed45..c371b9e 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -389,6 +389,39 @@
 
 // End of protos/perfetto/trace/android/android_log.proto
 
+// Begin of protos/perfetto/trace/android/graphics_frame_event.proto
+
+// Generated by Android's SurfaceFlinger.
+message GraphicsFrameEvent {
+  enum BufferEventType {
+    UNSPECIFIED = 0;
+    DEQUEUE = 1;
+    QUEUE = 2;
+    POST = 3;
+    ACQUIRE_FENCE = 4;
+    LATCH = 5;
+    HWC_COMPOSITION_QUEUED = 6;  // HWC will compose this buffer
+    FALLBACK_COMPOSITION = 7;    // renderEngine composition
+    PRESENT_FENCE = 8;
+    RELEASE_FENCE = 9;
+    MODIFY = 10;
+  }
+
+  message BufferEvent {
+    optional uint32 frame_number = 1;
+    optional BufferEventType type = 2;
+    optional string layer_name = 3;
+    // If no duration is set, the event is an instant event.
+    optional uint64 duration_ns = 4;
+    // Unique buffer identifier.
+    optional uint32 buffer_id = 5;
+  }
+
+  optional BufferEvent buffer_event = 1;
+}
+
+// End of protos/perfetto/trace/android/graphics_frame_event.proto
+
 // Begin of protos/perfetto/trace/android/packages_list.proto
 
 message PackagesList {
@@ -3132,7 +3165,7 @@
 // TracePacket(s).
 //
 // Next reserved id: 13 (up to 15).
-// Next id: 57.
+// Next id: 58.
 message TracePacket {
   // TODO(primiano): in future we should add a timestamp_clock_domain field to
   // allow mixing timestamps from different clock domains.
@@ -3168,6 +3201,7 @@
     GpuRenderStageEvent gpu_render_stage_event = 53;
     StreamingProfilePacket streaming_profile_packet = 54;
     HeapGraph heap_graph = 56;
+    GraphicsFrameEvent graphics_frame_event = 57;
 
     // Only used in profile packets.
     ProfiledFrameSymbols profiled_frame_symbols = 55;
diff --git a/protos/perfetto/trace/trace_packet.proto b/protos/perfetto/trace/trace_packet.proto
index 8b79a22..7f60fef 100644
--- a/protos/perfetto/trace/trace_packet.proto
+++ b/protos/perfetto/trace/trace_packet.proto
@@ -20,6 +20,7 @@
 import "perfetto/common/trace_stats.proto";
 import "perfetto/config/trace_config.proto";
 import "perfetto/trace/android/android_log.proto";
+import "perfetto/trace/android/graphics_frame_event.proto";
 import "perfetto/trace/android/packages_list.proto";
 import "perfetto/trace/chrome/chrome_benchmark_metadata.proto";
 import "perfetto/trace/chrome/chrome_metadata.proto";
@@ -53,7 +54,7 @@
 // TracePacket(s).
 //
 // Next reserved id: 13 (up to 15).
-// Next id: 57.
+// Next id: 58.
 message TracePacket {
   // TODO(primiano): in future we should add a timestamp_clock_domain field to
   // allow mixing timestamps from different clock domains.
@@ -89,6 +90,7 @@
     GpuRenderStageEvent gpu_render_stage_event = 53;
     StreamingProfilePacket streaming_profile_packet = 54;
     HeapGraph heap_graph = 56;
+    GraphicsFrameEvent graphics_frame_event = 57;
 
     // Only used in profile packets.
     ProfiledFrameSymbols profiled_frame_symbols = 55;
diff --git a/tools/gen_merged_protos b/tools/gen_merged_protos
index d187e13..7d1722f 100755
--- a/tools/gen_merged_protos
+++ b/tools/gen_merged_protos
@@ -46,6 +46,7 @@
 TRACE_PROTOS = (
   'protos/perfetto/common/trace_stats.proto', # only referenced by trace protos
   'protos/perfetto/trace/android/android_log.proto',
+  'protos/perfetto/trace/android/graphics_frame_event.proto',
   'protos/perfetto/trace/android/packages_list.proto',
   'protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto',
   "protos/perfetto/trace/chrome/chrome_metadata.proto",