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

Side by Side Diff: content/renderer/android/synchronous_compositor_output_surface.cc

Issue 1546383002: sync compositor: Send ipc reply in swap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase + no swap fix Created 4 years, 11 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 "content/renderer/android/synchronous_compositor_output_surface.h" 5 #include "content/renderer/android/synchronous_compositor_output_surface.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
(...skipping 27 matching lines...) Expand all
38 : surface_(surface) { 38 : surface_(surface) {
39 } 39 }
40 void Resize(const gfx::Size& pixel_size, float scale_factor) override { 40 void Resize(const gfx::Size& pixel_size, float scale_factor) override {
41 // Intentional no-op: canvas size is controlled by the embedder. 41 // Intentional no-op: canvas size is controlled by the embedder.
42 } 42 }
43 SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override { 43 SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override {
44 if (!surface_->current_sw_canvas_) { 44 if (!surface_->current_sw_canvas_) {
45 NOTREACHED() << "BeginPaint with no canvas set"; 45 NOTREACHED() << "BeginPaint with no canvas set";
46 return &null_canvas_; 46 return &null_canvas_;
47 } 47 }
48 LOG_IF(WARNING, surface_->frame_holder_.get()) 48 LOG_IF(WARNING, surface_->did_swap_)
49 << "Mutliple calls to BeginPaint per frame"; 49 << "Mutliple calls to BeginPaint per frame";
50 return surface_->current_sw_canvas_; 50 return surface_->current_sw_canvas_;
51 } 51 }
52 void EndPaint() override {} 52 void EndPaint() override {}
53 53
54 private: 54 private:
55 SynchronousCompositorOutputSurface* surface_; 55 SynchronousCompositorOutputSurface* surface_;
56 SkCanvas null_canvas_; 56 SkCanvas null_canvas_;
57 57
58 DISALLOW_COPY_AND_ASSIGN(SoftwareDevice); 58 DISALLOW_COPY_AND_ASSIGN(SoftwareDevice);
59 }; 59 };
60 60
61 SynchronousCompositorOutputSurface::SynchronousCompositorOutputSurface( 61 SynchronousCompositorOutputSurface::SynchronousCompositorOutputSurface(
62 const scoped_refptr<cc::ContextProvider>& context_provider, 62 const scoped_refptr<cc::ContextProvider>& context_provider,
63 const scoped_refptr<cc::ContextProvider>& worker_context_provider, 63 const scoped_refptr<cc::ContextProvider>& worker_context_provider,
64 int routing_id, 64 int routing_id,
65 SynchronousCompositorRegistry* registry, 65 SynchronousCompositorRegistry* registry,
66 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue) 66 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue)
67 : cc::OutputSurface( 67 : cc::OutputSurface(
68 context_provider, 68 context_provider,
69 worker_context_provider, 69 worker_context_provider,
70 scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareDevice(this))), 70 scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareDevice(this))),
71 routing_id_(routing_id), 71 routing_id_(routing_id),
72 registry_(registry), 72 registry_(registry),
73 registered_(false), 73 registered_(false),
74 sync_client_(nullptr), 74 sync_client_(nullptr),
75 current_sw_canvas_(nullptr), 75 current_sw_canvas_(nullptr),
76 memory_policy_(0u), 76 memory_policy_(0u),
77 did_swap_(false),
77 frame_swap_message_queue_(frame_swap_message_queue) { 78 frame_swap_message_queue_(frame_swap_message_queue) {
78 thread_checker_.DetachFromThread(); 79 thread_checker_.DetachFromThread();
79 DCHECK(registry_); 80 DCHECK(registry_);
80 capabilities_.adjust_deadline_for_parent = false; 81 capabilities_.adjust_deadline_for_parent = false;
81 capabilities_.delegated_rendering = true; 82 capabilities_.delegated_rendering = true;
82 memory_policy_.priority_cutoff_when_visible = 83 memory_policy_.priority_cutoff_when_visible =
83 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE; 84 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE;
84 } 85 }
85 86
86 SynchronousCompositorOutputSurface::~SynchronousCompositorOutputSurface() {} 87 SynchronousCompositorOutputSurface::~SynchronousCompositorOutputSurface() {}
(...skipping 26 matching lines...) Expand all
113 114
114 void SynchronousCompositorOutputSurface::Reshape(const gfx::Size& size, 115 void SynchronousCompositorOutputSurface::Reshape(const gfx::Size& size,
115 float scale_factor, 116 float scale_factor,
116 bool has_alpha) { 117 bool has_alpha) {
117 // Intentional no-op: surface size is controlled by the embedder. 118 // Intentional no-op: surface size is controlled by the embedder.
118 } 119 }
119 120
120 void SynchronousCompositorOutputSurface::SwapBuffers( 121 void SynchronousCompositorOutputSurface::SwapBuffers(
121 cc::CompositorFrame* frame) { 122 cc::CompositorFrame* frame) {
122 DCHECK(CalledOnValidThread()); 123 DCHECK(CalledOnValidThread());
123 frame_holder_.reset(new cc::CompositorFrame); 124 DCHECK(sync_client_);
124 frame->AssignTo(frame_holder_.get()); 125 sync_client_->SwapBuffers(frame);
125 client_->DidSwapBuffers(); 126 client_->DidSwapBuffers();
127 did_swap_ = true;
126 } 128 }
127 129
128 void SynchronousCompositorOutputSurface::Invalidate() { 130 void SynchronousCompositorOutputSurface::Invalidate() {
129 DCHECK(CalledOnValidThread()); 131 DCHECK(CalledOnValidThread());
130 if (sync_client_) 132 if (sync_client_)
131 sync_client_->Invalidate(); 133 sync_client_->Invalidate();
132 } 134 }
133 135
134 scoped_ptr<cc::CompositorFrame> 136 void SynchronousCompositorOutputSurface::DemandDrawHw(
135 SynchronousCompositorOutputSurface::DemandDrawHw(
136 const gfx::Size& surface_size, 137 const gfx::Size& surface_size,
137 const gfx::Transform& transform, 138 const gfx::Transform& transform,
138 const gfx::Rect& viewport, 139 const gfx::Rect& viewport,
139 const gfx::Rect& clip, 140 const gfx::Rect& clip,
140 const gfx::Rect& viewport_rect_for_tile_priority, 141 const gfx::Rect& viewport_rect_for_tile_priority,
141 const gfx::Transform& transform_for_tile_priority) { 142 const gfx::Transform& transform_for_tile_priority) {
142 DCHECK(CalledOnValidThread()); 143 DCHECK(CalledOnValidThread());
143 DCHECK(HasClient()); 144 DCHECK(HasClient());
144 DCHECK(context_provider_.get()); 145 DCHECK(context_provider_.get());
145 146
146 surface_size_ = surface_size; 147 surface_size_ = surface_size;
147 client_->SetExternalTilePriorityConstraints(viewport_rect_for_tile_priority, 148 client_->SetExternalTilePriorityConstraints(viewport_rect_for_tile_priority,
148 transform_for_tile_priority); 149 transform_for_tile_priority);
149 const bool software_draw = false; 150 const bool software_draw = false;
150 InvokeComposite(transform, viewport, clip, software_draw); 151 InvokeComposite(transform, viewport, clip, software_draw);
151
152 return frame_holder_.Pass();
153 } 152 }
154 153
155 scoped_ptr<cc::CompositorFrame> 154 void SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
156 SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
157 DCHECK(CalledOnValidThread()); 155 DCHECK(CalledOnValidThread());
158 DCHECK(canvas); 156 DCHECK(canvas);
159 DCHECK(!current_sw_canvas_); 157 DCHECK(!current_sw_canvas_);
160 158
161 base::AutoReset<SkCanvas*> canvas_resetter(&current_sw_canvas_, canvas); 159 base::AutoReset<SkCanvas*> canvas_resetter(&current_sw_canvas_, canvas);
162 160
163 SkIRect canvas_clip; 161 SkIRect canvas_clip;
164 canvas->getClipDeviceBounds(&canvas_clip); 162 canvas->getClipDeviceBounds(&canvas_clip);
165 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip); 163 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip);
166 164
167 gfx::Transform transform(gfx::Transform::kSkipInitialization); 165 gfx::Transform transform(gfx::Transform::kSkipInitialization);
168 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. 166 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4.
169 167
170 surface_size_ = gfx::Size(canvas->getBaseLayerSize().width(), 168 surface_size_ = gfx::Size(canvas->getBaseLayerSize().width(),
171 canvas->getBaseLayerSize().height()); 169 canvas->getBaseLayerSize().height());
172 const bool software_draw = true; 170 const bool software_draw = true;
173 InvokeComposite(transform, clip, clip, software_draw); 171 InvokeComposite(transform, clip, clip, software_draw);
174
175 return frame_holder_.Pass();
176 } 172 }
177 173
178 void SynchronousCompositorOutputSurface::InvokeComposite( 174 void SynchronousCompositorOutputSurface::InvokeComposite(
179 const gfx::Transform& transform, 175 const gfx::Transform& transform,
180 const gfx::Rect& viewport, 176 const gfx::Rect& viewport,
181 const gfx::Rect& clip, 177 const gfx::Rect& clip,
182 bool software_draw) { 178 bool software_draw) {
183 DCHECK(!frame_holder_.get());
184
185 gfx::Transform adjusted_transform = transform; 179 gfx::Transform adjusted_transform = transform;
186 adjusted_transform.matrix().postTranslate(-viewport.x(), -viewport.y(), 0); 180 adjusted_transform.matrix().postTranslate(-viewport.x(), -viewport.y(), 0);
181 did_swap_ = false;
187 client_->OnDraw(adjusted_transform, viewport, clip, software_draw); 182 client_->OnDraw(adjusted_transform, viewport, clip, software_draw);
188 183
189 if (frame_holder_.get()) 184 if (did_swap_)
190 client_->DidSwapBuffersComplete(); 185 client_->DidSwapBuffersComplete();
191 } 186 }
192 187
193 void SynchronousCompositorOutputSurface::ReturnResources( 188 void SynchronousCompositorOutputSurface::ReturnResources(
194 const cc::CompositorFrameAck& frame_ack) { 189 const cc::CompositorFrameAck& frame_ack) {
195 ReclaimResources(&frame_ack); 190 ReclaimResources(&frame_ack);
196 } 191 }
197 192
198 void SynchronousCompositorOutputSurface::SetMemoryPolicy(size_t bytes_limit) { 193 void SynchronousCompositorOutputSurface::SetMemoryPolicy(size_t bytes_limit) {
199 DCHECK(CalledOnValidThread()); 194 DCHECK(CalledOnValidThread());
(...skipping 29 matching lines...) Expand all
229 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope = 224 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope =
230 frame_swap_message_queue_->AcquireSendMessageScope(); 225 frame_swap_message_queue_->AcquireSendMessageScope();
231 frame_swap_message_queue_->DrainMessages(messages); 226 frame_swap_message_queue_->DrainMessages(messages);
232 } 227 }
233 228
234 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const { 229 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const {
235 return thread_checker_.CalledOnValidThread(); 230 return thread_checker_.CalledOnValidThread();
236 } 231 }
237 232
238 } // namespace content 233 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698