Index: cc/output/in_process_context_provider.cc |
diff --git a/cc/output/in_process_context_provider.cc b/cc/output/in_process_context_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..999b7c7b51c7cbe587e42ce828f1e9046bcfb34b |
--- /dev/null |
+++ b/cc/output/in_process_context_provider.cc |
@@ -0,0 +1,165 @@ |
+// 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 = 0; |
+ 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() { |
+ gpu::Capabilities capabilities; |
+ capabilities.texture_rectangle = true; |
+ capabilities.sync_query = true; |
+ switch (PlatformColor::Format()) { |
+ case PlatformColor::SOURCE_FORMAT_RGBA8: |
+ capabilities.texture_format_bgra8888 = false; |
+ break; |
+ case PlatformColor::SOURCE_FORMAT_BGRA8: |
+ capabilities.texture_format_bgra8888 = true; |
+ break; |
+ } |
+ return capabilities; |
+} |
+ |
+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 |