Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Side by Side Diff: content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc

Issue 1095893002: gpu: Fix some context lost marking glitches+leaks and add UMA stats (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: kbr's comment Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 const Attributes& attributes, 90 const Attributes& attributes,
91 bool lose_context_when_out_of_memory, 91 bool lose_context_when_out_of_memory,
92 const SharedMemoryLimits& limits, 92 const SharedMemoryLimits& limits,
93 WebGraphicsContext3DCommandBufferImpl* share_context) 93 WebGraphicsContext3DCommandBufferImpl* share_context)
94 : lose_context_when_out_of_memory_(lose_context_when_out_of_memory), 94 : lose_context_when_out_of_memory_(lose_context_when_out_of_memory),
95 attributes_(attributes), 95 attributes_(attributes),
96 visible_(false), 96 visible_(false),
97 host_(host), 97 host_(host),
98 surface_id_(surface_id), 98 surface_id_(surface_id),
99 active_url_(active_url), 99 active_url_(active_url),
100 context_type_(CONTEXT_TYPE_UNKNOWN),
100 gpu_preference_(attributes.preferDiscreteGPU ? gfx::PreferDiscreteGpu 101 gpu_preference_(attributes.preferDiscreteGPU ? gfx::PreferDiscreteGpu
101 : gfx::PreferIntegratedGpu), 102 : gfx::PreferIntegratedGpu),
102 mem_limits_(limits), 103 mem_limits_(limits),
103 weak_ptr_factory_(this) { 104 weak_ptr_factory_(this) {
105 if (attributes_.webGL)
106 context_type_ = OFFSCREEN_CONTEXT_FOR_WEBGL;
104 if (share_context) { 107 if (share_context) {
105 DCHECK(!attributes_.shareResources); 108 DCHECK(!attributes_.shareResources);
106 share_group_ = share_context->share_group_; 109 share_group_ = share_context->share_group_;
107 } else { 110 } else {
108 share_group_ = attributes_.shareResources 111 share_group_ = attributes_.shareResources
109 ? GetDefaultShareGroupForHost(host) 112 ? GetDefaultShareGroupForHost(host)
110 : scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup>( 113 : scoped_refptr<WebGraphicsContext3DCommandBufferImpl::ShareGroup>(
111 new ShareGroup()); 114 new ShareGroup());
112 } 115 }
113 } 116 }
(...skipping 24 matching lines...) Expand all
138 if (!CreateContext(surface_id_ != 0)) { 141 if (!CreateContext(surface_id_ != 0)) {
139 Destroy(); 142 Destroy();
140 143
141 initialize_failed_ = true; 144 initialize_failed_ = true;
142 return false; 145 return false;
143 } 146 }
144 147
145 if (gl_ && attributes_.webGL) 148 if (gl_ && attributes_.webGL)
146 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation"); 149 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation");
147 150
148 command_buffer_->SetChannelErrorCallback( 151 command_buffer_->SetContextLostCallback(
149 base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnGpuChannelLost, 152 base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnContextLost,
150 weak_ptr_factory_.GetWeakPtr())); 153 weak_ptr_factory_.GetWeakPtr()));
151 154
152 command_buffer_->SetOnConsoleMessageCallback( 155 command_buffer_->SetOnConsoleMessageCallback(
153 base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnErrorMessage, 156 base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnErrorMessage,
154 weak_ptr_factory_.GetWeakPtr())); 157 weak_ptr_factory_.GetWeakPtr()));
155 158
156 real_gl_->SetErrorMessageCallback(getErrorMessageCallback()); 159 real_gl_->SetErrorMessageCallback(getErrorMessageCallback());
157 160
158 visible_ = true; 161 visible_ = true;
159 initialized_ = true; 162 initialized_ = true;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 command_buffer_.reset(host_->CreateOffscreenCommandBuffer( 194 command_buffer_.reset(host_->CreateOffscreenCommandBuffer(
192 gfx::Size(1, 1), 195 gfx::Size(1, 1),
193 share_group_command_buffer, 196 share_group_command_buffer,
194 attribs, 197 attribs,
195 active_url_, 198 active_url_,
196 gpu_preference_)); 199 gpu_preference_));
197 } 200 }
198 201
199 if (!command_buffer_) { 202 if (!command_buffer_) {
200 DLOG(ERROR) << "GpuChannelHost failed to create command buffer."; 203 DLOG(ERROR) << "GpuChannelHost failed to create command buffer.";
204 UmaRecordContextInitFailed(context_type_);
201 return false; 205 return false;
202 } 206 }
203 207
204 DVLOG_IF(1, gpu::error::IsError(command_buffer_->GetLastError())) 208 DVLOG_IF(1, gpu::error::IsError(command_buffer_->GetLastError()))
205 << "Context dead on arrival. Last error: " 209 << "Context dead on arrival. Last error: "
206 << command_buffer_->GetLastError(); 210 << command_buffer_->GetLastError();
207 // Initialize the command buffer. 211 // Initialize the command buffer.
208 bool result = command_buffer_->Initialize(); 212 bool result = command_buffer_->Initialize();
209 LOG_IF(ERROR, !result) << "CommandBufferProxy::Initialize failed."; 213 LOG_IF(ERROR, !result) << "CommandBufferProxy::Initialize failed.";
214 if (!result)
215 UmaRecordContextInitFailed(context_type_);
210 return result; 216 return result;
211 } 217 }
212 218
213 bool WebGraphicsContext3DCommandBufferImpl::CreateContext(bool onscreen) { 219 bool WebGraphicsContext3DCommandBufferImpl::CreateContext(bool onscreen) {
214 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext"); 220 TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext");
215 scoped_refptr<gpu::gles2::ShareGroup> gles2_share_group; 221 scoped_refptr<gpu::gles2::ShareGroup> gles2_share_group;
216 222
217 scoped_ptr<base::AutoLock> share_group_lock; 223 scoped_ptr<base::AutoLock> share_group_lock;
218 bool add_to_share_group = false; 224 bool add_to_share_group = false;
219 if (!command_buffer_) { 225 if (!command_buffer_) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 350
345 return context_lost_reason_; 351 return context_lost_reason_;
346 } 352 }
347 353
348 bool WebGraphicsContext3DCommandBufferImpl::IsCommandBufferContextLost() { 354 bool WebGraphicsContext3DCommandBufferImpl::IsCommandBufferContextLost() {
349 // If the channel shut down unexpectedly, let that supersede the 355 // If the channel shut down unexpectedly, let that supersede the
350 // command buffer's state. 356 // command buffer's state.
351 if (host_.get() && host_->IsLost()) 357 if (host_.get() && host_->IsLost())
352 return true; 358 return true;
353 gpu::CommandBuffer::State state = command_buffer_->GetLastState(); 359 gpu::CommandBuffer::State state = command_buffer_->GetLastState();
354 return state.error == gpu::error::kLostContext; 360 return gpu::error::IsError(state.error);
355 } 361 }
356 362
357 // static 363 // static
358 WebGraphicsContext3DCommandBufferImpl* 364 WebGraphicsContext3DCommandBufferImpl*
359 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext( 365 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
360 GpuChannelHost* host, 366 GpuChannelHost* host,
361 const WebGraphicsContext3D::Attributes& attributes, 367 const WebGraphicsContext3D::Attributes& attributes,
362 bool lose_context_when_out_of_memory, 368 bool lose_context_when_out_of_memory,
363 const GURL& active_url, 369 const GURL& active_url,
364 const SharedMemoryLimits& limits, 370 const SharedMemoryLimits& limits,
(...skipping 15 matching lines...) Expand all
380 } 386 }
381 387
382 namespace { 388 namespace {
383 389
384 WGC3Denum convertReason(gpu::error::ContextLostReason reason) { 390 WGC3Denum convertReason(gpu::error::ContextLostReason reason) {
385 switch (reason) { 391 switch (reason) {
386 case gpu::error::kGuilty: 392 case gpu::error::kGuilty:
387 return GL_GUILTY_CONTEXT_RESET_ARB; 393 return GL_GUILTY_CONTEXT_RESET_ARB;
388 case gpu::error::kInnocent: 394 case gpu::error::kInnocent:
389 return GL_INNOCENT_CONTEXT_RESET_ARB; 395 return GL_INNOCENT_CONTEXT_RESET_ARB;
396 case gpu::error::kOutOfMemory:
397 case gpu::error::kMakeCurrentFailed:
390 case gpu::error::kUnknown: 398 case gpu::error::kUnknown:
399 case gpu::error::kGpuChannelLost:
391 return GL_UNKNOWN_CONTEXT_RESET_ARB; 400 return GL_UNKNOWN_CONTEXT_RESET_ARB;
392 } 401 }
393 402
394 NOTREACHED(); 403 NOTREACHED();
395 return GL_UNKNOWN_CONTEXT_RESET_ARB; 404 return GL_UNKNOWN_CONTEXT_RESET_ARB;
396 } 405 }
397 406
398 } // anonymous namespace 407 } // anonymous namespace
399 408
400 void WebGraphicsContext3DCommandBufferImpl::OnGpuChannelLost() { 409 void WebGraphicsContext3DCommandBufferImpl::OnContextLost() {
401 context_lost_reason_ = convertReason( 410 context_lost_reason_ =
402 command_buffer_->GetLastState().context_lost_reason); 411 convertReason(command_buffer_->GetLastState().context_lost_reason);
403 if (context_lost_callback_) { 412 if (context_lost_callback_) {
404 context_lost_callback_->onContextLost(); 413 context_lost_callback_->onContextLost();
405 } 414 }
406 415
407 share_group_->RemoveAllContexts(); 416 share_group_->RemoveAllContexts();
408 417
409 DCHECK(host_.get()); 418 DCHECK(host_.get());
410 { 419 {
411 base::AutoLock lock(g_default_share_groups_lock.Get()); 420 base::AutoLock lock(g_default_share_groups_lock.Get());
412 g_default_share_groups.Get().erase(host_.get()); 421 g_default_share_groups.Get().erase(host_.get());
413 } 422 }
423
424 gpu::CommandBuffer::State state = command_buffer_->GetLastState();
425 UmaRecordContextLost(context_type_, state.error, state.context_lost_reason);
414 } 426 }
415 427
416 } // namespace content 428 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h ('k') | content/common/gpu/gpu_command_buffer_stub.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698