blob: 9fd6d182417774756ff437c68fd623d87de68394 [file] [log] [blame]
// Copyright 2016 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 "cc/output/in_process_context_provider.h"
#include <stdint.h>
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "cc/resources/platform_color.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/service/framebuffer_completeness_cache.h"
#include "gpu/command_buffer/service/gpu_preferences.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/shader_translator_cache.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/ipc/common/surface_handle.h"
#include "gpu/ipc/gl_in_process_context.h"
#include "gpu/ipc/gpu_in_process_thread_service.h"
#include "gpu/ipc/in_process_command_buffer.h"
#include "gpu/skia_bindings/grcontext_for_gles2_interface.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/khronos/GLES2/gl2ext.h"
#include "third_party/skia/include/gpu/GrContext.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gl/gl_share_group.h"
namespace cc {
namespace {
gpu::gles2::ContextCreationAttribHelper CreateAttributes() {
gpu::gles2::ContextCreationAttribHelper attributes;
attributes.alpha_size = -1;
attributes.depth_size = 0;
attributes.stencil_size = 8;
attributes.samples = 0;
attributes.sample_buffers = 0;
attributes.fail_if_major_perf_caveat = false;
attributes.bind_generates_resource = false;
return attributes;
}
std::unique_ptr<gpu::GLInProcessContext> CreateInProcessContext(
scoped_refptr<gpu::InProcessCommandBuffer::Service> service,
const gpu::gles2::ContextCreationAttribHelper& attributes,
gpu::SurfaceHandle widget,
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
gpu::ImageFactory* image_factory,
const gpu::SharedMemoryLimits& limits,
gpu::GLInProcessContext* shared_context) {
const bool is_offscreen = widget == gpu::kNullSurfaceHandle;
return base::WrapUnique(gpu::GLInProcessContext::Create(
service, nullptr, is_offscreen, widget, shared_context, attributes,
limits, gpu_memory_buffer_manager, image_factory,
base::ThreadTaskRunnerHandle::Get()));
}
} // namespace
InProcessContextProvider::InProcessContextProvider(
scoped_refptr<gpu::InProcessCommandBuffer::Service> service,
gpu::SurfaceHandle widget,
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
gpu::ImageFactory* image_factory,
const gpu::SharedMemoryLimits& limits,
InProcessContextProvider* shared_context)
: attributes_(CreateAttributes()),
context_(CreateInProcessContext(
service,
attributes_,
widget,
gpu_memory_buffer_manager,
image_factory,
limits,
(shared_context ? shared_context->context_.get() : nullptr))) {
cache_controller_.reset(new ContextCacheController(
context_->GetImplementation(), base::ThreadTaskRunnerHandle::Get()));
}
InProcessContextProvider::~InProcessContextProvider() = default;
bool InProcessContextProvider::BindToCurrentThread() {
return !!context_;
}
gpu::gles2::GLES2Interface* InProcessContextProvider::ContextGL() {
return context_->GetImplementation();
}
gpu::ContextSupport* InProcessContextProvider::ContextSupport() {
return context_->GetImplementation();
}
class GrContext* InProcessContextProvider::GrContext() {
if (gr_context_)
return gr_context_->get();
gr_context_.reset(new skia_bindings::GrContextForGLES2Interface(ContextGL()));
return gr_context_->get();
}
ContextCacheController* InProcessContextProvider::CacheController() {
return cache_controller_.get();
}
void InProcessContextProvider::InvalidateGrContext(uint32_t state) {
if (gr_context_)
gr_context_->ResetContext(state);
}
base::Lock* InProcessContextProvider::GetLock() {
return &context_lock_;
}
gpu::Capabilities InProcessContextProvider::ContextCapabilities() {
return context_->GetCapabilities();
}
void InProcessContextProvider::SetLostContextCallback(
const LostContextCallback& lost_context_callback) {
// This code lives in the GPU process and so this would go away
// if the context is lost?
}
uint32_t InProcessContextProvider::GetCopyTextureInternalFormat() {
if (attributes_.alpha_size > 0)
return GL_RGBA;
DCHECK_NE(attributes_.red_size, 0);
DCHECK_NE(attributes_.green_size, 0);
DCHECK_NE(attributes_.blue_size, 0);
return GL_RGB;
}
void InProcessContextProvider::SetSwapBuffersCompletionCallback(
const gpu::InProcessCommandBuffer::SwapBuffersCompletionCallback&
callback) {
context_->SetSwapBuffersCompletionCallback(callback);
}
void InProcessContextProvider::SetUpdateVSyncParametersCallback(
const gpu::InProcessCommandBuffer::UpdateVSyncParametersCallback&
callback) {
context_->SetUpdateVSyncParametersCallback(callback);
}
} // namespace cc