OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/gpu_scheduler.h" | 5 #include "gpu/command_buffer/service/gpu_scheduler.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 const scoped_refptr<gfx::GLContext>& context, | 61 const scoped_refptr<gfx::GLContext>& context, |
62 const gfx::Size& size, | 62 const gfx::Size& size, |
63 const gles2::DisallowedExtensions& disallowed_extensions, | 63 const gles2::DisallowedExtensions& disallowed_extensions, |
64 const char* allowed_extensions, | 64 const char* allowed_extensions, |
65 const std::vector<int32>& attribs) { | 65 const std::vector<int32>& attribs) { |
66 DCHECK(context); | 66 DCHECK(context); |
67 | 67 |
68 if (!context->MakeCurrent(surface)) | 68 if (!context->MakeCurrent(surface)) |
69 return false; | 69 return false; |
70 | 70 |
71 #if !defined(OS_MACOSX) | 71 #if !defined(OS_MACOSX) && !defined(TOUCH_UI) |
72 // Set up swap interval for onscreen contexts. | 72 // Set up swap interval for onscreen contexts. |
73 if (!surface->IsOffscreen()) { | 73 if (!surface->IsOffscreen()) { |
74 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) | 74 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) |
75 context->SetSwapInterval(0); | 75 context->SetSwapInterval(0); |
76 else | 76 else |
77 context->SetSwapInterval(1); | 77 context->SetSwapInterval(1); |
78 } | 78 } |
79 #endif | 79 #endif |
80 | 80 |
81 // Map the ring buffer and create the parser. | 81 // Map the ring buffer and create the parser. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 122 |
123 bool GpuScheduler::SetParent(GpuScheduler* parent_scheduler, | 123 bool GpuScheduler::SetParent(GpuScheduler* parent_scheduler, |
124 uint32 parent_texture_id) { | 124 uint32 parent_texture_id) { |
125 if (parent_scheduler) | 125 if (parent_scheduler) |
126 return decoder_->SetParent(parent_scheduler->decoder_.get(), | 126 return decoder_->SetParent(parent_scheduler->decoder_.get(), |
127 parent_texture_id); | 127 parent_texture_id); |
128 else | 128 else |
129 return decoder_->SetParent(NULL, 0); | 129 return decoder_->SetParent(NULL, 0); |
130 } | 130 } |
131 | 131 |
132 #if defined(OS_MACOSX) || defined(TOUCH_UI) | 132 #if defined(OS_MACOSX) |
133 namespace { | 133 namespace { |
134 const unsigned int kMaxOutstandingSwapBuffersCallsPerOnscreenContext = 1; | 134 const unsigned int kMaxOutstandingSwapBuffersCallsPerOnscreenContext = 1; |
135 } | 135 } |
136 #endif | 136 #endif |
137 | 137 |
138 void GpuScheduler::PutChanged() { | 138 void GpuScheduler::PutChanged() { |
139 TRACE_EVENT1("gpu", "GpuScheduler:PutChanged", "this", this); | 139 TRACE_EVENT1("gpu", "GpuScheduler:PutChanged", "this", this); |
140 | 140 |
141 DCHECK(IsScheduled()); | 141 DCHECK(IsScheduled()); |
142 | 142 |
143 CommandBuffer::State state = command_buffer_->GetState(); | 143 CommandBuffer::State state = command_buffer_->GetState(); |
144 parser_->set_put(state.put_offset); | 144 parser_->set_put(state.put_offset); |
145 if (state.error != error::kNoError) | 145 if (state.error != error::kNoError) |
146 return; | 146 return; |
147 | 147 |
148 if (decoder_.get()) { | 148 if (decoder_.get()) { |
149 if (!decoder_->MakeCurrent()) { | 149 if (!decoder_->MakeCurrent()) { |
150 LOG(ERROR) << "Context lost because MakeCurrent failed."; | 150 LOG(ERROR) << "Context lost because MakeCurrent failed."; |
151 command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); | 151 command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); |
152 command_buffer_->SetParseError(error::kLostContext); | 152 command_buffer_->SetParseError(error::kLostContext); |
153 return; | 153 return; |
154 } | 154 } |
155 } | 155 } |
156 | 156 |
157 #if defined(OS_MACOSX) | 157 #if defined(OS_MACOSX) |
158 bool do_rate_limiting = surface_.get() != NULL; | 158 bool do_rate_limiting = surface_.get() != NULL; |
159 #elif defined(TOUCH_UI) | |
160 bool do_rate_limiting = back_surface_.get() != NULL; | |
161 #endif | |
162 | 159 |
163 #if defined(OS_MACOSX) || defined(TOUCH_UI) | |
164 // Don't swamp the browser process with SwapBuffers calls it can't handle. | 160 // Don't swamp the browser process with SwapBuffers calls it can't handle. |
165 DCHECK(!do_rate_limiting || | 161 DCHECK(!do_rate_limiting || |
166 swap_buffers_count_ - acknowledged_swap_buffers_count_ == 0); | 162 swap_buffers_count_ - acknowledged_swap_buffers_count_ == 0); |
167 #endif | 163 #endif |
168 | 164 |
169 error::Error error = error::kNoError; | 165 error::Error error = error::kNoError; |
170 while (!parser_->IsEmpty()) { | 166 while (!parser_->IsEmpty()) { |
171 error = parser_->ProcessCommand(); | 167 error = parser_->ProcessCommand(); |
172 | 168 |
173 // TODO(piman): various classes duplicate various pieces of state, leading | 169 // TODO(piman): various classes duplicate various pieces of state, leading |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 | 228 |
233 int32 GpuScheduler::GetGetOffset() { | 229 int32 GpuScheduler::GetGetOffset() { |
234 return parser_->get(); | 230 return parser_->get(); |
235 } | 231 } |
236 | 232 |
237 void GpuScheduler::ResizeOffscreenFrameBuffer(const gfx::Size& size) { | 233 void GpuScheduler::ResizeOffscreenFrameBuffer(const gfx::Size& size) { |
238 decoder_->ResizeOffscreenFrameBuffer(size); | 234 decoder_->ResizeOffscreenFrameBuffer(size); |
239 } | 235 } |
240 | 236 |
241 void GpuScheduler::SetResizeCallback(Callback1<gfx::Size>::Type* callback) { | 237 void GpuScheduler::SetResizeCallback(Callback1<gfx::Size>::Type* callback) { |
242 wrapped_resize_callback_.reset(callback); | 238 decoder_->SetResizeCallback(callback); |
243 decoder_->SetResizeCallback( | |
244 NewCallback(this, | |
245 &GpuScheduler::WillResize)); | |
246 } | 239 } |
247 | 240 |
248 void GpuScheduler::SetSwapBuffersCallback( | 241 void GpuScheduler::SetSwapBuffersCallback( |
249 Callback0::Type* callback) { | 242 Callback0::Type* callback) { |
250 wrapped_swap_buffers_callback_.reset(callback); | 243 wrapped_swap_buffers_callback_.reset(callback); |
251 decoder_->SetSwapBuffersCallback( | 244 decoder_->SetSwapBuffersCallback( |
252 NewCallback(this, | 245 NewCallback(this, |
253 &GpuScheduler::WillSwapBuffers)); | 246 &GpuScheduler::WillSwapBuffers)); |
254 } | 247 } |
255 | 248 |
256 void GpuScheduler::SetCommandProcessedCallback( | 249 void GpuScheduler::SetCommandProcessedCallback( |
257 Callback0::Type* callback) { | 250 Callback0::Type* callback) { |
258 command_processed_callback_.reset(callback); | 251 command_processed_callback_.reset(callback); |
259 } | 252 } |
260 | 253 |
261 void GpuScheduler::SetTokenCallback( | 254 void GpuScheduler::SetTokenCallback( |
262 const base::Callback<void(int32)>& callback) { | 255 const base::Callback<void(int32)>& callback) { |
263 DCHECK(set_token_callback_.is_null()); | 256 DCHECK(set_token_callback_.is_null()); |
264 set_token_callback_ = callback; | 257 set_token_callback_ = callback; |
265 } | 258 } |
266 | 259 |
267 GpuScheduler::GpuScheduler(CommandBuffer* command_buffer, | 260 GpuScheduler::GpuScheduler(CommandBuffer* command_buffer, |
268 gles2::GLES2Decoder* decoder, | 261 gles2::GLES2Decoder* decoder, |
269 CommandParser* parser) | 262 CommandParser* parser) |
270 : command_buffer_(command_buffer), | 263 : command_buffer_(command_buffer), |
271 decoder_(decoder), | 264 decoder_(decoder), |
272 parser_(parser), | 265 parser_(parser), |
273 unscheduled_count_(0), | 266 unscheduled_count_(0), |
274 #if defined(OS_MACOSX) || defined(TOUCH_UI) | 267 #if defined(OS_MACOSX) |
275 swap_buffers_count_(0), | 268 swap_buffers_count_(0), |
276 acknowledged_swap_buffers_count_(0), | 269 acknowledged_swap_buffers_count_(0), |
277 #endif | 270 #endif |
278 method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 271 method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
279 } | 272 } |
280 | 273 |
281 void GpuScheduler::WillResize(gfx::Size size) { | |
282 if (wrapped_resize_callback_.get()) { | |
283 wrapped_resize_callback_->Run(size); | |
284 } | |
285 } | |
286 | |
287 } // namespace gpu | 274 } // namespace gpu |
OLD | NEW |