| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/browser/parent_output_surface.h" | 5 #include "android_webview/browser/parent_output_surface.h" |
| 6 | 6 |
| 7 #include "android_webview/browser/aw_render_thread_context_provider.h" | 7 #include "android_webview/browser/aw_render_thread_context_provider.h" |
| 8 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| 8 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
| 9 #include "cc/output/output_surface_client.h" | 10 #include "cc/output/output_surface_client.h" |
| 10 #include "gpu/command_buffer/client/gles2_interface.h" | 11 #include "gpu/command_buffer/client/gles2_interface.h" |
| 11 | 12 |
| 12 namespace android_webview { | 13 namespace android_webview { |
| 13 | 14 |
| 14 ParentOutputSurface::ParentOutputSurface( | 15 ParentOutputSurface::ParentOutputSurface( |
| 15 scoped_refptr<AwRenderThreadContextProvider> context_provider) | 16 scoped_refptr<AwRenderThreadContextProvider> context_provider) |
| 16 : cc::OutputSurface(std::move(context_provider), nullptr, nullptr) { | 17 : cc::OutputSurface(std::move(context_provider), nullptr, nullptr) { |
| 17 stencil_state_.stencil_test_enabled = false; | |
| 18 } | 18 } |
| 19 | 19 |
| 20 ParentOutputSurface::~ParentOutputSurface() { | 20 ParentOutputSurface::~ParentOutputSurface() { |
| 21 } | 21 } |
| 22 | 22 |
| 23 void ParentOutputSurface::DidLoseOutputSurface() { | 23 void ParentOutputSurface::DidLoseOutputSurface() { |
| 24 // Android WebView does not handle context loss. | 24 // Android WebView does not handle context loss. |
| 25 LOG(FATAL) << "Render thread context loss"; | 25 LOG(FATAL) << "Render thread context loss"; |
| 26 } | 26 } |
| 27 | 27 |
| 28 void ParentOutputSurface::Reshape(const gfx::Size& size, | 28 void ParentOutputSurface::Reshape(const gfx::Size& size, |
| 29 float scale_factor, | 29 float scale_factor, |
| 30 const gfx::ColorSpace& color_space, | 30 const gfx::ColorSpace& color_space, |
| 31 bool has_alpha) { | 31 bool has_alpha) { |
| 32 DCHECK_EQ(1.f, scale_factor); | 32 DCHECK_EQ(1.f, scale_factor); |
| 33 surface_size_ = size; | 33 surface_size_ = size; |
| 34 } | 34 } |
| 35 | 35 |
| 36 void ParentOutputSurface::SwapBuffers(cc::CompositorFrame frame) { | 36 void ParentOutputSurface::SwapBuffers(cc::CompositorFrame frame) { |
| 37 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); | 37 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); |
| 38 } | 38 } |
| 39 | 39 |
| 40 void ParentOutputSurface::ApplyExternalStencil() { | 40 void ParentOutputSurface::ApplyExternalStencil() { |
| 41 DCHECK(stencil_state_.stencil_test_enabled); | 41 StencilState stencil_state = |
| 42 ScopedAppGLStateRestore::Current()->stencil_state(); |
| 43 DCHECK(stencil_state.stencil_test_enabled); |
| 42 gpu::gles2::GLES2Interface* gl = context_provider()->ContextGL(); | 44 gpu::gles2::GLES2Interface* gl = context_provider()->ContextGL(); |
| 43 gl->StencilFuncSeparate(GL_FRONT, stencil_state_.stencil_front_func, | 45 gl->StencilFuncSeparate(GL_FRONT, stencil_state.stencil_front_func, |
| 44 stencil_state_.stencil_front_mask, | 46 stencil_state.stencil_front_mask, |
| 45 stencil_state_.stencil_front_ref); | 47 stencil_state.stencil_front_ref); |
| 46 gl->StencilFuncSeparate(GL_BACK, stencil_state_.stencil_back_func, | 48 gl->StencilFuncSeparate(GL_BACK, stencil_state.stencil_back_func, |
| 47 stencil_state_.stencil_back_mask, | 49 stencil_state.stencil_back_mask, |
| 48 stencil_state_.stencil_back_ref); | 50 stencil_state.stencil_back_ref); |
| 49 gl->StencilMaskSeparate(GL_FRONT, stencil_state_.stencil_front_writemask); | 51 gl->StencilMaskSeparate(GL_FRONT, stencil_state.stencil_front_writemask); |
| 50 gl->StencilMaskSeparate(GL_BACK, stencil_state_.stencil_back_writemask); | 52 gl->StencilMaskSeparate(GL_BACK, stencil_state.stencil_back_writemask); |
| 51 gl->StencilOpSeparate(GL_FRONT, stencil_state_.stencil_front_fail_op, | 53 gl->StencilOpSeparate(GL_FRONT, stencil_state.stencil_front_fail_op, |
| 52 stencil_state_.stencil_front_z_fail_op, | 54 stencil_state.stencil_front_z_fail_op, |
| 53 stencil_state_.stencil_front_z_pass_op); | 55 stencil_state.stencil_front_z_pass_op); |
| 54 gl->StencilOpSeparate(GL_BACK, stencil_state_.stencil_back_fail_op, | 56 gl->StencilOpSeparate(GL_BACK, stencil_state.stencil_back_fail_op, |
| 55 stencil_state_.stencil_back_z_fail_op, | 57 stencil_state.stencil_back_z_fail_op, |
| 56 stencil_state_.stencil_back_z_pass_op); | 58 stencil_state.stencil_back_z_pass_op); |
| 57 } | 59 } |
| 58 | 60 |
| 59 uint32_t ParentOutputSurface::GetFramebufferCopyTextureFormat() { | 61 uint32_t ParentOutputSurface::GetFramebufferCopyTextureFormat() { |
| 60 auto* gl = static_cast<AwRenderThreadContextProvider*>(context_provider()); | 62 auto* gl = static_cast<AwRenderThreadContextProvider*>(context_provider()); |
| 61 return gl->GetCopyTextureInternalFormat(); | 63 return gl->GetCopyTextureInternalFormat(); |
| 62 } | 64 } |
| 63 | 65 |
| 64 void ParentOutputSurface::SetGLState(const ScopedAppGLStateRestore& gl_state) { | 66 void ParentOutputSurface::UpdateStencilTest() { |
| 65 stencil_state_ = gl_state.stencil_state(); | 67 SetExternalStencilTest( |
| 66 SetExternalStencilTest(stencil_state_.stencil_test_enabled); | 68 ScopedAppGLStateRestore::Current()->stencil_state().stencil_test_enabled); |
| 67 } | 69 } |
| 68 | 70 |
| 69 } // namespace android_webview | 71 } // namespace android_webview |
| OLD | NEW |