summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/CanvasContext.cpp
diff options
context:
space:
mode:
authorchaviw <chaviw@google.com>2021-08-20 12:15:48 -0500
committerRob Carr <racarr@google.com>2021-11-24 23:38:34 +0000
commite97e296c811d16a3169c99b2b9e14a25cc245356 (patch)
treefe269f7cb38cb43c81e8e77427568eda92c21f00 /libs/hwui/renderthread/CanvasContext.cpp
parent27cef855be711db25d8664977de3c92a4ef8c1ea (diff)
Rework blast sync callback model
The previous code waited for a frame complete callback from hwui before notifying WMS that a draw had occurred. However, frame complete callback was not guaranteed to get called since it only invokes a callback if a draw actually occured. VRI really needs a signal that RT has completed, since it just needs to know that a draw was possible so it can notify WMS that the RT completed its pass. Instead, rename frameCompleteCallback to frameCommitCallback since that API is exposed to a public API when a frame was actually drawn. Create a new callback, frameCompleteCallback, that is invoked when the draw has completed, regardless if a frame was actually drawn. When the frameCompleteCallback is invoked, VRI can check to see if a new frame actually drew. VRI can call into BBQ to see if the frame acquired matches the frame that was attempted to draw. If so, VRI can wait on a transaction callback. If not, it can allow VRI to continue. In either case, it will notify WMS that the draw has finished. Test: Split over and over Bug: 195262673 Bug: 193634619 Change-Id: I24dd19ab2746be3fc33e597761abf8c5249f8b5b Merged-In: I24dd19ab2746be3fc33e597761abf8c5249f8b5b
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 2f3a509831d1..a066e6f7c693 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -491,10 +491,10 @@ nsecs_t CanvasContext::draw() {
// Notify the callbacks, even if there's nothing to draw so they aren't waiting
// indefinitely
waitOnFences();
- for (auto& func : mFrameCompleteCallbacks) {
- std::invoke(func, mFrameNumber);
+ for (auto& func : mFrameCommitCallbacks) {
+ std::invoke(func, false /* didProduceBuffer */);
}
- mFrameCompleteCallbacks.clear();
+ mFrameCommitCallbacks.clear();
return 0;
}
@@ -603,10 +603,10 @@ nsecs_t CanvasContext::draw() {
#endif
if (didSwap) {
- for (auto& func : mFrameCompleteCallbacks) {
- std::invoke(func, frameCompleteNr);
+ for (auto& func : mFrameCommitCallbacks) {
+ std::invoke(func, true /* didProduceBuffer */);
}
- mFrameCompleteCallbacks.clear();
+ mFrameCommitCallbacks.clear();
}
if (requireSwap) {