| 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 <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 2173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2184 | 2184 |
| 2185 std::unique_ptr<GPUTracer> gpu_tracer_; | 2185 std::unique_ptr<GPUTracer> gpu_tracer_; |
| 2186 std::unique_ptr<GPUStateTracer> gpu_state_tracer_; | 2186 std::unique_ptr<GPUStateTracer> gpu_state_tracer_; |
| 2187 const unsigned char* gpu_decoder_category_; | 2187 const unsigned char* gpu_decoder_category_; |
| 2188 int gpu_trace_level_; | 2188 int gpu_trace_level_; |
| 2189 bool gpu_trace_commands_; | 2189 bool gpu_trace_commands_; |
| 2190 bool gpu_debug_commands_; | 2190 bool gpu_debug_commands_; |
| 2191 | 2191 |
| 2192 std::queue<linked_ptr<FenceCallback> > pending_readpixel_fences_; | 2192 std::queue<linked_ptr<FenceCallback> > pending_readpixel_fences_; |
| 2193 | 2193 |
| 2194 // After this fence is inserted, both the GpuChannelMessageQueue and | 2194 // After a second fence is inserted, both the GpuChannelMessageQueue and |
| 2195 // CommandExecutor are descheduled. Once the fence has completed, both get | 2195 // CommandExecutor are descheduled. Once the first fence has completed, both |
| 2196 // rescheduled. | 2196 // get rescheduled. |
| 2197 std::unique_ptr<gl::GLFence> deschedule_until_finished_fence_; | 2197 std::vector<std::unique_ptr<gl::GLFence>> deschedule_until_finished_fences_; |
| 2198 | 2198 |
| 2199 // Used to validate multisample renderbuffers if needed | 2199 // Used to validate multisample renderbuffers if needed |
| 2200 GLuint validation_texture_; | 2200 GLuint validation_texture_; |
| 2201 GLuint validation_fbo_multisample_; | 2201 GLuint validation_fbo_multisample_; |
| 2202 GLuint validation_fbo_; | 2202 GLuint validation_fbo_; |
| 2203 | 2203 |
| 2204 typedef gpu::gles2::GLES2Decoder::Error (GLES2DecoderImpl::*CmdHandler)( | 2204 typedef gpu::gles2::GLES2Decoder::Error (GLES2DecoderImpl::*CmdHandler)( |
| 2205 uint32_t immediate_data_size, | 2205 uint32_t immediate_data_size, |
| 2206 const void* data); | 2206 const void* data); |
| 2207 | 2207 |
| (...skipping 11459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13667 uint32_t immediate_data_size, | 13667 uint32_t immediate_data_size, |
| 13668 const void* cmd_data) { | 13668 const void* cmd_data) { |
| 13669 if (deschedule_until_finished_callback_.is_null() || | 13669 if (deschedule_until_finished_callback_.is_null() || |
| 13670 reschedule_after_finished_callback_.is_null()) { | 13670 reschedule_after_finished_callback_.is_null()) { |
| 13671 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | 13671 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 13672 "glDescheduleUntilFinishedCHROMIUM", | 13672 "glDescheduleUntilFinishedCHROMIUM", |
| 13673 "Not fully implemented."); | 13673 "Not fully implemented."); |
| 13674 return error::kNoError; | 13674 return error::kNoError; |
| 13675 } | 13675 } |
| 13676 | 13676 |
| 13677 deschedule_until_finished_fence_.reset(gl::GLFence::Create()); | 13677 std::unique_ptr<gl::GLFence> fence(gl::GLFence::Create()); |
| 13678 DCHECK(deschedule_until_finished_fence_); | 13678 deschedule_until_finished_fences_.push_back(std::move(fence)); |
| 13679 if (deschedule_until_finished_fence_->HasCompleted()) { | 13679 |
| 13680 deschedule_until_finished_fence_.reset(); | 13680 if (deschedule_until_finished_fences_.size() == 1) |
| 13681 return error::kNoError; |
| 13682 |
| 13683 DCHECK_EQ(2u, deschedule_until_finished_fences_.size()); |
| 13684 if (deschedule_until_finished_fences_[0]->HasCompleted()) { |
| 13685 deschedule_until_finished_fences_.erase( |
| 13686 deschedule_until_finished_fences_.begin()); |
| 13681 return error::kNoError; | 13687 return error::kNoError; |
| 13682 } | 13688 } |
| 13683 | 13689 |
| 13684 TRACE_EVENT_ASYNC_BEGIN0("cc", "GLES2DecoderImpl::DescheduleUntilFinished", | 13690 TRACE_EVENT_ASYNC_BEGIN0("cc", "GLES2DecoderImpl::DescheduleUntilFinished", |
| 13685 this); | 13691 this); |
| 13686 deschedule_until_finished_callback_.Run(); | 13692 deschedule_until_finished_callback_.Run(); |
| 13687 return error::kDeferLaterCommands; | 13693 return error::kDeferLaterCommands; |
| 13688 } | 13694 } |
| 13689 | 13695 |
| 13690 error::Error GLES2DecoderImpl::HandleInsertFenceSyncCHROMIUM( | 13696 error::Error GLES2DecoderImpl::HandleInsertFenceSyncCHROMIUM( |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13807 std::vector<base::Closure> callbacks = | 13813 std::vector<base::Closure> callbacks = |
| 13808 pending_readpixel_fences_.front()->callbacks; | 13814 pending_readpixel_fences_.front()->callbacks; |
| 13809 pending_readpixel_fences_.pop(); | 13815 pending_readpixel_fences_.pop(); |
| 13810 for (size_t i = 0; i < callbacks.size(); i++) { | 13816 for (size_t i = 0; i < callbacks.size(); i++) { |
| 13811 callbacks[i].Run(); | 13817 callbacks[i].Run(); |
| 13812 } | 13818 } |
| 13813 } | 13819 } |
| 13814 } | 13820 } |
| 13815 | 13821 |
| 13816 void GLES2DecoderImpl::ProcessDescheduleUntilFinished() { | 13822 void GLES2DecoderImpl::ProcessDescheduleUntilFinished() { |
| 13817 if (!deschedule_until_finished_fence_) | 13823 if (deschedule_until_finished_fences_.size() < 2) |
| 13818 return; | 13824 return; |
| 13825 DCHECK_EQ(2u, deschedule_until_finished_fences_.size()); |
| 13819 | 13826 |
| 13820 if (!deschedule_until_finished_fence_->HasCompleted()) | 13827 if (!deschedule_until_finished_fences_[0]->HasCompleted()) |
| 13821 return; | 13828 return; |
| 13822 | 13829 |
| 13823 TRACE_EVENT_ASYNC_END0("cc", "GLES2DecoderImpl::DescheduleUntilFinished", | 13830 TRACE_EVENT_ASYNC_END0("cc", "GLES2DecoderImpl::DescheduleUntilFinished", |
| 13824 this); | 13831 this); |
| 13825 deschedule_until_finished_fence_.reset(); | 13832 deschedule_until_finished_fences_.erase( |
| 13833 deschedule_until_finished_fences_.begin()); |
| 13826 reschedule_after_finished_callback_.Run(); | 13834 reschedule_after_finished_callback_.Run(); |
| 13827 } | 13835 } |
| 13828 | 13836 |
| 13829 bool GLES2DecoderImpl::HasMoreIdleWork() const { | 13837 bool GLES2DecoderImpl::HasMoreIdleWork() const { |
| 13830 return !pending_readpixel_fences_.empty() || | 13838 return !pending_readpixel_fences_.empty() || |
| 13831 gpu_tracer_->HasTracesToProcess(); | 13839 gpu_tracer_->HasTracesToProcess(); |
| 13832 } | 13840 } |
| 13833 | 13841 |
| 13834 void GLES2DecoderImpl::PerformIdleWork() { | 13842 void GLES2DecoderImpl::PerformIdleWork() { |
| 13835 gpu_tracer_->ProcessTraces(); | 13843 gpu_tracer_->ProcessTraces(); |
| 13836 ProcessPendingReadPixels(false); | 13844 ProcessPendingReadPixels(false); |
| 13837 } | 13845 } |
| 13838 | 13846 |
| 13839 bool GLES2DecoderImpl::HasPollingWork() const { | 13847 bool GLES2DecoderImpl::HasPollingWork() const { |
| 13840 return !!deschedule_until_finished_fence_.get(); | 13848 return deschedule_until_finished_fences_.size() >= 2; |
| 13841 } | 13849 } |
| 13842 | 13850 |
| 13843 void GLES2DecoderImpl::PerformPollingWork() { | 13851 void GLES2DecoderImpl::PerformPollingWork() { |
| 13844 ProcessDescheduleUntilFinished(); | 13852 ProcessDescheduleUntilFinished(); |
| 13845 } | 13853 } |
| 13846 | 13854 |
| 13847 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32_t immediate_data_size, | 13855 error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32_t immediate_data_size, |
| 13848 const void* cmd_data) { | 13856 const void* cmd_data) { |
| 13849 const gles2::cmds::BeginQueryEXT& c = | 13857 const gles2::cmds::BeginQueryEXT& c = |
| 13850 *static_cast<const gles2::cmds::BeginQueryEXT*>(cmd_data); | 13858 *static_cast<const gles2::cmds::BeginQueryEXT*>(cmd_data); |
| (...skipping 2954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16805 } | 16813 } |
| 16806 | 16814 |
| 16807 // Include the auto-generated part of this file. We split this because it means | 16815 // Include the auto-generated part of this file. We split this because it means |
| 16808 // we can easily edit the non-auto generated parts right here in this file | 16816 // we can easily edit the non-auto generated parts right here in this file |
| 16809 // instead of having to edit some template or the code generator. | 16817 // instead of having to edit some template or the code generator. |
| 16810 #include "base/macros.h" | 16818 #include "base/macros.h" |
| 16811 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 16819 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 16812 | 16820 |
| 16813 } // namespace gles2 | 16821 } // namespace gles2 |
| 16814 } // namespace gpu | 16822 } // namespace gpu |
| OLD | NEW |