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

Side by Side Diff: cc/layers/delegated_frame_provider.cc

Issue 26023004: aura: Allow delegated frames to be used by more than one impl layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: frameprovider: nits Created 7 years, 2 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
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/layers/delegated_frame_provider.h"
6
7 #include "cc/layers/delegated_frame_resource_collection.h"
8 #include "cc/layers/delegated_renderer_layer.h"
9 #include "cc/output/delegated_frame_data.h"
10 #include "cc/quads/render_pass_draw_quad.h"
11
12 namespace cc {
13
14 DelegatedFrameProvider::DelegatedFrameProvider(
15 DelegatedFrameResourceCollection* resource_collection,
16 scoped_ptr<DelegatedFrameData> frame)
17 : resource_collection_(resource_collection),
18 frame_observer_(NULL),
19 own_frame_resources_(false) {
20 RenderPass* root_pass = frame->render_pass_list.back();
21 frame_size_ = root_pass->output_rect.size();
22 DCHECK(!frame_size_.IsEmpty());
23 SetFrameData(frame.Pass());
24 }
25
26 DelegatedFrameProvider::~DelegatedFrameProvider() {}
27
28 void DelegatedFrameProvider::SetObserver(DelegatedRendererLayer* observer) {
29 if (frame_observer_ == observer)
30 return;
31
32 frame_observer_ = observer;
33 // A new observer will have to use full frame damage the first time anyway, so
34 // clear the damage rect.
35 damage_ = gfx::RectF();
36
37 if (frame_observer_) {
38 DCHECK(frame_)
39 << "Must have a frame when given to a DelegatedRendererLayer.";
40 frame_observer_->ProviderHasNewFrame();
41 }
42 }
43
44 bool DelegatedFrameProvider::IsObserver(
45 DelegatedRendererLayer* observer) const {
46 return frame_observer_ == observer;
47 }
48
49 void DelegatedFrameProvider::SetFrameData(
50 scoped_ptr<DelegatedFrameData> frame) {
51 DCHECK(frame);
52 DCHECK_NE(0u, frame->render_pass_list.size());
53
54 if (own_frame_resources_) {
55 ReturnedResourceArray unused;
56 TransferableResource::ReturnResources(frame_->resource_list, &unused);
57 resource_collection_->ReturnResources(unused);
58 }
59
60 frame_ = frame.Pass();
61
62 RenderPass* root_pass = frame_->render_pass_list.back();
63 DCHECK_EQ(frame_size_.ToString(), root_pass->output_rect.size().ToString())
64 << "All frames in a single DelegatedFrameProvider must have the same "
65 << "size. Use a new frame provider for frames of a different size.";
66
67 damage_ = gfx::UnionRects(damage_, root_pass->damage_rect);
68 own_frame_resources_ = true;
69
70 if (frame_observer_)
71 frame_observer_->ProviderHasNewFrame();
72 }
73
74 DelegatedFrameData* DelegatedFrameProvider::GetFrameDataAndRefResources(
75 DelegatedRendererLayer* observer,
76 gfx::RectF* damage) {
77 DCHECK(frame_observer_ == observer);
78
79 *damage = damage_;
80 // Drop the damage since this frame will be drawn. The observer is now
81 // responsible for the damage.
82 damage_ = gfx::RectF();
83
84 if (own_frame_resources_) {
85 resource_collection_->ReceivedResources(frame_->resource_list);
86 own_frame_resources_ = false;
87 }
88
89 resource_collection_->RefResources(frame_->resource_list);
90 return frame_.get();
91 }
92
93 ReturnCallback
94 DelegatedFrameProvider::GetReturnResourcesCallbackForImplThread() {
95 return resource_collection_->GetReturnResourcesCallbackForImplThread();
96 }
97
98 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698