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

Side by Side Diff: cc/output/gl_renderer.cc

Issue 280543003: Re-land: cc: Fail more visibly when sync queries are not working correctly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: signed/unsigned compare fix Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 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 "cc/output/gl_renderer.h" 5 #include "cc/output/gl_renderer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 default: 168 default:
169 NOTREACHED(); 169 NOTREACHED();
170 return SamplerType2D; 170 return SamplerType2D;
171 } 171 }
172 } 172 }
173 173
174 // Smallest unit that impact anti-aliasing output. We use this to 174 // Smallest unit that impact anti-aliasing output. We use this to
175 // determine when anti-aliasing is unnecessary. 175 // determine when anti-aliasing is unnecessary.
176 const float kAntiAliasingEpsilon = 1.0f / 1024.0f; 176 const float kAntiAliasingEpsilon = 1.0f / 1024.0f;
177 177
178 // Block or crash if the number of pending sync queries reach this high as
179 // something is seriously wrong on the service side if this happens.
180 const size_t kMaxPendingSyncQueries = 16;
181
178 } // anonymous namespace 182 } // anonymous namespace
179 183
180 class GLRenderer::ScopedUseGrContext { 184 class GLRenderer::ScopedUseGrContext {
181 public: 185 public:
182 static scoped_ptr<ScopedUseGrContext> Create(GLRenderer* renderer, 186 static scoped_ptr<ScopedUseGrContext> Create(GLRenderer* renderer,
183 DrawingFrame* frame) { 187 DrawingFrame* frame) {
184 if (!renderer->output_surface_->context_provider()->GrContext()) 188 if (!renderer->output_surface_->context_provider()->GrContext())
185 return scoped_ptr<ScopedUseGrContext>(); 189 return scoped_ptr<ScopedUseGrContext>();
186 return make_scoped_ptr(new ScopedUseGrContext(renderer, frame)); 190 return make_scoped_ptr(new ScopedUseGrContext(renderer, frame));
187 } 191 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 245
242 void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); } 246 void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); }
243 247
244 bool IsPending() { 248 bool IsPending() {
245 unsigned available = 1; 249 unsigned available = 1;
246 gl_->GetQueryObjectuivEXT( 250 gl_->GetQueryObjectuivEXT(
247 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 251 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
248 return !available; 252 return !available;
249 } 253 }
250 254
255 void Wait() {
256 unsigned result = 0;
257 gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result);
258 }
259
251 private: 260 private:
252 class Fence : public ResourceProvider::Fence { 261 class Fence : public ResourceProvider::Fence {
253 public: 262 public:
254 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query) 263 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query)
255 : query_(query) {} 264 : query_(query) {}
256 265
257 // Overridden from ResourceProvider::Fence: 266 // Overridden from ResourceProvider::Fence:
258 virtual bool HasPassed() OVERRIDE { 267 virtual bool HasPassed() OVERRIDE {
259 return !query_ || !query_->IsPending(); 268 return !query_ || !query_->IsPending();
260 } 269 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 } 443 }
435 444
436 void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) { 445 void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) {
437 if (frame->device_viewport_rect.IsEmpty()) 446 if (frame->device_viewport_rect.IsEmpty())
438 return; 447 return;
439 448
440 TRACE_EVENT0("cc", "GLRenderer::BeginDrawingFrame"); 449 TRACE_EVENT0("cc", "GLRenderer::BeginDrawingFrame");
441 450
442 scoped_refptr<ResourceProvider::Fence> read_lock_fence; 451 scoped_refptr<ResourceProvider::Fence> read_lock_fence;
443 if (use_sync_query_) { 452 if (use_sync_query_) {
453 // Block until oldest sync query has passed if the number of pending queries
454 // ever reach kMaxPendingSyncQueries.
455 if (pending_sync_queries_.size() >= kMaxPendingSyncQueries) {
456 LOG(ERROR) << "Reached limit of pending sync queries.";
457
458 pending_sync_queries_.front()->Wait();
459 DCHECK(!pending_sync_queries_.front()->IsPending());
460 }
461
444 while (!pending_sync_queries_.empty()) { 462 while (!pending_sync_queries_.empty()) {
445 if (pending_sync_queries_.front()->IsPending()) 463 if (pending_sync_queries_.front()->IsPending())
446 break; 464 break;
447 465
448 available_sync_queries_.push_back(pending_sync_queries_.take_front()); 466 available_sync_queries_.push_back(pending_sync_queries_.take_front());
449 } 467 }
450 468
451 current_sync_query_ = available_sync_queries_.empty() 469 current_sync_query_ = available_sync_queries_.empty()
452 ? make_scoped_ptr(new SyncQuery(gl_)) 470 ? make_scoped_ptr(new SyncQuery(gl_))
453 : available_sync_queries_.take_front(); 471 : available_sync_queries_.take_front();
(...skipping 2767 matching lines...) Expand 10 before | Expand all | Expand 10 after
3221 context_support_->ScheduleOverlayPlane( 3239 context_support_->ScheduleOverlayPlane(
3222 overlay.plane_z_order, 3240 overlay.plane_z_order,
3223 overlay.transform, 3241 overlay.transform,
3224 pending_overlay_resources_.back()->texture_id(), 3242 pending_overlay_resources_.back()->texture_id(),
3225 overlay.display_rect, 3243 overlay.display_rect,
3226 overlay.uv_rect); 3244 overlay.uv_rect);
3227 } 3245 }
3228 } 3246 }
3229 3247
3230 } // namespace cc 3248 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698