| 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 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ |
| 6 #define GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ |
| 7 | 7 |
| 8 #include <queue> | 8 #include <queue> |
| 9 | 9 |
| 10 #include "base/atomic_ref_count.h" | 10 #include "base/atomic_ref_count.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 | 58 |
| 59 ~GpuScheduler() override; | 59 ~GpuScheduler() override; |
| 60 | 60 |
| 61 void PutChanged(); | 61 void PutChanged(); |
| 62 | 62 |
| 63 void SetPreemptByFlag(scoped_refptr<PreemptionFlag> flag) { | 63 void SetPreemptByFlag(scoped_refptr<PreemptionFlag> flag) { |
| 64 preemption_flag_ = flag; | 64 preemption_flag_ = flag; |
| 65 } | 65 } |
| 66 | 66 |
| 67 // Sets whether commands should be processed by this scheduler. Setting to | 67 // Sets whether commands should be processed by this scheduler. Setting to |
| 68 // false unschedules. Setting to true reschedules. Whether or not the | 68 // false unschedules. Setting to true reschedules. |
| 69 // scheduler is currently scheduled is "reference counted". Every call with | 69 void SetScheduled(bool scheduled); |
| 70 // false must eventually be paired by a call with true. | |
| 71 void SetScheduled(bool is_scheduled); | |
| 72 | 70 |
| 73 // Returns whether the scheduler is currently able to process more commands. | 71 bool scheduled() const { return scheduled_; } |
| 74 bool IsScheduled(); | |
| 75 | 72 |
| 76 // Returns whether the scheduler needs to be polled again in the future to | 73 // Returns whether the scheduler needs to be polled again in the future to |
| 77 // process pending queries. | 74 // process pending queries. |
| 78 bool HasPendingQueries() const; | 75 bool HasPendingQueries() const; |
| 79 | 76 |
| 80 // Process pending queries and return. HasPendingQueries() can be used to | 77 // Process pending queries and return. HasPendingQueries() can be used to |
| 81 // determine if there's more pending queries after this has been called. | 78 // determine if there's more pending queries after this has been called. |
| 82 void ProcessPendingQueries(); | 79 void ProcessPendingQueries(); |
| 83 | 80 |
| 84 typedef base::Callback<void(bool /* scheduled */)> SchedulingChangedCallback; | 81 typedef base::Callback<void(bool /* scheduled */)> SchedulingChangedCallback; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 102 | 99 |
| 103 // Perform some idle work and return. HasMoreIdleWork() can be used to | 100 // Perform some idle work and return. HasMoreIdleWork() can be used to |
| 104 // determine if there's more idle work do be done after this has been called. | 101 // determine if there's more idle work do be done after this has been called. |
| 105 void PerformIdleWork(); | 102 void PerformIdleWork(); |
| 106 | 103 |
| 107 CommandParser* parser() const { | 104 CommandParser* parser() const { |
| 108 return parser_.get(); | 105 return parser_.get(); |
| 109 } | 106 } |
| 110 | 107 |
| 111 private: | 108 private: |
| 112 // Artificially reschedule if the scheduler is still unscheduled after a | |
| 113 // timeout. | |
| 114 void RescheduleTimeOut(); | |
| 115 | |
| 116 bool IsPreempted(); | 109 bool IsPreempted(); |
| 117 | 110 |
| 118 // The GpuScheduler holds a weak reference to the CommandBuffer. The | 111 // The GpuScheduler holds a weak reference to the CommandBuffer. The |
| 119 // CommandBuffer owns the GpuScheduler and holds a strong reference to it | 112 // CommandBuffer owns the GpuScheduler and holds a strong reference to it |
| 120 // through the ProcessCommands callback. | 113 // through the ProcessCommands callback. |
| 121 CommandBufferServiceBase* command_buffer_; | 114 CommandBufferServiceBase* command_buffer_; |
| 122 | 115 |
| 123 // The parser uses this to execute commands. | 116 // The parser uses this to execute commands. |
| 124 AsyncAPIInterface* handler_; | 117 AsyncAPIInterface* handler_; |
| 125 | 118 |
| 126 // Does not own decoder. TODO(apatrick): The GpuScheduler shouldn't need a | 119 // Does not own decoder. TODO(apatrick): The GpuScheduler shouldn't need a |
| 127 // pointer to the decoder, it is only used to initialize the CommandParser, | 120 // pointer to the decoder, it is only used to initialize the CommandParser, |
| 128 // which could be an argument to the constructor, and to determine the | 121 // which could be an argument to the constructor, and to determine the |
| 129 // reason for context lost. | 122 // reason for context lost. |
| 130 gles2::GLES2Decoder* decoder_; | 123 gles2::GLES2Decoder* decoder_; |
| 131 | 124 |
| 132 // TODO(apatrick): The GpuScheduler currently creates and owns the parser. | 125 // TODO(apatrick): The GpuScheduler currently creates and owns the parser. |
| 133 // This should be an argument to the constructor. | 126 // This should be an argument to the constructor. |
| 134 scoped_ptr<CommandParser> parser_; | 127 scoped_ptr<CommandParser> parser_; |
| 135 | 128 |
| 136 // Greater than zero if this is waiting to be rescheduled before continuing. | 129 // Whether the scheduler is currently able to process more commands. |
| 137 int unscheduled_count_; | 130 bool scheduled_; |
| 138 | |
| 139 // The number of times this scheduler has been artificially rescheduled on | |
| 140 // account of a timeout. | |
| 141 int rescheduled_count_; | |
| 142 | 131 |
| 143 SchedulingChangedCallback scheduling_changed_callback_; | 132 SchedulingChangedCallback scheduling_changed_callback_; |
| 144 base::Closure descheduled_callback_; | 133 base::Closure descheduled_callback_; |
| 145 base::Closure command_processed_callback_; | 134 base::Closure command_processed_callback_; |
| 146 | 135 |
| 147 // If non-NULL and |preemption_flag_->IsSet()|, exit PutChanged early. | 136 // If non-NULL and |preemption_flag_->IsSet()|, exit PutChanged early. |
| 148 scoped_refptr<PreemptionFlag> preemption_flag_; | 137 scoped_refptr<PreemptionFlag> preemption_flag_; |
| 149 bool was_preempted_; | 138 bool was_preempted_; |
| 150 | 139 |
| 151 // A factory for outstanding rescheduling tasks that is invalidated whenever | |
| 152 // the scheduler is rescheduled. | |
| 153 base::WeakPtrFactory<GpuScheduler> reschedule_task_factory_; | |
| 154 | |
| 155 DISALLOW_COPY_AND_ASSIGN(GpuScheduler); | 140 DISALLOW_COPY_AND_ASSIGN(GpuScheduler); |
| 156 }; | 141 }; |
| 157 | 142 |
| 158 } // namespace gpu | 143 } // namespace gpu |
| 159 | 144 |
| 160 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ | 145 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ |
| OLD | NEW |