diff options
author | Jorim Jaggi <jjaggi@google.com> | 2021-02-03 23:19:29 +0100 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2021-02-17 14:55:22 +0100 |
commit | 71db8892acc0c80c343141139bde8cfd3f037c4a (patch) | |
tree | 9f40ac7b2cf2d535d24d9e6eacf8c353e8dcabc8 /native/android/surface_control.cpp | |
parent | 5fdf7b8d26f3cd1a2f2fb8a441d40d33270d3b77 (diff) |
Add GPU completion to FrameMetrics (1/3)
- Add SurfaceStatsCallback to TransactionCompletedListener
- Register a callback in RenderProxy to be called when we have
surface stats from SF via the BLAST callback.
- Instead of finishing a frame for frame metrics reporting
immediately, wait until BLAST callback fires, note GPU completion
time and finish frame.
- Expose GPU_COMPLETION in FrameMetrics
- Modify TOTAL_DURATION to also include GPU_COMPLETION
Test: FrameMetricsListenerTest
Fixes: 171046219
Change-Id: I16fa1d80cfc4e7a5527c18fec7e885409f17ee4d
Diffstat (limited to 'native/android/surface_control.cpp')
-rw-r--r-- | native/android/surface_control.cpp | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index c1b5f1ddd423..e51add276647 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -17,6 +17,7 @@ #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> #include <android/native_window.h> #include <android/surface_control.h> +#include <surface_control_private.h> #include <configstore/Utils.h> @@ -197,6 +198,48 @@ void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) { SurfaceControl_release(surfaceControl); } +struct ASurfaceControlStats { + int64_t acquireTime; + sp<Fence> previousReleaseFence; + uint64_t frameNumber; +}; + +void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, void* context, + ASurfaceControl_SurfaceStatsListener func) { + SurfaceStatsCallback callback = [func](void* callback_context, + nsecs_t, + const sp<Fence>&, + const SurfaceStats& surfaceStats) { + + ASurfaceControlStats aSurfaceControlStats; + + ASurfaceControl* aSurfaceControl = + reinterpret_cast<ASurfaceControl*>(surfaceStats.surfaceControl.get()); + aSurfaceControlStats.acquireTime = surfaceStats.acquireTime; + aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence; + aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber; + + (*func)(callback_context, aSurfaceControl, &aSurfaceControlStats); + }; + TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context, + reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback); +} + + +void ASurfaceControl_unregisterSurfaceStatsListener(void* context, + ASurfaceControl_SurfaceStatsListener func) { + TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context, + reinterpret_cast<void*>(func)); +} + +int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) { + return stats->acquireTime; +} + +uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) { + return stats->frameNumber; +} + ASurfaceTransaction* ASurfaceTransaction_create() { Transaction* transaction = new Transaction; return reinterpret_cast<ASurfaceTransaction*>(transaction); @@ -215,11 +258,6 @@ void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) { transaction->apply(); } -typedef struct ASurfaceControlStats { - int64_t acquireTime; - sp<Fence> previousReleaseFence; -} ASurfaceControlStats; - struct ASurfaceTransactionStats { std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats; int64_t latchTime; |