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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 1315713007: gpu: Reduce GL context switches used to check pending queries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 3 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 "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 QueryManager* GetQueryManager() override { return query_manager_.get(); } 660 QueryManager* GetQueryManager() override { return query_manager_.get(); }
661 VertexArrayManager* GetVertexArrayManager() override { 661 VertexArrayManager* GetVertexArrayManager() override {
662 return vertex_array_manager_.get(); 662 return vertex_array_manager_.get();
663 } 663 }
664 ImageManager* GetImageManager() override { return image_manager_.get(); } 664 ImageManager* GetImageManager() override { return image_manager_.get(); }
665 665
666 ValuebufferManager* GetValuebufferManager() override { 666 ValuebufferManager* GetValuebufferManager() override {
667 return valuebuffer_manager(); 667 return valuebuffer_manager();
668 } 668 }
669 669
670 bool ProcessPendingQueries(bool did_finish) override; 670 bool HasPendingQueries() const override;
671 void ProcessPendingQueries(bool did_finish) override;
671 672
672 bool HasMoreIdleWork() override; 673 bool HasMoreIdleWork() const override;
673 void PerformIdleWork() override; 674 void PerformIdleWork() override;
674 675
675 void WaitForReadPixels(base::Closure callback) override; 676 void WaitForReadPixels(base::Closure callback) override;
676 677
677 void SetResizeCallback( 678 void SetResizeCallback(
678 const base::Callback<void(gfx::Size, float)>& callback) override; 679 const base::Callback<void(gfx::Size, float)>& callback) override;
679 680
680 Logger* GetLogger() override; 681 Logger* GetLogger() override;
681 682
682 void BeginDecoding() override; 683 void BeginDecoding() override;
(...skipping 11569 matching lines...) Expand 10 before | Expand all | Expand 10 after
12252 return true; 12253 return true;
12253 } 12254 }
12254 12255
12255 void GLES2DecoderImpl::DeleteQueriesEXTHelper( 12256 void GLES2DecoderImpl::DeleteQueriesEXTHelper(
12256 GLsizei n, const GLuint* client_ids) { 12257 GLsizei n, const GLuint* client_ids) {
12257 for (GLsizei ii = 0; ii < n; ++ii) { 12258 for (GLsizei ii = 0; ii < n; ++ii) {
12258 query_manager_->RemoveQuery(client_ids[ii]); 12259 query_manager_->RemoveQuery(client_ids[ii]);
12259 } 12260 }
12260 } 12261 }
12261 12262
12262 bool GLES2DecoderImpl::ProcessPendingQueries(bool did_finish) { 12263 bool GLES2DecoderImpl::HasPendingQueries() const {
12263 if (query_manager_.get() == NULL) { 12264 return query_manager_.get() && query_manager_->HavePendingQueries();
12264 return false; 12265 }
12265 } 12266
12266 if (!query_manager_->ProcessPendingQueries(did_finish)) { 12267 void GLES2DecoderImpl::ProcessPendingQueries(bool did_finish) {
12268 if (!query_manager_.get())
12269 return;
12270 if (!query_manager_->ProcessPendingQueries(did_finish))
12267 current_decoder_error_ = error::kOutOfBounds; 12271 current_decoder_error_ = error::kOutOfBounds;
12268 }
12269 return query_manager_->HavePendingQueries();
12270 } 12272 }
12271 12273
12272 // Note that if there are no pending readpixels right now, 12274 // Note that if there are no pending readpixels right now,
12273 // this function will call the callback immediately. 12275 // this function will call the callback immediately.
12274 void GLES2DecoderImpl::WaitForReadPixels(base::Closure callback) { 12276 void GLES2DecoderImpl::WaitForReadPixels(base::Closure callback) {
12275 if (features().use_async_readpixels && !pending_readpixel_fences_.empty()) { 12277 if (features().use_async_readpixels && !pending_readpixel_fences_.empty()) {
12276 pending_readpixel_fences_.back()->callbacks.push_back(callback); 12278 pending_readpixel_fences_.back()->callbacks.push_back(callback);
12277 } else { 12279 } else {
12278 callback.Run(); 12280 callback.Run();
12279 } 12281 }
12280 } 12282 }
12281 12283
12282 void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) { 12284 void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) {
12283 // Note: |did_finish| guarantees that the GPU has passed the fence but 12285 // Note: |did_finish| guarantees that the GPU has passed the fence but
12284 // we cannot assume that GLFence::HasCompleted() will return true yet as 12286 // we cannot assume that GLFence::HasCompleted() will return true yet as
12285 // that's not guaranteed by all GLFence implementations. 12287 // that's not guaranteed by all GLFence implementations.
12286 while (!pending_readpixel_fences_.empty() && 12288 while (!pending_readpixel_fences_.empty() &&
12287 (did_finish || 12289 (did_finish ||
12288 pending_readpixel_fences_.front()->fence->HasCompleted())) { 12290 pending_readpixel_fences_.front()->fence->HasCompleted())) {
12289 std::vector<base::Closure> callbacks = 12291 std::vector<base::Closure> callbacks =
12290 pending_readpixel_fences_.front()->callbacks; 12292 pending_readpixel_fences_.front()->callbacks;
12291 pending_readpixel_fences_.pop(); 12293 pending_readpixel_fences_.pop();
12292 for (size_t i = 0; i < callbacks.size(); i++) { 12294 for (size_t i = 0; i < callbacks.size(); i++) {
12293 callbacks[i].Run(); 12295 callbacks[i].Run();
12294 } 12296 }
12295 } 12297 }
12296 } 12298 }
12297 12299
12298 bool GLES2DecoderImpl::HasMoreIdleWork() { 12300 bool GLES2DecoderImpl::HasMoreIdleWork() const {
12299 return !pending_readpixel_fences_.empty() || 12301 return !pending_readpixel_fences_.empty() ||
12300 gpu_tracer_->HasTracesToProcess(); 12302 gpu_tracer_->HasTracesToProcess();
12301 } 12303 }
12302 12304
12303 void GLES2DecoderImpl::PerformIdleWork() { 12305 void GLES2DecoderImpl::PerformIdleWork() {
12304 gpu_tracer_->ProcessTraces(); 12306 gpu_tracer_->ProcessTraces();
12305 ProcessPendingReadPixels(false); 12307 ProcessPendingReadPixels(false);
12306 } 12308 }
12307 12309
12308 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32 immediate_data_size, 12310 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32 immediate_data_size,
(...skipping 2740 matching lines...) Expand 10 before | Expand all | Expand 10 after
15049 return error::kNoError; 15051 return error::kNoError;
15050 } 15052 }
15051 15053
15052 // Include the auto-generated part of this file. We split this because it means 15054 // Include the auto-generated part of this file. We split this because it means
15053 // we can easily edit the non-auto generated parts right here in this file 15055 // we can easily edit the non-auto generated parts right here in this file
15054 // instead of having to edit some template or the code generator. 15056 // instead of having to edit some template or the code generator.
15055 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 15057 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
15056 15058
15057 } // namespace gles2 15059 } // namespace gles2
15058 } // namespace gpu 15060 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698