Merge "Always submit after texture uploads" into sc-dev am: 6a84070852
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15287364 Change-Id: Ie22938474d0173d2a955fc327e157081918acc36
This commit is contained in:
@@ -207,12 +207,16 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator
|
|||||||
|
|
||||||
void SkiaPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
|
void SkiaPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
|
||||||
GrDirectContext* context = thread.getGrContext();
|
GrDirectContext* context = thread.getGrContext();
|
||||||
if (context) {
|
if (context && !bitmap->isHardware()) {
|
||||||
ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
|
ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
|
||||||
auto image = bitmap->makeImage();
|
auto image = bitmap->makeImage();
|
||||||
if (image.get() && !bitmap->isHardware()) {
|
if (image.get()) {
|
||||||
SkImage_pinAsTexture(image.get(), context);
|
SkImage_pinAsTexture(image.get(), context);
|
||||||
SkImage_unpinAsTexture(image.get(), context);
|
SkImage_unpinAsTexture(image.get(), context);
|
||||||
|
// A submit is necessary as there may not be a frame coming soon, so without a call
|
||||||
|
// to submit these texture uploads can just sit in the queue building up until
|
||||||
|
// we run out of RAM
|
||||||
|
context->flushAndSubmit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,6 +130,12 @@ void DrawFrameTask::run() {
|
|||||||
if (CC_LIKELY(canDrawThisFrame)) {
|
if (CC_LIKELY(canDrawThisFrame)) {
|
||||||
dequeueBufferDuration = context->draw();
|
dequeueBufferDuration = context->draw();
|
||||||
} else {
|
} else {
|
||||||
|
// Do a flush in case syncFrameState performed any texture uploads. Since we skipped
|
||||||
|
// the draw() call, those uploads (or deletes) will end up sitting in the queue.
|
||||||
|
// Do them now
|
||||||
|
if (GrDirectContext* grContext = mRenderThread->getGrContext()) {
|
||||||
|
grContext->flushAndSubmit();
|
||||||
|
}
|
||||||
// wait on fences so tasks don't overlap next frame
|
// wait on fences so tasks don't overlap next frame
|
||||||
context->waitOnFences();
|
context->waitOnFences();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user