| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" | 5 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" | 
| 6 | 6 | 
| 7 #include "third_party/khronos/GLES2/gl2.h" | 7 #include "third_party/khronos/GLES2/gl2.h" | 
| 8 #ifndef GL_GLEXT_PROTOTYPES | 8 #ifndef GL_GLEXT_PROTOTYPES | 
| 9 #define GL_GLEXT_PROTOTYPES 1 | 9 #define GL_GLEXT_PROTOTYPES 1 | 
| 10 #endif | 10 #endif | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 32 #include "gpu/command_buffer/client/transfer_buffer.h" | 32 #include "gpu/command_buffer/client/transfer_buffer.h" | 
| 33 #include "gpu/command_buffer/common/constants.h" | 33 #include "gpu/command_buffer/common/constants.h" | 
| 34 #include "gpu/command_buffer/common/gpu_memory_allocation.h" | 34 #include "gpu/command_buffer/common/gpu_memory_allocation.h" | 
| 35 #include "gpu/command_buffer/common/mailbox.h" | 35 #include "gpu/command_buffer/common/mailbox.h" | 
| 36 #include "gpu/ipc/client/gpu_channel_host.h" | 36 #include "gpu/ipc/client/gpu_channel_host.h" | 
| 37 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" | 37 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" | 
| 38 #include "third_party/skia/include/core/SkTypes.h" | 38 #include "third_party/skia/include/core/SkTypes.h" | 
| 39 | 39 | 
| 40 namespace content { | 40 namespace content { | 
| 41 | 41 | 
| 42 WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl( | 42 WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl() { | 
| 43     gpu::SurfaceHandle surface_handle, |  | 
| 44     const GURL& active_url, |  | 
| 45     scoped_refptr<gpu::GpuChannelHost> host, |  | 
| 46     gfx::GpuPreference gpu_preference, |  | 
| 47     bool automatic_flushes) |  | 
| 48     : automatic_flushes_(automatic_flushes), |  | 
| 49       surface_handle_(surface_handle), |  | 
| 50       active_url_(active_url), |  | 
| 51       gpu_preference_(gpu_preference), |  | 
| 52       host_(std::move(host)) { |  | 
| 53   DCHECK(host_); |  | 
| 54 } | 43 } | 
| 55 | 44 | 
| 56 WebGraphicsContext3DCommandBufferImpl:: | 45 WebGraphicsContext3DCommandBufferImpl:: | 
| 57     ~WebGraphicsContext3DCommandBufferImpl() {} | 46     ~WebGraphicsContext3DCommandBufferImpl() {} | 
| 58 | 47 | 
| 59 bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL( | 48 bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL( | 
|  | 49     gpu::SurfaceHandle surface_handle, | 
|  | 50     const GURL& active_url, | 
|  | 51     gpu::GpuChannelHost* host, | 
|  | 52     gfx::GpuPreference gpu_preference, | 
|  | 53     bool automatic_flushes, | 
| 60     const gpu::SharedMemoryLimits& memory_limits, | 54     const gpu::SharedMemoryLimits& memory_limits, | 
| 61     gpu::CommandBufferProxyImpl* shared_command_buffer, | 55     gpu::CommandBufferProxyImpl* shared_command_buffer, | 
| 62     scoped_refptr<gpu::gles2::ShareGroup> share_group, | 56     scoped_refptr<gpu::gles2::ShareGroup> share_group, | 
| 63     const gpu::gles2::ContextCreationAttribHelper& attributes, | 57     const gpu::gles2::ContextCreationAttribHelper& attributes, | 
| 64     command_buffer_metrics::ContextType context_type) { | 58     command_buffer_metrics::ContextType context_type) { | 
| 65   DCHECK_EQ(!!shared_command_buffer, !!share_group); | 59   DCHECK_EQ(!!shared_command_buffer, !!share_group); | 
| 66   TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::MaybeInitializeGL"); | 60   TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::MaybeInitializeGL"); | 
| 67 | 61 | 
| 68   DCHECK(attributes.buffer_preserved); | 62   DCHECK(attributes.buffer_preserved); | 
| 69   std::vector<int32_t> serialized_attributes; | 63   std::vector<int32_t> serialized_attributes; | 
| 70   attributes.Serialize(&serialized_attributes); | 64   attributes.Serialize(&serialized_attributes); | 
| 71 | 65 | 
| 72   // Create a proxy to a command buffer in the GPU process. | 66   // Create a proxy to a command buffer in the GPU process. | 
| 73   command_buffer_ = host_->CreateCommandBuffer( | 67   command_buffer_ = host->CreateCommandBuffer( | 
| 74       surface_handle_, gfx::Size(), shared_command_buffer, | 68       surface_handle, gfx::Size(), shared_command_buffer, | 
| 75       gpu::GpuChannelHost::kDefaultStreamId, | 69       gpu::GpuChannelHost::kDefaultStreamId, | 
| 76       gpu::GpuChannelHost::kDefaultStreamPriority, serialized_attributes, | 70       gpu::GpuChannelHost::kDefaultStreamPriority, serialized_attributes, | 
| 77       active_url_, gpu_preference_); | 71       active_url, gpu_preference); | 
| 78 | 72 | 
| 79   if (!command_buffer_) { | 73   if (!command_buffer_) { | 
| 80     DLOG(ERROR) << "GpuChannelHost failed to create command buffer."; | 74     DLOG(ERROR) << "GpuChannelHost failed to create command buffer."; | 
| 81     command_buffer_metrics::UmaRecordContextInitFailed(context_type); | 75     command_buffer_metrics::UmaRecordContextInitFailed(context_type); | 
| 82     return false; | 76     return false; | 
| 83   } | 77   } | 
| 84 | 78 | 
| 85   // The GLES2 helper writes the command buffer protocol. | 79   // The GLES2 helper writes the command buffer protocol. | 
| 86   gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get())); | 80   gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get())); | 
| 87   gles2_helper_->SetAutomaticFlushes(automatic_flushes_); | 81   gles2_helper_->SetAutomaticFlushes(automatic_flushes); | 
| 88   if (!gles2_helper_->Initialize(memory_limits.command_buffer_size)) { | 82   if (!gles2_helper_->Initialize(memory_limits.command_buffer_size)) { | 
| 89     DLOG(ERROR) << "Failed to initialize GLES2CmdHelper."; | 83     DLOG(ERROR) << "Failed to initialize GLES2CmdHelper."; | 
| 90     return false; | 84     return false; | 
| 91   } | 85   } | 
| 92 | 86 | 
| 93   // The transfer buffer is used to copy resources between the client | 87   // The transfer buffer is used to copy resources between the client | 
| 94   // process and the GPU process. | 88   // process and the GPU process. | 
| 95   transfer_buffer_ .reset(new gpu::TransferBuffer(gles2_helper_.get())); | 89   transfer_buffer_ .reset(new gpu::TransferBuffer(gles2_helper_.get())); | 
| 96 | 90 | 
| 97   const bool bind_generates_resource = attributes.bind_generates_resource; | 91   const bool bind_generates_resource = attributes.bind_generates_resource; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 111                             memory_limits.mapped_memory_reclaim_limit)) { | 105                             memory_limits.mapped_memory_reclaim_limit)) { | 
| 112     DLOG(ERROR) << "Failed to initialize GLES2Implementation."; | 106     DLOG(ERROR) << "Failed to initialize GLES2Implementation."; | 
| 113     return false; | 107     return false; | 
| 114   } | 108   } | 
| 115 | 109 | 
| 116   real_gl_->TraceBeginCHROMIUM("WebGraphicsContext3D", "CommandBufferContext"); | 110   real_gl_->TraceBeginCHROMIUM("WebGraphicsContext3D", "CommandBufferContext"); | 
| 117   return true; | 111   return true; | 
| 118 } | 112 } | 
| 119 | 113 | 
| 120 bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread( | 114 bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread( | 
|  | 115     gpu::SurfaceHandle surface_handle, | 
|  | 116     const GURL& active_url, | 
|  | 117     gpu::GpuChannelHost* host, | 
|  | 118     gfx::GpuPreference gpu_preference, | 
|  | 119     bool automatic_flushes, | 
| 121     const gpu::SharedMemoryLimits& memory_limits, | 120     const gpu::SharedMemoryLimits& memory_limits, | 
| 122     gpu::CommandBufferProxyImpl* shared_command_buffer, | 121     gpu::CommandBufferProxyImpl* shared_command_buffer, | 
| 123     scoped_refptr<gpu::gles2::ShareGroup> share_group, | 122     scoped_refptr<gpu::gles2::ShareGroup> share_group, | 
| 124     const gpu::gles2::ContextCreationAttribHelper& attributes, | 123     const gpu::gles2::ContextCreationAttribHelper& attributes, | 
| 125     command_buffer_metrics::ContextType context_type) { | 124     command_buffer_metrics::ContextType context_type) { | 
| 126   if (!MaybeInitializeGL(memory_limits, shared_command_buffer, | 125   if (!MaybeInitializeGL(surface_handle, active_url, host, gpu_preference, | 
| 127                          std::move(share_group), attributes, context_type)) | 126                          automatic_flushes, memory_limits, | 
|  | 127                          shared_command_buffer, std::move(share_group), | 
|  | 128                          attributes, context_type)) | 
| 128     return false; | 129     return false; | 
| 129   if (gpu::error::IsError(command_buffer_->GetLastError())) { | 130   if (gpu::error::IsError(command_buffer_->GetLastError())) { | 
| 130     DLOG(ERROR) << "Context dead on arrival. Last error: " | 131     DLOG(ERROR) << "Context dead on arrival. Last error: " | 
| 131                 << command_buffer_->GetLastError(); | 132                 << command_buffer_->GetLastError(); | 
| 132     return false; | 133     return false; | 
| 133   } | 134   } | 
| 134 | 135 | 
| 135   return true; | 136   return true; | 
| 136 } | 137 } | 
| 137 | 138 | 
| 138 }  // namespace content | 139 }  // namespace content | 
| OLD | NEW | 
|---|