Add metrics for TextureView dataspace changes

Bug: 329475035
Flag: EXEMPT logging only
Test: builds
Test: GraphicsAtomTests
Change-Id: Ia65ceb3bf205e3050b182aa6d170a453076bdc4c
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp
index b763a96..c016070 100644
--- a/libs/hwui/DeferredLayerUpdater.cpp
+++ b/libs/hwui/DeferredLayerUpdater.cpp
@@ -19,6 +19,7 @@
 #include <GLES2/gl2ext.h>
 
 // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead.
+#include <statslog_hwui.h>
 #include <surfacetexture/surface_texture_platform.h>
 
 #include "AutoBackendTextureRelease.h"
@@ -50,6 +51,14 @@
     setTransform(nullptr);
     mRenderState.removeContextCallback(this);
     destroyLayer();
+    if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) {
+        auto currentTime = std::chrono::steady_clock::now();
+        stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()),
+                    static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
+                                                 currentTime - mFirstTimeForDataspace)
+                                                 .count()),
+                    mDataspace);
+    }
 }
 
 void DeferredLayerUpdater::setSurfaceTexture(AutoTextureRelease&& consumer) {
@@ -195,6 +204,21 @@
                     updateLayer(forceFilter, layerImage, outTransform, currentCropRect,
                                 maxLuminanceNits);
                 }
+
+                if (dataspace != mDataspace ||
+                    mFirstTimeForDataspace == std::chrono::steady_clock::time_point::min()) {
+                    auto currentTime = std::chrono::steady_clock::now();
+                    if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) {
+                        stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()),
+                                    static_cast<int64_t>(
+                                            std::chrono::duration_cast<std::chrono::milliseconds>(
+                                                    currentTime - mFirstTimeForDataspace)
+                                                    .count()),
+                                    mDataspace);
+                    }
+                    mFirstTimeForDataspace = currentTime;
+                    mDataspace = dataspace;
+                }
             }
         }
 
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index a7f8f61..3abb47c 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -16,6 +16,8 @@
 
 #pragma once
 
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
 #include <SkBlendMode.h>
 #include <SkColorFilter.h>
 #include <SkImage.h>
@@ -24,9 +26,9 @@
 #include <android/surface_texture.h>
 #include <cutils/compiler.h>
 #include <utils/Errors.h>
+#include <utils/Timers.h>
 
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
+#include <chrono>
 #include <map>
 #include <memory>
 
@@ -154,6 +156,9 @@
     bool mGLContextAttached;
     bool mUpdateTexImage;
     int mCurrentSlot = -1;
+    android_dataspace mDataspace = HAL_DATASPACE_UNKNOWN;
+    std::chrono::steady_clock::time_point mFirstTimeForDataspace =
+            std::chrono::steady_clock::time_point::min();
 
     Layer* mLayer;
 };