diff options
author | John Reck <jreck@google.com> | 2018-04-09 23:18:06 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-04-09 23:18:06 +0000 |
commit | 7544d012ddf9a4ea1443f392672553555bfcd47e (patch) | |
tree | efe17bab76e8a25f8eb2cd437d596c8506a3d533 /libs/hwui/renderthread/CanvasContext.cpp | |
parent | 495c9709c6ca440351f2b880319befb2e0028885 (diff) | |
parent | ec100976e0655acaa204c8800dfb83dadae20cc8 (diff) |
Merge "Add support for render-ahead"
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 26 |
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 |