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

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

Issue 398543004: cc: Avoid issuing COMMANDS_COMPLETED queries unless necessary. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: issue BeginQueryEXT before first drawing command Created 6 years, 5 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 | cc/resources/image_raster_worker_pool.cc » ('j') | 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 #include "ui/gfx/rect_conversions.h" 56 #include "ui/gfx/rect_conversions.h"
57 57
58 using gpu::gles2::GLES2Interface; 58 using gpu::gles2::GLES2Interface;
59 59
60 namespace cc { 60 namespace cc {
61 namespace { 61 namespace {
62 62
63 class FallbackFence : public ResourceProvider::Fence { 63 class FallbackFence : public ResourceProvider::Fence {
64 public: 64 public:
65 explicit FallbackFence(gpu::gles2::GLES2Interface* gl) 65 explicit FallbackFence(gpu::gles2::GLES2Interface* gl)
66 : gl_(gl), has_passed_(false) {} 66 : gl_(gl), has_passed_(true) {}
67 67
68 // Overridden from ResourceProvider::Fence: 68 // Overridden from ResourceProvider::Fence:
69 virtual void Set() OVERRIDE { has_passed_ = false; }
69 virtual bool HasPassed() OVERRIDE { 70 virtual bool HasPassed() OVERRIDE {
70 if (!has_passed_) { 71 if (!has_passed_) {
71 has_passed_ = true; 72 has_passed_ = true;
72 Synchronize(); 73 Synchronize();
73 } 74 }
74 return true; 75 return true;
75 } 76 }
76 77
77 private: 78 private:
78 virtual ~FallbackFence() {} 79 virtual ~FallbackFence() {}
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 base::CancelableClosure finished_read_pixels_callback; 229 base::CancelableClosure finished_read_pixels_callback;
229 unsigned buffer; 230 unsigned buffer;
230 231
231 private: 232 private:
232 DISALLOW_COPY_AND_ASSIGN(PendingAsyncReadPixels); 233 DISALLOW_COPY_AND_ASSIGN(PendingAsyncReadPixels);
233 }; 234 };
234 235
235 class GLRenderer::SyncQuery { 236 class GLRenderer::SyncQuery {
236 public: 237 public:
237 explicit SyncQuery(gpu::gles2::GLES2Interface* gl) 238 explicit SyncQuery(gpu::gles2::GLES2Interface* gl)
238 : gl_(gl), query_id_(0u), weak_ptr_factory_(this) { 239 : gl_(gl), query_id_(0u), is_pending_(false), weak_ptr_factory_(this) {
239 gl_->GenQueriesEXT(1, &query_id_); 240 gl_->GenQueriesEXT(1, &query_id_);
240 } 241 }
241 virtual ~SyncQuery() { gl_->DeleteQueriesEXT(1, &query_id_); } 242 virtual ~SyncQuery() { gl_->DeleteQueriesEXT(1, &query_id_); }
242 243
243 scoped_refptr<ResourceProvider::Fence> Begin() { 244 scoped_refptr<ResourceProvider::Fence> Begin() {
244 DCHECK(!weak_ptr_factory_.HasWeakPtrs() || !IsPending()); 245 DCHECK(!IsPending());
245 // Invalidate weak pointer held by old fence. 246 // Invalidate weak pointer held by old fence.
246 weak_ptr_factory_.InvalidateWeakPtrs(); 247 weak_ptr_factory_.InvalidateWeakPtrs();
247 gl_->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_); 248 // Note: In case the set of drawing commands issued before End() do not
249 // depend on the query, defer BeginQueryEXT call until Set() is called and
250 // query is required.
248 return make_scoped_refptr<ResourceProvider::Fence>( 251 return make_scoped_refptr<ResourceProvider::Fence>(
249 new Fence(weak_ptr_factory_.GetWeakPtr())); 252 new Fence(weak_ptr_factory_.GetWeakPtr()));
250 } 253 }
251 254
252 void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); } 255 void Set() {
256 if (is_pending_)
257 return;
258
259 // Note: BeginQueryEXT on GL_COMMANDS_COMPLETED_CHROMIUM is effectively a
260 // noop relative to GL, so it doesn't matter where it happens but we still
261 // make sure to issue this command when Set() is called (prior to issuing
262 // any drawing commands that depend on query), in case some future extension
263 // can take advantage of this.
264 gl_->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_);
265 is_pending_ = true;
266 }
267
268 void End() {
269 if (!is_pending_)
270 return;
271
272 gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
273 }
253 274
254 bool IsPending() { 275 bool IsPending() {
255 unsigned available = 1; 276 if (!is_pending_)
277 return false;
278
279 unsigned result_available = 1;
256 gl_->GetQueryObjectuivEXT( 280 gl_->GetQueryObjectuivEXT(
257 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 281 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &result_available);
258 return !available; 282 is_pending_ = !result_available;
283 return is_pending_;
259 } 284 }
260 285
261 void Wait() { 286 void Wait() {
287 if (!is_pending_)
288 return;
289
262 unsigned result = 0; 290 unsigned result = 0;
263 gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result); 291 gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result);
292 is_pending_ = false;
264 } 293 }
265 294
266 private: 295 private:
267 class Fence : public ResourceProvider::Fence { 296 class Fence : public ResourceProvider::Fence {
268 public: 297 public:
269 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query) 298 explicit Fence(base::WeakPtr<GLRenderer::SyncQuery> query)
270 : query_(query) {} 299 : query_(query) {}
271 300
272 // Overridden from ResourceProvider::Fence: 301 // Overridden from ResourceProvider::Fence:
302 virtual void Set() OVERRIDE {
303 DCHECK(query_);
304 query_->Set();
305 }
273 virtual bool HasPassed() OVERRIDE { 306 virtual bool HasPassed() OVERRIDE {
274 return !query_ || !query_->IsPending(); 307 return !query_ || !query_->IsPending();
275 } 308 }
276 309
277 private: 310 private:
278 virtual ~Fence() {} 311 virtual ~Fence() {}
279 312
280 base::WeakPtr<SyncQuery> query_; 313 base::WeakPtr<SyncQuery> query_;
281 314
282 DISALLOW_COPY_AND_ASSIGN(Fence); 315 DISALLOW_COPY_AND_ASSIGN(Fence);
283 }; 316 };
284 317
285 gpu::gles2::GLES2Interface* gl_; 318 gpu::gles2::GLES2Interface* gl_;
286 unsigned query_id_; 319 unsigned query_id_;
320 bool is_pending_;
287 base::WeakPtrFactory<SyncQuery> weak_ptr_factory_; 321 base::WeakPtrFactory<SyncQuery> weak_ptr_factory_;
288 322
289 DISALLOW_COPY_AND_ASSIGN(SyncQuery); 323 DISALLOW_COPY_AND_ASSIGN(SyncQuery);
290 }; 324 };
291 325
292 scoped_ptr<GLRenderer> GLRenderer::Create( 326 scoped_ptr<GLRenderer> GLRenderer::Create(
293 RendererClient* client, 327 RendererClient* client,
294 const LayerTreeSettings* settings, 328 const LayerTreeSettings* settings,
295 OutputSurface* output_surface, 329 OutputSurface* output_surface,
296 ResourceProvider* resource_provider, 330 ResourceProvider* resource_provider,
(...skipping 2874 matching lines...) Expand 10 before | Expand all | Expand 10 after
3171 context_support_->ScheduleOverlayPlane( 3205 context_support_->ScheduleOverlayPlane(
3172 overlay.plane_z_order, 3206 overlay.plane_z_order,
3173 overlay.transform, 3207 overlay.transform,
3174 pending_overlay_resources_.back()->texture_id(), 3208 pending_overlay_resources_.back()->texture_id(),
3175 overlay.display_rect, 3209 overlay.display_rect,
3176 overlay.uv_rect); 3210 overlay.uv_rect);
3177 } 3211 }
3178 } 3212 }
3179 3213
3180 } // namespace cc 3214 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/resources/image_raster_worker_pool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698