Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: cc/single_thread_proxy.cc

Issue 12212007: cc: Route offscreen context creation for compositor to the browser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add cc::GaneshResourceProvider Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 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 "cc/single_thread_proxy.h" 5 #include "cc/single_thread_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "cc/draw_quad.h" 9 #include "cc/draw_quad.h"
10 #include "cc/layer_tree_host.h" 10 #include "cc/layer_tree_host.h"
11 #include "cc/layer_tree_impl.h" 11 #include "cc/layer_tree_impl.h"
12 #include "cc/output_surface.h" 12 #include "cc/output_surface.h"
13 #include "cc/prioritized_resource_manager.h" 13 #include "cc/prioritized_resource_manager.h"
14 #include "cc/resource_update_controller.h" 14 #include "cc/resource_update_controller.h"
15 #include "cc/thread.h" 15 #include "cc/thread.h"
16 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h"
16 17
17 namespace cc { 18 namespace cc {
18 19
19 scoped_ptr<Proxy> SingleThreadProxy::create(LayerTreeHost* layerTreeHost) 20 scoped_ptr<Proxy> SingleThreadProxy::create(LayerTreeHost* layerTreeHost)
20 { 21 {
21 return make_scoped_ptr(new SingleThreadProxy(layerTreeHost)).PassAs<Proxy>() ; 22 return make_scoped_ptr(new SingleThreadProxy(layerTreeHost)).PassAs<Proxy>() ;
22 } 23 }
23 24
24 SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost) 25 SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost)
25 : Proxy(scoped_ptr<Thread>(NULL)) 26 : Proxy(scoped_ptr<Thread>(NULL))
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 133
133 bool SingleThreadProxy::recreateOutputSurface() 134 bool SingleThreadProxy::recreateOutputSurface()
134 { 135 {
135 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext"); 136 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext");
136 DCHECK(Proxy::isMainThread()); 137 DCHECK(Proxy::isMainThread());
137 DCHECK(m_outputSurfaceLost); 138 DCHECK(m_outputSurfaceLost);
138 139
139 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurfa ce(); 140 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurfa ce();
140 if (!outputSurface.get()) 141 if (!outputSurface.get())
141 return false; 142 return false;
143 WebKit::WebGraphicsContext3D* offscreenContext3d = NULL;
144 GrContext* offscreenGrContext = NULL;
145 if (m_RendererCapabilitiesForMainThread.usingOffscreenContext3d && m_layerTr eeHost->needsOffscreenContext()) {
146 offscreenContext3d = m_layerTreeHost->client()->offscreenContext3dForMai nThread();
147 if (!offscreenContext3d || !offscreenContext3d->makeContextCurrent())
148 return false;
149 offscreenGrContext = m_layerTreeHost->client()->offscreenGrContextForMai nThread();
150 }
142 151
143 bool initialized; 152 bool initialized;
144 { 153 {
145 DebugScopedSetMainThreadBlocked mainThreadBlocked(this); 154 DebugScopedSetMainThreadBlocked mainThreadBlocked(this);
146 DebugScopedSetImplThread impl(this); 155 DebugScopedSetImplThread impl(this);
147 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl- >resourceProvider()); 156 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl- >resourceProvider());
148 initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass ()); 157 initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass ());
149 if (initialized) { 158 if (initialized) {
150 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC apabilities(); 159 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC apabilities();
160 m_layerTreeHostImpl->resourceProvider()->setGaneshContexts(offscreen Context3d, offscreenGrContext);
151 } 161 }
152 } 162 }
153 163
154 if (initialized) 164 if (initialized)
155 m_outputSurfaceLost = false; 165 m_outputSurfaceLost = false;
156 166
157 return initialized; 167 return initialized;
158 } 168 }
159 169
160 void SingleThreadProxy::renderingStats(RenderingStats* stats) 170 void SingleThreadProxy::renderingStats(RenderingStats* stats)
(...skipping 23 matching lines...) Expand all
184 { 194 {
185 DebugScopedSetMainThreadBlocked mainThreadBlocked(this); 195 DebugScopedSetMainThreadBlocked mainThreadBlocked(this);
186 DebugScopedSetImplThread impl(this); 196 DebugScopedSetImplThread impl(this);
187 197
188 base::TimeTicks startTime = base::TimeTicks::HighResNow(); 198 base::TimeTicks startTime = base::TimeTicks::HighResNow();
189 m_layerTreeHostImpl->beginCommit(); 199 m_layerTreeHostImpl->beginCommit();
190 200
191 m_layerTreeHost->contentsTextureManager()->pushTexturePrioritiesToBackin gs(); 201 m_layerTreeHost->contentsTextureManager()->pushTexturePrioritiesToBackin gs();
192 m_layerTreeHost->beginCommitOnImplThread(m_layerTreeHostImpl.get()); 202 m_layerTreeHost->beginCommitOnImplThread(m_layerTreeHostImpl.get());
193 203
194 scoped_ptr<ResourceUpdateController> updateController = 204 scoped_ptr<ResourceUpdateController> updateController = ResourceUpdateCo ntroller::create(NULL, Proxy::mainThread(), queue.Pass(), m_layerTreeHostImpl->r esourceProvider(), hasImplThread());
195 ResourceUpdateController::create(
196 NULL,
197 Proxy::mainThread(),
198 queue.Pass(),
199 m_layerTreeHostImpl->resourceProvider(),
200 hasImplThread());
201 updateController->finalize(); 205 updateController->finalize();
202 206
203 m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get()); 207 m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get());
204 208
205 m_layerTreeHostImpl->commitComplete(); 209 m_layerTreeHostImpl->commitComplete();
206 210
207 #ifndef NDEBUG 211 #ifndef NDEBUG
208 // In the single-threaded case, the scroll deltas should never be 212 // In the single-threaded case, the scroll deltas should never be
209 // touched on the impl layer tree. 213 // touched on the impl layer tree.
210 scoped_ptr<ScrollAndScaleSet> scrollInfo = m_layerTreeHostImpl->processS crollDeltas(); 214 scoped_ptr<ScrollAndScaleSet> scrollInfo = m_layerTreeHostImpl->processS crollDeltas();
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 NOTREACHED(); 359 NOTREACHED();
356 } 360 }
357 361
358 bool SingleThreadProxy::commitAndComposite() 362 bool SingleThreadProxy::commitAndComposite()
359 { 363 {
360 DCHECK(Proxy::isMainThread()); 364 DCHECK(Proxy::isMainThread());
361 365
362 if (!m_layerTreeHost->initializeRendererIfNeeded()) 366 if (!m_layerTreeHost->initializeRendererIfNeeded())
363 return false; 367 return false;
364 368
369 WebKit::WebGraphicsContext3D* offscreenContext3d = NULL;
370 GrContext* offscreenGrContext = NULL;
371 if (m_RendererCapabilitiesForMainThread.usingOffscreenContext3d && m_layerTr eeHost->needsOffscreenContext()) {
372 offscreenContext3d = m_layerTreeHost->client()->offscreenContext3dForMai nThread();
373 offscreenGrContext = m_layerTreeHost->client()->offscreenGrContextForMai nThread();
374 }
375
365 m_layerTreeHost->contentsTextureManager()->unlinkAndClearEvictedBackings(); 376 m_layerTreeHost->contentsTextureManager()->unlinkAndClearEvictedBackings();
366 377
367 scoped_ptr<ResourceUpdateQueue> queue = make_scoped_ptr(new ResourceUpdateQu eue); 378 scoped_ptr<ResourceUpdateQueue> queue = make_scoped_ptr(new ResourceUpdateQu eue);
368 m_layerTreeHost->updateLayers(*(queue.get()), m_layerTreeHostImpl->memoryAll ocationLimitBytes()); 379 m_layerTreeHost->updateLayers(*(queue.get()), m_layerTreeHostImpl->memoryAll ocationLimitBytes());
369 380
370 m_layerTreeHost->willCommit(); 381 m_layerTreeHost->willCommit();
371 doCommit(queue.Pass()); 382 doCommit(queue.Pass());
372 bool result = doComposite(); 383 bool result = doComposite(offscreenContext3d, offscreenGrContext);
373 m_layerTreeHost->didBeginFrame(); 384 m_layerTreeHost->didBeginFrame();
374 return result; 385 return result;
375 } 386 }
376 387
377 bool SingleThreadProxy::doComposite() 388 bool SingleThreadProxy::doComposite(WebKit::WebGraphicsContext3D* offscreenC ontext3d, GrContext* offscreenGrContext)
378 { 389 {
379 DCHECK(!m_outputSurfaceLost); 390 DCHECK(!m_outputSurfaceLost);
380 { 391 {
381 DebugScopedSetImplThread impl(this); 392 DebugScopedSetImplThread impl(this);
382 base::AutoReset<bool> markInside(&m_insideDraw, true); 393 base::AutoReset<bool> markInside(&m_insideDraw, true);
383 394
395 m_layerTreeHostImpl->resourceProvider()->setGaneshContexts(offscreenCont ext3d, offscreenGrContext);
396
384 if (!m_layerTreeHostImpl->visible()) 397 if (!m_layerTreeHostImpl->visible())
385 return false; 398 return false;
386 399
387 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now()); 400 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now());
388 401
389 // We guard prepareToDraw() with canDraw() because it always returns a v alid frame, so can only 402 // We guard prepareToDraw() with canDraw() because it always returns a v alid frame, so can only
390 // be used when such a frame is possible. Since drawLayers() depends on the result of 403 // be used when such a frame is possible. Since drawLayers() depends on the result of
391 // prepareToDraw(), it is guarded on canDraw() as well. 404 // prepareToDraw(), it is guarded on canDraw() as well.
392 if (!m_layerTreeHostImpl->canDraw()) 405 if (!m_layerTreeHostImpl->canDraw())
393 return false; 406 return false;
(...skipping 29 matching lines...) Expand all
423 } 436 }
424 437
425 skia::RefPtr<SkPicture> SingleThreadProxy::capturePicture() 438 skia::RefPtr<SkPicture> SingleThreadProxy::capturePicture()
426 { 439 {
427 // Requires impl-side painting, which is only supported in threaded composit ing. 440 // Requires impl-side painting, which is only supported in threaded composit ing.
428 NOTREACHED(); 441 NOTREACHED();
429 return skia::RefPtr<SkPicture>(); 442 return skia::RefPtr<SkPicture>();
430 } 443 }
431 444
432 } // namespace cc 445 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698