Merge "Fix for WebView not drawing in a layer" into rvc-dev am: 70a24c3253
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12121325 Change-Id: I5be5f5df4b94b526044ef1383dd462f85150f87b
This commit is contained in:
@@ -48,29 +48,20 @@ static void setScissor(int viewportHeight, const SkIRect& clip) {
|
|||||||
glScissor(clip.fLeft, y, clip.width(), height);
|
glScissor(clip.fLeft, y, clip.width(), height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool GetFboDetails(SkCanvas* canvas, GLuint* outFboID, SkISize* outFboSize) {
|
static void GetFboDetails(SkCanvas* canvas, GLuint* outFboID, SkISize* outFboSize) {
|
||||||
GrRenderTargetContext* renderTargetContext =
|
GrRenderTargetContext* renderTargetContext =
|
||||||
canvas->internal_private_accessTopLayerRenderTargetContext();
|
canvas->internal_private_accessTopLayerRenderTargetContext();
|
||||||
if (!renderTargetContext) {
|
LOG_ALWAYS_FATAL_IF(!renderTargetContext, "Failed to retrieve GrRenderTargetContext");
|
||||||
ALOGW("Unable to extract renderTarget info from canvas; aborting GLFunctor draw");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GrRenderTarget* renderTarget = renderTargetContext->accessRenderTarget();
|
GrRenderTarget* renderTarget = renderTargetContext->accessRenderTarget();
|
||||||
if (!renderTarget) {
|
LOG_ALWAYS_FATAL_IF(!renderTarget, "accessRenderTarget failed");
|
||||||
ALOGW("Unable to extract renderTarget info from canvas; aborting GLFunctor draw");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GrGLFramebufferInfo fboInfo;
|
GrGLFramebufferInfo fboInfo;
|
||||||
if (!renderTarget->getBackendRenderTarget().getGLFramebufferInfo(&fboInfo)) {
|
LOG_ALWAYS_FATAL_IF(!renderTarget->getBackendRenderTarget().getGLFramebufferInfo(&fboInfo),
|
||||||
ALOGW("Unable to extract renderTarget info from canvas; aborting GLFunctor draw");
|
"getGLFrameBufferInfo failed");
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
*outFboID = fboInfo.fFBOID;
|
*outFboID = fboInfo.fFBOID;
|
||||||
*outFboSize = SkISize::Make(renderTargetContext->width(), renderTargetContext->height());
|
*outFboSize = SkISize::Make(renderTargetContext->width(), renderTargetContext->height());
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
|
void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
|
||||||
@@ -85,11 +76,12 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// flush will create a GrRenderTarget if not already present.
|
||||||
|
canvas->flush();
|
||||||
|
|
||||||
GLuint fboID = 0;
|
GLuint fboID = 0;
|
||||||
SkISize fboSize;
|
SkISize fboSize;
|
||||||
if (!GetFboDetails(canvas, &fboID, &fboSize)) {
|
GetFboDetails(canvas, &fboID, &fboSize);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SkIRect surfaceBounds = canvas->internal_private_getTopLayerBounds();
|
SkIRect surfaceBounds = canvas->internal_private_getTopLayerBounds();
|
||||||
SkIRect clipBounds = canvas->getDeviceClipBounds();
|
SkIRect clipBounds = canvas->getDeviceClipBounds();
|
||||||
@@ -143,7 +135,6 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
|
|||||||
|
|
||||||
// ensure that the framebuffer that the webview will render into is bound before we clear
|
// ensure that the framebuffer that the webview will render into is bound before we clear
|
||||||
// the stencil and/or draw the functor.
|
// the stencil and/or draw the functor.
|
||||||
canvas->flush();
|
|
||||||
glViewport(0, 0, info.width, info.height);
|
glViewport(0, 0, info.width, info.height);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fboID);
|
glBindFramebuffer(GL_FRAMEBUFFER, fboID);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user