| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
| 6 | 6 |
| 7 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" | 7 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" |
| 8 | 8 |
| 9 #include "gpu/GLES2/gl2.h" | 9 #include "gpu/GLES2/gl2.h" |
| 10 #ifndef GL_GLEXT_PROTOTYPES | 10 #ifndef GL_GLEXT_PROTOTYPES |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 : initialize_failed_(false), | 43 : initialize_failed_(false), |
| 44 context_(NULL), | 44 context_(NULL), |
| 45 gl_(NULL), | 45 gl_(NULL), |
| 46 web_view_(NULL), | 46 web_view_(NULL), |
| 47 #if defined(OS_MACOSX) | 47 #if defined(OS_MACOSX) |
| 48 plugin_handle_(NULL), | 48 plugin_handle_(NULL), |
| 49 #endif // defined(OS_MACOSX) | 49 #endif // defined(OS_MACOSX) |
| 50 context_lost_callback_(0), | 50 context_lost_callback_(0), |
| 51 context_lost_reason_(GL_NO_ERROR), | 51 context_lost_reason_(GL_NO_ERROR), |
| 52 swapbuffers_complete_callback_(0), | 52 swapbuffers_complete_callback_(0), |
| 53 gpu_preference_(gfx::PreferIntegratedGpu), |
| 53 cached_width_(0), | 54 cached_width_(0), |
| 54 cached_height_(0), | 55 cached_height_(0), |
| 55 bound_fbo_(0), | 56 bound_fbo_(0), |
| 56 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 57 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 57 } | 58 } |
| 58 | 59 |
| 59 WebGraphicsContext3DCommandBufferImpl:: | 60 WebGraphicsContext3DCommandBufferImpl:: |
| 60 ~WebGraphicsContext3DCommandBufferImpl() { | 61 ~WebGraphicsContext3DCommandBufferImpl() { |
| 62 if (host_) { |
| 63 if (host_->WillGpuSwitchOccur(false, gpu_preference_)) { |
| 64 host_->ForciblyCloseChannel(); |
| 65 } |
| 66 } |
| 67 |
| 61 { | 68 { |
| 62 base::AutoLock lock(g_all_shared_contexts_lock.Get()); | 69 base::AutoLock lock(g_all_shared_contexts_lock.Get()); |
| 63 g_all_shared_contexts.Pointer()->erase(this); | 70 g_all_shared_contexts.Pointer()->erase(this); |
| 64 } | 71 } |
| 65 delete context_; | 72 delete context_; |
| 66 } | 73 } |
| 67 | 74 |
| 68 bool WebGraphicsContext3DCommandBufferImpl::initialize( | 75 bool WebGraphicsContext3DCommandBufferImpl::initialize( |
| 69 WebGraphicsContext3D::Attributes attributes, | 76 WebGraphicsContext3D::Attributes attributes, |
| 70 WebKit::WebView* web_view, | 77 WebKit::WebView* web_view, |
| 71 bool render_directly_to_web_view) { | 78 bool render_directly_to_web_view) { |
| 72 DCHECK(!context_); | 79 DCHECK(!context_); |
| 73 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::initialize"); | 80 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::initialize"); |
| 74 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 81 RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
| 75 if (!render_thread) | 82 if (!render_thread) |
| 76 return false; | 83 return false; |
| 77 host_ = render_thread->EstablishGpuChannelSync( | 84 |
| 78 content:: | 85 // The noExtensions and canRecoverFromContextLoss flags are |
| 79 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE); | 86 // currently used as hints that we are creating a context on |
| 80 if (!host_) | 87 // behalf of WebGL or accelerated 2D canvas, respectively. |
| 81 return false; | 88 if (attributes.noExtensions || !attributes.canRecoverFromContextLoss) |
| 82 DCHECK(host_->state() == GpuChannelHost::kConnected); | 89 gpu_preference_ = gfx::PreferDiscreteGpu; |
| 90 |
| 91 bool retry = false; |
| 92 |
| 93 do { |
| 94 host_ = render_thread->EstablishGpuChannelSync( |
| 95 content:: |
| 96 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE); |
| 97 if (!host_) |
| 98 return false; |
| 99 DCHECK(host_->state() == GpuChannelHost::kConnected); |
| 100 |
| 101 if (!retry) { |
| 102 // If the creation of this context requires all contexts for this |
| 103 // renderer to be destroyed on the GPU process side, then drop the |
| 104 // channel and recreate it. |
| 105 if (host_->WillGpuSwitchOccur(true, gpu_preference_)) { |
| 106 host_->ForciblyCloseChannel(); |
| 107 retry = true; |
| 108 } |
| 109 } else { |
| 110 retry = false; |
| 111 } |
| 112 } while (retry); |
| 83 | 113 |
| 84 const GPUInfo& gpu_info = host_->gpu_info(); | 114 const GPUInfo& gpu_info = host_->gpu_info(); |
| 85 UMA_HISTOGRAM_ENUMERATION( | 115 UMA_HISTOGRAM_ENUMERATION( |
| 86 "GPU.WebGraphicsContext3D_Init_CanLoseContext", | 116 "GPU.WebGraphicsContext3D_Init_CanLoseContext", |
| 87 attributes.canRecoverFromContextLoss * 2 + gpu_info.can_lose_context, | 117 attributes.canRecoverFromContextLoss * 2 + gpu_info.can_lose_context, |
| 88 4); | 118 4); |
| 89 if (attributes.canRecoverFromContextLoss == false) { | 119 if (attributes.canRecoverFromContextLoss == false) { |
| 90 if (gpu_info.can_lose_context) | 120 if (gpu_info.can_lose_context) |
| 91 return false; | 121 return false; |
| 92 } | 122 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 NULL : (*g_all_shared_contexts.Pointer()->begin())->context_; | 175 NULL : (*g_all_shared_contexts.Pointer()->begin())->context_; |
| 146 } | 176 } |
| 147 | 177 |
| 148 if (render_directly_to_web_view_) { | 178 if (render_directly_to_web_view_) { |
| 149 context_ = RendererGLContext::CreateViewContext( | 179 context_ = RendererGLContext::CreateViewContext( |
| 150 host_, | 180 host_, |
| 151 render_view_routing_id_, | 181 render_view_routing_id_, |
| 152 share_group, | 182 share_group, |
| 153 preferred_extensions, | 183 preferred_extensions, |
| 154 attribs, | 184 attribs, |
| 155 active_url_); | 185 active_url_, |
| 186 gpu_preference_); |
| 156 } else { | 187 } else { |
| 157 context_ = RendererGLContext::CreateOffscreenContext( | 188 context_ = RendererGLContext::CreateOffscreenContext( |
| 158 host_, | 189 host_, |
| 159 gfx::Size(1, 1), | 190 gfx::Size(1, 1), |
| 160 share_group, | 191 share_group, |
| 161 preferred_extensions, | 192 preferred_extensions, |
| 162 attribs, | 193 attribs, |
| 163 active_url_); | 194 active_url_, |
| 195 gpu_preference_); |
| 164 } | 196 } |
| 165 } | 197 } |
| 166 | 198 |
| 167 if (!context_) | 199 if (!context_) |
| 168 return false; | 200 return false; |
| 169 | 201 |
| 170 gl_ = context_->GetImplementation(); | 202 gl_ = context_->GetImplementation(); |
| 171 | 203 |
| 172 // TODO(twiz): This code is too fragile in that it assumes that only WebGL | 204 // TODO(twiz): This code is too fragile in that it assumes that only WebGL |
| 173 // contexts will request noExtensions. | 205 // contexts will request noExtensions. |
| (...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 if (context_lost_callback_) { | 1115 if (context_lost_callback_) { |
| 1084 context_lost_callback_->onContextLost(); | 1116 context_lost_callback_->onContextLost(); |
| 1085 } | 1117 } |
| 1086 RenderViewImpl* renderview = | 1118 RenderViewImpl* renderview = |
| 1087 web_view_ ? RenderViewImpl::FromWebView(web_view_) : NULL; | 1119 web_view_ ? RenderViewImpl::FromWebView(web_view_) : NULL; |
| 1088 if (renderview) | 1120 if (renderview) |
| 1089 renderview->OnViewContextSwapBuffersAborted(); | 1121 renderview->OnViewContextSwapBuffersAborted(); |
| 1090 } | 1122 } |
| 1091 | 1123 |
| 1092 #endif // defined(ENABLE_GPU) | 1124 #endif // defined(ENABLE_GPU) |
| OLD | NEW |