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
This commit is contained in:
@@ -88,7 +88,7 @@ cc_library_shared {
|
||||
"libarect",
|
||||
],
|
||||
|
||||
header_libs: [ "libhwui_internal_headers",],
|
||||
header_libs: [ "libhwui_internal_headers", "libandroid_headers_private"],
|
||||
|
||||
whole_static_libs: ["libnativewindow"],
|
||||
|
||||
|
||||
@@ -300,3 +300,13 @@ LIBANDROID {
|
||||
local:
|
||||
*;
|
||||
};
|
||||
|
||||
LIBANDROID_PLATFORM {
|
||||
global:
|
||||
extern "C++" {
|
||||
ASurfaceControl_registerSurfaceStatsListener*;
|
||||
ASurfaceControl_unregisterSurfaceStatsListener*;
|
||||
ASurfaceControlStats_getAcquireTime*;
|
||||
ASurfaceControlStats_getFrameNumber*;
|
||||
};
|
||||
} LIBANDROID;
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user