summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/CanvasContext.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2018-04-09 23:18:06 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-04-09 23:18:06 +0000
commit7544d012ddf9a4ea1443f392672553555bfcd47e (patch)
treeefe17bab76e8a25f8eb2cd437d596c8506a3d533 /libs/hwui/renderthread/CanvasContext.cpp
parent495c9709c6ca440351f2b880319befb2e0028885 (diff)
parentec100976e0655acaa204c8800dfb83dadae20cc8 (diff)
Merge "Add support for render-ahead"
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index f4d8051466f0..609d26c53bfe 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -17,6 +17,7 @@
#include "CanvasContext.h"
#include <GpuMemoryTracker.h>
+#include "../Properties.h"
#include "AnimationContext.h"
#include "Caches.h"
#include "EglManager.h"
@@ -34,7 +35,6 @@
#include "renderstate/Stencil.h"
#include "utils/GLUtils.h"
#include "utils/TimeUtils.h"
-#include "../Properties.h"
#include <cutils/properties.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
@@ -194,6 +194,7 @@ void CanvasContext::setSurface(sp<Surface>&& surface) {
if (hasSurface) {
mHaveNewSurface = true;
mSwapHistory.clear();
+ updateBufferCount();
} else {
mRenderThread.removeFrameCallback(this);
}
@@ -427,6 +428,9 @@ void CanvasContext::draw() {
waitOnFences();
+ frame.setPresentTime(mCurrentFrameInfo->get(FrameInfoIndex::Vsync) +
+ (mRenderThread.timeLord().frameIntervalNanos() * (mRenderAheadDepth + 1)));
+
bool requireSwap = false;
bool didSwap =
mRenderPipeline->swapBuffers(frame, drew, windowDirty, mCurrentFrameInfo, &requireSwap);
@@ -705,6 +709,26 @@ int64_t CanvasContext::getFrameNumber() {
return mFrameNumber;
}
+void overrideBufferCount(const sp<Surface>& surface, int bufferCount) {
+ struct SurfaceExposer : Surface {
+ using Surface::setBufferCount;
+ };
+ // Protected is just a sign, not a cop
+ ((*surface.get()).*&SurfaceExposer::setBufferCount)(bufferCount);
+}
+
+void CanvasContext::updateBufferCount() {
+ overrideBufferCount(mNativeSurface, 3 + mRenderAheadDepth);
+}
+
+void CanvasContext::setRenderAheadDepth(int renderAhead) {
+ if (renderAhead < 0 || renderAhead > 2 || renderAhead == mRenderAheadDepth) {
+ return;
+ }
+ mRenderAheadDepth = renderAhead;
+ updateBufferCount();
+}
+
SkRect CanvasContext::computeDirtyRect(const Frame& frame, SkRect* dirty) {
if (frame.width() != mLastFrameWidth || frame.height() != mLastFrameHeight) {
// can't rely on prior content of window if viewport size changes