OLD | NEW |
---|---|
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 Loading... | |
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 11201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11884 return true; | 11885 return true; |
11885 } | 11886 } |
11886 | 11887 |
11887 void GLES2DecoderImpl::DeleteQueriesEXTHelper( | 11888 void GLES2DecoderImpl::DeleteQueriesEXTHelper( |
11888 GLsizei n, const GLuint* client_ids) { | 11889 GLsizei n, const GLuint* client_ids) { |
11889 for (GLsizei ii = 0; ii < n; ++ii) { | 11890 for (GLsizei ii = 0; ii < n; ++ii) { |
11890 query_manager_->RemoveQuery(client_ids[ii]); | 11891 query_manager_->RemoveQuery(client_ids[ii]); |
11891 } | 11892 } |
11892 } | 11893 } |
11893 | 11894 |
11894 bool GLES2DecoderImpl::ProcessPendingQueries(bool did_finish) { | 11895 bool GLES2DecoderImpl::HasPendingQueries() const { |
11895 if (query_manager_.get() == NULL) { | 11896 return query_manager_.get() && query_manager_->HavePendingQueries(); |
11896 return false; | 11897 } |
11897 } | 11898 |
11898 if (!query_manager_->ProcessPendingQueries(did_finish)) { | 11899 void GLES2DecoderImpl::ProcessPendingQueries(bool did_finish) { |
11900 if (!query_manager_.get()) | |
dshwang
2015/09/01 08:56:10
if (!HasPendingQueries())
reveman
2015/09/01 15:54:11
It's up to the caller to do that check if needed.
| |
11901 return; | |
11902 if (!query_manager_->ProcessPendingQueries(did_finish)) | |
11899 current_decoder_error_ = error::kOutOfBounds; | 11903 current_decoder_error_ = error::kOutOfBounds; |
11900 } | |
11901 return query_manager_->HavePendingQueries(); | |
11902 } | 11904 } |
11903 | 11905 |
11904 // Note that if there are no pending readpixels right now, | 11906 // Note that if there are no pending readpixels right now, |
11905 // this function will call the callback immediately. | 11907 // this function will call the callback immediately. |
11906 void GLES2DecoderImpl::WaitForReadPixels(base::Closure callback) { | 11908 void GLES2DecoderImpl::WaitForReadPixels(base::Closure callback) { |
11907 if (features().use_async_readpixels && !pending_readpixel_fences_.empty()) { | 11909 if (features().use_async_readpixels && !pending_readpixel_fences_.empty()) { |
11908 pending_readpixel_fences_.back()->callbacks.push_back(callback); | 11910 pending_readpixel_fences_.back()->callbacks.push_back(callback); |
11909 } else { | 11911 } else { |
11910 callback.Run(); | 11912 callback.Run(); |
11911 } | 11913 } |
11912 } | 11914 } |
11913 | 11915 |
11914 void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) { | 11916 void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) { |
11915 // Note: |did_finish| guarantees that the GPU has passed the fence but | 11917 // Note: |did_finish| guarantees that the GPU has passed the fence but |
11916 // we cannot assume that GLFence::HasCompleted() will return true yet as | 11918 // we cannot assume that GLFence::HasCompleted() will return true yet as |
11917 // that's not guaranteed by all GLFence implementations. | 11919 // that's not guaranteed by all GLFence implementations. |
11918 while (!pending_readpixel_fences_.empty() && | 11920 while (!pending_readpixel_fences_.empty() && |
11919 (did_finish || | 11921 (did_finish || |
11920 pending_readpixel_fences_.front()->fence->HasCompleted())) { | 11922 pending_readpixel_fences_.front()->fence->HasCompleted())) { |
11921 std::vector<base::Closure> callbacks = | 11923 std::vector<base::Closure> callbacks = |
11922 pending_readpixel_fences_.front()->callbacks; | 11924 pending_readpixel_fences_.front()->callbacks; |
11923 pending_readpixel_fences_.pop(); | 11925 pending_readpixel_fences_.pop(); |
11924 for (size_t i = 0; i < callbacks.size(); i++) { | 11926 for (size_t i = 0; i < callbacks.size(); i++) { |
11925 callbacks[i].Run(); | 11927 callbacks[i].Run(); |
11926 } | 11928 } |
11927 } | 11929 } |
11928 } | 11930 } |
11929 | 11931 |
11930 bool GLES2DecoderImpl::HasMoreIdleWork() { | 11932 bool GLES2DecoderImpl::HasMoreIdleWork() const { |
11931 return !pending_readpixel_fences_.empty() || | 11933 return !pending_readpixel_fences_.empty() || |
11932 gpu_tracer_->HasTracesToProcess(); | 11934 gpu_tracer_->HasTracesToProcess(); |
11933 } | 11935 } |
11934 | 11936 |
11935 void GLES2DecoderImpl::PerformIdleWork() { | 11937 void GLES2DecoderImpl::PerformIdleWork() { |
11936 gpu_tracer_->ProcessTraces(); | 11938 gpu_tracer_->ProcessTraces(); |
11937 ProcessPendingReadPixels(false); | 11939 ProcessPendingReadPixels(false); |
11938 } | 11940 } |
11939 | 11941 |
11940 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32 immediate_data_size, | 11942 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32 immediate_data_size, |
(...skipping 2726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14667 return error::kNoError; | 14669 return error::kNoError; |
14668 } | 14670 } |
14669 | 14671 |
14670 // Include the auto-generated part of this file. We split this because it means | 14672 // Include the auto-generated part of this file. We split this because it means |
14671 // we can easily edit the non-auto generated parts right here in this file | 14673 // we can easily edit the non-auto generated parts right here in this file |
14672 // instead of having to edit some template or the code generator. | 14674 // instead of having to edit some template or the code generator. |
14673 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 14675 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
14674 | 14676 |
14675 } // namespace gles2 | 14677 } // namespace gles2 |
14676 } // namespace gpu | 14678 } // namespace gpu |
OLD | NEW |