OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "android_webview/browser/shared_renderer_state.h" | 5 #include "android_webview/browser/shared_renderer_state.h" |
6 | 6 |
7 #include "android_webview/browser/browser_view_renderer.h" | 7 #include "android_webview/browser/browser_view_renderer.h" |
8 #include "android_webview/browser/child_frame.h" | 8 #include "android_webview/browser/child_frame.h" |
9 #include "android_webview/browser/deferred_gpu_command_service.h" | 9 #include "android_webview/browser/deferred_gpu_command_service.h" |
10 #include "android_webview/browser/hardware_renderer.h" | 10 #include "android_webview/browser/hardware_renderer.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 base::AutoLock lock(lock_); | 252 base::AutoLock lock(lock_); |
253 if (renderer_manager_key_ != manager->NullKey()) { | 253 if (renderer_manager_key_ != manager->NullKey()) { |
254 manager->DidDrawGL(renderer_manager_key_); | 254 manager->DidDrawGL(renderer_manager_key_); |
255 } | 255 } |
256 } | 256 } |
257 | 257 |
258 ScopedAppGLStateRestore state_restore( | 258 ScopedAppGLStateRestore state_restore( |
259 draw_info->mode == AwDrawGLInfo::kModeDraw | 259 draw_info->mode == AwDrawGLInfo::kModeDraw |
260 ? ScopedAppGLStateRestore::MODE_DRAW | 260 ? ScopedAppGLStateRestore::MODE_DRAW |
261 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); | 261 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
| 262 // Set the correct FBO before kModeDraw. The GL commands run in kModeDraw |
| 263 // require a correctly bound FBO. The FBO remains until the next kModeDraw. |
| 264 // So kModeProcess between kModeDraws has correctly bound FBO, too. |
| 265 if (draw_info->mode == AwDrawGLInfo::kModeDraw) { |
| 266 if (!hardware_renderer_) { |
| 267 hardware_renderer_.reset(new HardwareRenderer(this)); |
| 268 hardware_renderer_->CommitFrame(); |
| 269 } |
| 270 hardware_renderer_->SetBackingFrameBufferObject( |
| 271 state_restore.framebuffer_binding_ext()); |
| 272 } |
| 273 |
262 ScopedAllowGL allow_gl; | 274 ScopedAllowGL allow_gl; |
263 | 275 |
264 if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) { | 276 if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) { |
265 LOG(ERROR) << "Received unexpected kModeProcessNoContext"; | 277 LOG(ERROR) << "Received unexpected kModeProcessNoContext"; |
266 } | 278 } |
267 | 279 |
268 if (IsInsideHardwareRelease()) { | 280 if (IsInsideHardwareRelease()) { |
269 hardware_renderer_.reset(); | 281 hardware_renderer_.reset(); |
270 // Flush the idle queue in tear down. | 282 // Flush the idle queue in tear down. |
271 DeferredGpuCommandService::GetInstance()->PerformAllIdleWork(); | 283 DeferredGpuCommandService::GetInstance()->PerformAllIdleWork(); |
272 return; | 284 return; |
273 } | 285 } |
274 | 286 |
275 if (draw_info->mode != AwDrawGLInfo::kModeDraw) { | 287 if (draw_info->mode != AwDrawGLInfo::kModeDraw) { |
276 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { | 288 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { |
277 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); | 289 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); |
278 } | 290 } |
279 return; | 291 return; |
280 } | 292 } |
281 | 293 |
282 if (!hardware_renderer_) { | 294 hardware_renderer_->DrawGL(state_restore.stencil_enabled(), draw_info); |
283 hardware_renderer_.reset(new HardwareRenderer(this)); | |
284 hardware_renderer_->CommitFrame(); | |
285 } | |
286 | |
287 hardware_renderer_->DrawGL(state_restore.stencil_enabled(), | |
288 state_restore.framebuffer_binding_ext(), | |
289 draw_info); | |
290 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); | 295 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); |
291 } | 296 } |
292 | 297 |
293 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { | 298 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { |
294 ReleaseCompositorResourcesIfNeededOnUI(true); | 299 ReleaseCompositorResourcesIfNeededOnUI(true); |
295 } | 300 } |
296 | 301 |
297 void SharedRendererState::DeleteHardwareRendererOnUI() { | 302 void SharedRendererState::DeleteHardwareRendererOnUI() { |
298 ReleaseCompositorResourcesIfNeededOnUI(false); | 303 ReleaseCompositorResourcesIfNeededOnUI(false); |
299 } | 304 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 : shared_renderer_state_(shared_renderer_state) { | 357 : shared_renderer_state_(shared_renderer_state) { |
353 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); | 358 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); |
354 shared_renderer_state_->SetInsideHardwareRelease(true); | 359 shared_renderer_state_->SetInsideHardwareRelease(true); |
355 } | 360 } |
356 | 361 |
357 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 362 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
358 shared_renderer_state_->SetInsideHardwareRelease(false); | 363 shared_renderer_state_->SetInsideHardwareRelease(false); |
359 } | 364 } |
360 | 365 |
361 } // namespace android_webview | 366 } // namespace android_webview |
OLD | NEW |