nativewindow: Add more benchmarks to evaluate FFI costs am: ba294d7d80

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2776853

Change-Id: I14e74a4048025ea5b1e9ca6898c42b76cdd978fb
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc b/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
index 0ead1a2..9b31993 100644
--- a/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
+++ b/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
@@ -16,16 +16,17 @@
 #include <android/hardware_buffer.h>
 #include <benchmark/benchmark.h>
 
+constexpr AHardwareBuffer_Desc k720pDesc = {.width = 1280,
+                                            .height = 720,
+                                            .layers = 1,
+                                            .format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
+                                            .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
+                                            .stride = 0};
+
 static void BM_BufferAllocationDeallocation(benchmark::State& state) {
-    AHardwareBuffer_Desc buffer_desc = {.width = 1280,
-                                        .height = 720,
-                                        .layers = 1,
-                                        .format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
-                                        .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
-                                        .stride = 0};
     AHardwareBuffer* buffer = nullptr;
     for (auto _ : state) {
-        int status = AHardwareBuffer_allocate(&buffer_desc, &buffer);
+        int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
         if (UNLIKELY(status != 0)) {
             state.SkipWithError("Unable to allocate buffer.");
         }
@@ -35,4 +36,39 @@
 }
 BENCHMARK(BM_BufferAllocationDeallocation);
 
-BENCHMARK_MAIN();
\ No newline at end of file
+static void BM_AHardwareBuffer_Id(benchmark::State& state) {
+    AHardwareBuffer* buffer = nullptr;
+    int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
+    if (UNLIKELY(status != 0)) {
+        state.SkipWithError("Unable to allocate buffer.");
+    }
+
+    for (auto _ : state) {
+        uint64_t id = 0;
+        int status = AHardwareBuffer_getId(buffer, &id);
+        if (UNLIKELY(status != 0)) {
+            state.SkipWithError("Unable to get ID.");
+        }
+    }
+
+    AHardwareBuffer_release(buffer);
+}
+BENCHMARK(BM_AHardwareBuffer_Id);
+
+static void BM_AHardwareBuffer_Desc(benchmark::State& state) {
+    AHardwareBuffer* buffer = nullptr;
+    int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
+    if (UNLIKELY(status != 0)) {
+        state.SkipWithError("Unable to allocate buffer.");
+    }
+
+    for (auto _ : state) {
+        AHardwareBuffer_Desc desc = {};
+        AHardwareBuffer_describe(buffer, &desc);
+    }
+
+    AHardwareBuffer_release(buffer);
+}
+BENCHMARK(BM_AHardwareBuffer_Desc);
+
+BENCHMARK_MAIN();
diff --git a/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs b/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
index 3ef0f5e..fbd49c0 100644
--- a/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
+++ b/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
@@ -20,20 +20,40 @@
 use criterion::*;
 use nativewindow::*;
 
-fn allocate_deallocate() {
-    let buffer = AHardwareBuffer::new(
+#[inline]
+fn create_720p_buffer() -> AHardwareBuffer {
+    AHardwareBuffer::new(
         1280,
         720,
         1,
         AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
         AHardwareBuffer_UsageFlags::AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
     )
-    .unwrap();
-    drop(buffer);
+    .unwrap()
 }
 
 fn criterion_benchmark(c: &mut Criterion) {
-    c.bench_function("allocate_deallocate", |b| b.iter(allocate_deallocate));
+    c.bench_function("allocate_deallocate", |b| {
+        b.iter(|| {
+            let buffer = create_720p_buffer();
+            drop(buffer);
+        })
+    });
+
+    let buffer = create_720p_buffer();
+    c.bench_with_input(BenchmarkId::new("id", "buffer"), &buffer, |b, buffer| {
+        b.iter(|| {
+            buffer.id();
+        })
+    });
+
+    // This benchmark exercises getters that need to fetch data via an
+    // underlying call to AHardwareBuffer_describe.
+    c.bench_with_input(BenchmarkId::new("desc", "buffer"), &buffer, |b, buffer| {
+        b.iter(|| {
+            buffer.width();
+        })
+    });
 }
 
 criterion_group!(benches, criterion_benchmark);