blob: 67b4f1271fa79e9b15fda602ce094700d6f8c36f [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/parent_output_surface.h"
#include "android_webview/browser/aw_render_thread_context_provider.h"
#include "android_webview/browser/scoped_app_gl_state_restore.h"
#include "components/viz/service/display/output_surface_client.h"
#include "components/viz/service/display/output_surface_frame.h"
#include "gpu/command_buffer/client/gles2_interface.h"
namespace android_webview {
ParentOutputSurface::ParentOutputSurface(
scoped_refptr<AwRenderThreadContextProvider> context_provider)
: viz::OutputSurface(std::move(context_provider)) {}
ParentOutputSurface::~ParentOutputSurface() {
}
void ParentOutputSurface::BindToClient(viz::OutputSurfaceClient* client) {}
void ParentOutputSurface::EnsureBackbuffer() {}
void ParentOutputSurface::DiscardBackbuffer() {
context_provider()->ContextGL()->DiscardBackbufferCHROMIUM();
}
void ParentOutputSurface::BindFramebuffer() {
context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0);
}
void ParentOutputSurface::SetDrawRectangle(const gfx::Rect& rect) {}
void ParentOutputSurface::Reshape(const gfx::Size& size,
float scale_factor,
const gfx::ColorSpace& color_space,
bool has_alpha,
bool use_stencil) {}
void ParentOutputSurface::SwapBuffers(viz::OutputSurfaceFrame frame) {
context_provider_->ContextGL()->ShallowFlushCHROMIUM();
}
#if BUILDFLAG(ENABLE_VULKAN)
gpu::VulkanSurface* ParentOutputSurface::GetVulkanSurface() {
NOTIMPLEMENTED();
return nullptr;
}
#endif
bool ParentOutputSurface::HasExternalStencilTest() const {
return ScopedAppGLStateRestore::Current()
->stencil_state()
.stencil_test_enabled;
}
void ParentOutputSurface::ApplyExternalStencil() {
StencilState stencil_state =
ScopedAppGLStateRestore::Current()->stencil_state();
DCHECK(stencil_state.stencil_test_enabled);
gpu::gles2::GLES2Interface* gl = context_provider()->ContextGL();
gl->StencilFuncSeparate(GL_FRONT, stencil_state.stencil_front_func,
stencil_state.stencil_front_mask,
stencil_state.stencil_front_ref);
gl->StencilFuncSeparate(GL_BACK, stencil_state.stencil_back_func,
stencil_state.stencil_back_mask,
stencil_state.stencil_back_ref);
gl->StencilMaskSeparate(GL_FRONT, stencil_state.stencil_front_writemask);
gl->StencilMaskSeparate(GL_BACK, stencil_state.stencil_back_writemask);
gl->StencilOpSeparate(GL_FRONT, stencil_state.stencil_front_fail_op,
stencil_state.stencil_front_z_fail_op,
stencil_state.stencil_front_z_pass_op);
gl->StencilOpSeparate(GL_BACK, stencil_state.stencil_back_fail_op,
stencil_state.stencil_back_z_fail_op,
stencil_state.stencil_back_z_pass_op);
}
uint32_t ParentOutputSurface::GetFramebufferCopyTextureFormat() {
auto* gl = static_cast<AwRenderThreadContextProvider*>(context_provider());
return gl->GetCopyTextureInternalFormat();
}
viz::OverlayCandidateValidator*
ParentOutputSurface::GetOverlayCandidateValidator() const {
return nullptr;
}
bool ParentOutputSurface::IsDisplayedAsOverlayPlane() const {
return false;
}
unsigned ParentOutputSurface::GetOverlayTextureId() const {
return 0;
}
gfx::BufferFormat ParentOutputSurface::GetOverlayBufferFormat() const {
return gfx::BufferFormat::RGBX_8888;
}
unsigned ParentOutputSurface::UpdateGpuFence() {
return 0;
}
} // namespace android_webview