Commit 6e71d4fa authored by hush's avatar hush Committed by Commit bot

Make sure FBO is correct for both kModeProcess and kModeDraw

This is achieved by setting the correct FBO before each kModeDraw and
hardware renderer won't reset it at the end of the draw so that
kModeProcess between kModeDraws also has the correct FBO.

This CL is to solve a bug where kModeProcess could run some GL commands
that binds the wrong FBO, and the following kModeDraw is messed up.

BUG=527113

Review URL: https://codereview.chromium.org/1335033004

Cr-Commit-Position: refs/heads/master@{#348766}
parent 6b71e677
...@@ -41,8 +41,4 @@ void AwGLSurface::SetBackingFrameBufferObject(unsigned int fbo) { ...@@ -41,8 +41,4 @@ void AwGLSurface::SetBackingFrameBufferObject(unsigned int fbo) {
fbo_ = fbo; fbo_ = fbo;
} }
void AwGLSurface::ResetBackingFrameBufferObject() {
fbo_ = 0;
}
} // namespace android_webview } // namespace android_webview
...@@ -26,7 +26,6 @@ class GL_EXPORT AwGLSurface : public gfx::GLSurface { ...@@ -26,7 +26,6 @@ class GL_EXPORT AwGLSurface : public gfx::GLSurface {
void* GetDisplay() override; void* GetDisplay() override;
void SetBackingFrameBufferObject(unsigned int fbo); void SetBackingFrameBufferObject(unsigned int fbo);
void ResetBackingFrameBufferObject();
protected: protected:
~AwGLSurface() override; ~AwGLSurface() override;
......
...@@ -106,7 +106,6 @@ void HardwareRenderer::CommitFrame() { ...@@ -106,7 +106,6 @@ void HardwareRenderer::CommitFrame() {
} }
void HardwareRenderer::DrawGL(bool stencil_enabled, void HardwareRenderer::DrawGL(bool stencil_enabled,
int framebuffer_binding_ext,
AwDrawGLInfo* draw_info) { AwDrawGLInfo* draw_info) {
TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL");
...@@ -175,7 +174,6 @@ void HardwareRenderer::DrawGL(bool stencil_enabled, ...@@ -175,7 +174,6 @@ void HardwareRenderer::DrawGL(bool stencil_enabled,
display_->Resize(viewport); display_->Resize(viewport);
gl_surface_->SetBackingFrameBufferObject(framebuffer_binding_ext);
if (!output_surface_) { if (!output_surface_) {
scoped_refptr<cc::ContextProvider> context_provider = scoped_refptr<cc::ContextProvider> context_provider =
AwRenderThreadContextProvider::Create( AwRenderThreadContextProvider::Create(
...@@ -188,7 +186,6 @@ void HardwareRenderer::DrawGL(bool stencil_enabled, ...@@ -188,7 +186,6 @@ void HardwareRenderer::DrawGL(bool stencil_enabled,
output_surface_->SetExternalStencilTest(stencil_enabled); output_surface_->SetExternalStencilTest(stencil_enabled);
display_->SetExternalClip(clip); display_->SetExternalClip(clip);
display_->DrawAndSwap(); display_->DrawAndSwap();
gl_surface_->ResetBackingFrameBufferObject();
} }
void HardwareRenderer::ReturnResources( void HardwareRenderer::ReturnResources(
...@@ -196,4 +193,9 @@ void HardwareRenderer::ReturnResources( ...@@ -196,4 +193,9 @@ void HardwareRenderer::ReturnResources(
shared_renderer_state_->InsertReturnedResourcesOnRT(resources); shared_renderer_state_->InsertReturnedResourcesOnRT(resources);
} }
void HardwareRenderer::SetBackingFrameBufferObject(
int framebuffer_binding_ext) {
gl_surface_->SetBackingFrameBufferObject(framebuffer_binding_ext);
}
} // namespace android_webview } // namespace android_webview
...@@ -33,10 +33,11 @@ class HardwareRenderer : public cc::DisplayClient, ...@@ -33,10 +33,11 @@ class HardwareRenderer : public cc::DisplayClient,
~HardwareRenderer() override; ~HardwareRenderer() override;
void DrawGL(bool stencil_enabled, void DrawGL(bool stencil_enabled,
int framebuffer_binding_ext,
AwDrawGLInfo* draw_info); AwDrawGLInfo* draw_info);
void CommitFrame(); void CommitFrame();
void SetBackingFrameBufferObject(int framebuffer_binding_ext);
private: private:
// cc::DisplayClient overrides. // cc::DisplayClient overrides.
void CommitVSyncParameters(base::TimeTicks timebase, void CommitVSyncParameters(base::TimeTicks timebase,
......
...@@ -259,6 +259,18 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) { ...@@ -259,6 +259,18 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) {
draw_info->mode == AwDrawGLInfo::kModeDraw draw_info->mode == AwDrawGLInfo::kModeDraw
? ScopedAppGLStateRestore::MODE_DRAW ? ScopedAppGLStateRestore::MODE_DRAW
: ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
// Set the correct FBO before kModeDraw. The GL commands run in kModeDraw
// require a correctly bound FBO. The FBO remains until the next kModeDraw.
// So kModeProcess between kModeDraws has correctly bound FBO, too.
if (draw_info->mode == AwDrawGLInfo::kModeDraw) {
if (!hardware_renderer_) {
hardware_renderer_.reset(new HardwareRenderer(this));
hardware_renderer_->CommitFrame();
}
hardware_renderer_->SetBackingFrameBufferObject(
state_restore.framebuffer_binding_ext());
}
ScopedAllowGL allow_gl; ScopedAllowGL allow_gl;
if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) { if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) {
...@@ -279,14 +291,7 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) { ...@@ -279,14 +291,7 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) {
return; return;
} }
if (!hardware_renderer_) { hardware_renderer_->DrawGL(state_restore.stencil_enabled(), draw_info);
hardware_renderer_.reset(new HardwareRenderer(this));
hardware_renderer_->CommitFrame();
}
hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
state_restore.framebuffer_binding_ext(),
draw_info);
DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment