OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/output/direct_renderer.h" | 5 #include "cc/output/direct_renderer.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) { | 181 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) { |
182 if (!render_pass_textures_.contains(render_passes_in_draw_order[i]->id)) { | 182 if (!render_pass_textures_.contains(render_passes_in_draw_order[i]->id)) { |
183 scoped_ptr<ScopedResource> texture = | 183 scoped_ptr<ScopedResource> texture = |
184 ScopedResource::Create(resource_provider_); | 184 ScopedResource::Create(resource_provider_); |
185 render_pass_textures_.set(render_passes_in_draw_order[i]->id, | 185 render_pass_textures_.set(render_passes_in_draw_order[i]->id, |
186 std::move(texture)); | 186 std::move(texture)); |
187 } | 187 } |
188 } | 188 } |
189 } | 189 } |
190 | 190 |
191 void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, | 191 DrawFrameResult DirectRenderer::DrawFrame( |
192 float device_scale_factor, | 192 RenderPassList* render_passes_in_draw_order, |
193 const gfx::Rect& device_viewport_rect, | 193 float device_scale_factor, |
194 const gfx::Rect& device_clip_rect, | 194 const gfx::Rect& device_viewport_rect, |
195 bool disable_picture_quad_image_filtering) { | 195 const gfx::Rect& device_clip_rect, |
| 196 bool disable_picture_quad_image_filtering) { |
196 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); | 197 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); |
197 UMA_HISTOGRAM_COUNTS( | 198 UMA_HISTOGRAM_COUNTS( |
198 "Renderer4.renderPassCount", | 199 "Renderer4.renderPassCount", |
199 base::saturated_cast<int>(render_passes_in_draw_order->size())); | 200 base::saturated_cast<int>(render_passes_in_draw_order->size())); |
200 | 201 |
201 const RenderPass* root_render_pass = | 202 const RenderPass* root_render_pass = |
202 render_passes_in_draw_order->back().get(); | 203 render_passes_in_draw_order->back().get(); |
203 DCHECK(root_render_pass); | 204 DCHECK(root_render_pass); |
204 | 205 |
205 DrawingFrame frame; | 206 DrawingFrame frame; |
206 frame.render_passes_in_draw_order = render_passes_in_draw_order; | 207 frame.render_passes_in_draw_order = render_passes_in_draw_order; |
207 frame.root_render_pass = root_render_pass; | 208 frame.root_render_pass = root_render_pass; |
208 frame.root_damage_rect = Capabilities().using_partial_swap | 209 frame.root_damage_rect = root_render_pass->damage_rect; |
209 ? root_render_pass->damage_rect | |
210 : root_render_pass->output_rect; | |
211 frame.root_damage_rect.Union(overlay_processor_->GetAndResetOverlayDamage()); | 210 frame.root_damage_rect.Union(overlay_processor_->GetAndResetOverlayDamage()); |
212 frame.root_damage_rect.Intersect(gfx::Rect(device_viewport_rect.size())); | 211 frame.root_damage_rect.Intersect(gfx::Rect(device_viewport_rect.size())); |
213 frame.device_viewport_rect = device_viewport_rect; | 212 frame.device_viewport_rect = device_viewport_rect; |
214 frame.device_clip_rect = device_clip_rect; | 213 frame.device_clip_rect = device_clip_rect; |
215 frame.disable_picture_quad_image_filtering = | 214 frame.disable_picture_quad_image_filtering = |
216 disable_picture_quad_image_filtering; | 215 disable_picture_quad_image_filtering; |
217 | 216 |
218 EnsureBackbuffer(); | 217 EnsureBackbuffer(); |
219 | 218 |
220 // Only reshape when we know we are going to draw. Otherwise, the reshape | 219 // Only reshape when we know we are going to draw. Otherwise, the reshape |
(...skipping 20 matching lines...) Expand all Loading... |
241 // If we have any copy requests, we can't remove any quads for overlays or | 240 // If we have any copy requests, we can't remove any quads for overlays or |
242 // CALayers because the framebuffer would be missing the removed quads' | 241 // CALayers because the framebuffer would be missing the removed quads' |
243 // contents. | 242 // contents. |
244 bool has_copy_requests = false; | 243 bool has_copy_requests = false; |
245 for (const auto& pass : *render_passes_in_draw_order) { | 244 for (const auto& pass : *render_passes_in_draw_order) { |
246 if (!pass->copy_requests.empty()) { | 245 if (!pass->copy_requests.empty()) { |
247 has_copy_requests = true; | 246 has_copy_requests = true; |
248 break; | 247 break; |
249 } | 248 } |
250 } | 249 } |
| 250 gfx::Rect damage_rect_minus_overlays = frame.root_damage_rect; |
251 if (!has_copy_requests) { | 251 if (!has_copy_requests) { |
252 overlay_processor_->ProcessForOverlays( | 252 overlay_processor_->ProcessForOverlays( |
253 resource_provider_, render_passes_in_draw_order, &frame.overlay_list, | 253 resource_provider_, render_passes_in_draw_order, &frame.overlay_list, |
254 &frame.ca_layer_overlay_list, &frame.root_damage_rect); | 254 &frame.ca_layer_overlay_list, &damage_rect_minus_overlays); |
| 255 frame.root_damage_rect = Capabilities().using_partial_swap |
| 256 ? damage_rect_minus_overlays |
| 257 : root_render_pass->output_rect; |
255 } | 258 } |
256 | 259 |
257 // If all damage is being drawn with overlays or CALayers then skip drawing | 260 // If all damage is being drawn with overlays or CALayers then skip drawing |
258 // the render passes. | 261 // the render passes. |
259 if (frame.root_damage_rect.IsEmpty() && !has_copy_requests) { | 262 DrawFrameResult draw_result = DrawFrameResult::DID_DRAW; |
| 263 if (damage_rect_minus_overlays.IsEmpty() && !has_copy_requests) { |
260 BindFramebufferToOutputSurface(&frame); | 264 BindFramebufferToOutputSurface(&frame); |
| 265 draw_result = DrawFrameResult::DAMAGE_DRAWN_BY_OVERLAYS; |
261 } else { | 266 } else { |
262 for (const auto& pass : *render_passes_in_draw_order) { | 267 for (const auto& pass : *render_passes_in_draw_order) { |
263 DrawRenderPass(&frame, pass.get()); | 268 DrawRenderPass(&frame, pass.get()); |
264 | 269 |
265 bool first_request = true; | 270 bool first_request = true; |
266 for (auto& copy_request : pass->copy_requests) { | 271 for (auto& copy_request : pass->copy_requests) { |
267 // Doing a readback is destructive of our state on Mac, so make sure | 272 // Doing a readback is destructive of our state on Mac, so make sure |
268 // we restore the state between readbacks. http://crbug.com/99393. | 273 // we restore the state between readbacks. http://crbug.com/99393. |
269 if (!first_request) | 274 if (!first_request) |
270 UseRenderPass(&frame, pass.get()); | 275 UseRenderPass(&frame, pass.get()); |
271 CopyCurrentRenderPassToBitmap(&frame, std::move(copy_request)); | 276 CopyCurrentRenderPassToBitmap(&frame, std::move(copy_request)); |
272 first_request = false; | 277 first_request = false; |
273 } | 278 } |
274 } | 279 } |
275 } | 280 } |
276 FinishDrawingFrame(&frame); | 281 FinishDrawingFrame(&frame); |
277 render_passes_in_draw_order->clear(); | 282 render_passes_in_draw_order->clear(); |
| 283 return draw_result; |
278 } | 284 } |
279 | 285 |
280 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( | 286 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( |
281 const DrawingFrame* frame) { | 287 const DrawingFrame* frame) { |
282 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect; | 288 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect; |
283 | 289 |
284 if (frame->root_damage_rect == frame->root_render_pass->output_rect || | 290 if (frame->root_damage_rect == frame->root_render_pass->output_rect || |
285 !frame->current_render_pass->copy_requests.empty()) | 291 !frame->current_render_pass->copy_requests.empty()) |
286 return render_pass_scissor; | 292 return render_pass_scissor; |
287 | 293 |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 ScopedResource* texture = render_pass_textures_.get(id); | 556 ScopedResource* texture = render_pass_textures_.get(id); |
551 return texture && texture->id(); | 557 return texture && texture->id(); |
552 } | 558 } |
553 | 559 |
554 // static | 560 // static |
555 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { | 561 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { |
556 return render_pass->output_rect.size(); | 562 return render_pass->output_rect.size(); |
557 } | 563 } |
558 | 564 |
559 } // namespace cc | 565 } // namespace cc |
OLD | NEW |