OLD | NEW |
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 Loading... |
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 | |
182 } // anonymous namespace | 178 } // anonymous namespace |
183 | 179 |
184 class GLRenderer::ScopedUseGrContext { | 180 class GLRenderer::ScopedUseGrContext { |
185 public: | 181 public: |
186 static scoped_ptr<ScopedUseGrContext> Create(GLRenderer* renderer, | 182 static scoped_ptr<ScopedUseGrContext> Create(GLRenderer* renderer, |
187 DrawingFrame* frame) { | 183 DrawingFrame* frame) { |
188 if (!renderer->output_surface_->context_provider()->GrContext()) | 184 if (!renderer->output_surface_->context_provider()->GrContext()) |
189 return scoped_ptr<ScopedUseGrContext>(); | 185 return scoped_ptr<ScopedUseGrContext>(); |
190 return make_scoped_ptr(new ScopedUseGrContext(renderer, frame)); | 186 return make_scoped_ptr(new ScopedUseGrContext(renderer, frame)); |
191 } | 187 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 | 241 |
246 void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); } | 242 void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); } |
247 | 243 |
248 bool IsPending() { | 244 bool IsPending() { |
249 unsigned available = 1; | 245 unsigned available = 1; |
250 gl_->GetQueryObjectuivEXT( | 246 gl_->GetQueryObjectuivEXT( |
251 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); | 247 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
252 return !available; | 248 return !available; |
253 } | 249 } |
254 | 250 |
255 void Wait() { | |
256 unsigned result = 0; | |
257 gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result); | |
258 } | |
259 | |
260 private: | 251 private: |
261 class Fence : public ResourceProvider::Fence { | 252 class Fence : public ResourceProvider::Fence { |
262 public: | 253 public: |
263 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query) | 254 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query) |
264 : query_(query) {} | 255 : query_(query) {} |
265 | 256 |
266 // Overridden from ResourceProvider::Fence: | 257 // Overridden from ResourceProvider::Fence: |
267 virtual bool HasPassed() OVERRIDE { | 258 virtual bool HasPassed() OVERRIDE { |
268 return !query_ || !query_->IsPending(); | 259 return !query_ || !query_->IsPending(); |
269 } | 260 } |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 434 } |
444 | 435 |
445 void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) { | 436 void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
446 if (frame->device_viewport_rect.IsEmpty()) | 437 if (frame->device_viewport_rect.IsEmpty()) |
447 return; | 438 return; |
448 | 439 |
449 TRACE_EVENT0("cc", "GLRenderer::BeginDrawingFrame"); | 440 TRACE_EVENT0("cc", "GLRenderer::BeginDrawingFrame"); |
450 | 441 |
451 scoped_refptr<ResourceProvider::Fence> read_lock_fence; | 442 scoped_refptr<ResourceProvider::Fence> read_lock_fence; |
452 if (use_sync_query_) { | 443 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 | |
462 while (!pending_sync_queries_.empty()) { | 444 while (!pending_sync_queries_.empty()) { |
463 if (pending_sync_queries_.front()->IsPending()) | 445 if (pending_sync_queries_.front()->IsPending()) |
464 break; | 446 break; |
465 | 447 |
466 available_sync_queries_.push_back(pending_sync_queries_.take_front()); | 448 available_sync_queries_.push_back(pending_sync_queries_.take_front()); |
467 } | 449 } |
468 | 450 |
469 current_sync_query_ = available_sync_queries_.empty() | 451 current_sync_query_ = available_sync_queries_.empty() |
470 ? make_scoped_ptr(new SyncQuery(gl_)) | 452 ? make_scoped_ptr(new SyncQuery(gl_)) |
471 : available_sync_queries_.take_front(); | 453 : available_sync_queries_.take_front(); |
(...skipping 2702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3174 context_support_->ScheduleOverlayPlane( | 3156 context_support_->ScheduleOverlayPlane( |
3175 overlay.plane_z_order, | 3157 overlay.plane_z_order, |
3176 overlay.transform, | 3158 overlay.transform, |
3177 pending_overlay_resources_.back()->texture_id(), | 3159 pending_overlay_resources_.back()->texture_id(), |
3178 overlay.display_rect, | 3160 overlay.display_rect, |
3179 overlay.uv_rect); | 3161 overlay.uv_rect); |
3180 } | 3162 } |
3181 } | 3163 } |
3182 | 3164 |
3183 } // namespace cc | 3165 } // namespace cc |
OLD | NEW |