| 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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 const gfx::Vector2d& amount) { | 144 const gfx::Vector2d& amount) { |
| 145 enlarge_pass_texture_amount_ = amount; | 145 enlarge_pass_texture_amount_ = amount; |
| 146 } | 146 } |
| 147 | 147 |
| 148 void DirectRenderer::DecideRenderPassAllocationsForFrame( | 148 void DirectRenderer::DecideRenderPassAllocationsForFrame( |
| 149 const RenderPassList& render_passes_in_draw_order) { | 149 const RenderPassList& render_passes_in_draw_order) { |
| 150 base::hash_map<RenderPassId, gfx::Size> render_passes_in_frame; | 150 base::hash_map<RenderPassId, gfx::Size> render_passes_in_frame; |
| 151 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) | 151 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) |
| 152 render_passes_in_frame.insert(std::pair<RenderPassId, gfx::Size>( | 152 render_passes_in_frame.insert(std::pair<RenderPassId, gfx::Size>( |
| 153 render_passes_in_draw_order[i]->id, | 153 render_passes_in_draw_order[i]->id, |
| 154 RenderPassTextureSize(render_passes_in_draw_order[i]))); | 154 RenderPassTextureSize(render_passes_in_draw_order[i].get()))); |
| 155 | 155 |
| 156 std::vector<RenderPassId> passes_to_delete; | 156 std::vector<RenderPassId> passes_to_delete; |
| 157 for (auto pass_iter = render_pass_textures_.begin(); | 157 for (auto pass_iter = render_pass_textures_.begin(); |
| 158 pass_iter != render_pass_textures_.end(); ++pass_iter) { | 158 pass_iter != render_pass_textures_.end(); ++pass_iter) { |
| 159 base::hash_map<RenderPassId, gfx::Size>::const_iterator it = | 159 base::hash_map<RenderPassId, gfx::Size>::const_iterator it = |
| 160 render_passes_in_frame.find(pass_iter->first); | 160 render_passes_in_frame.find(pass_iter->first); |
| 161 if (it == render_passes_in_frame.end()) { | 161 if (it == render_passes_in_frame.end()) { |
| 162 passes_to_delete.push_back(pass_iter->first); | 162 passes_to_delete.push_back(pass_iter->first); |
| 163 continue; | 163 continue; |
| 164 } | 164 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 191 void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, | 191 void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
| 192 float device_scale_factor, | 192 float device_scale_factor, |
| 193 const gfx::Rect& device_viewport_rect, | 193 const gfx::Rect& device_viewport_rect, |
| 194 const gfx::Rect& device_clip_rect, | 194 const gfx::Rect& device_clip_rect, |
| 195 bool disable_picture_quad_image_filtering) { | 195 bool disable_picture_quad_image_filtering) { |
| 196 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); | 196 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); |
| 197 UMA_HISTOGRAM_COUNTS( | 197 UMA_HISTOGRAM_COUNTS( |
| 198 "Renderer4.renderPassCount", | 198 "Renderer4.renderPassCount", |
| 199 base::saturated_cast<int>(render_passes_in_draw_order->size())); | 199 base::saturated_cast<int>(render_passes_in_draw_order->size())); |
| 200 | 200 |
| 201 const RenderPass* root_render_pass = render_passes_in_draw_order->back(); | 201 const RenderPass* root_render_pass = |
| 202 render_passes_in_draw_order->back().get(); |
| 202 DCHECK(root_render_pass); | 203 DCHECK(root_render_pass); |
| 203 | 204 |
| 204 DrawingFrame frame; | 205 DrawingFrame frame; |
| 205 frame.render_passes_in_draw_order = render_passes_in_draw_order; | 206 frame.render_passes_in_draw_order = render_passes_in_draw_order; |
| 206 frame.root_render_pass = root_render_pass; | 207 frame.root_render_pass = root_render_pass; |
| 207 frame.root_damage_rect = Capabilities().using_partial_swap | 208 frame.root_damage_rect = Capabilities().using_partial_swap |
| 208 ? root_render_pass->damage_rect | 209 ? root_render_pass->damage_rect |
| 209 : root_render_pass->output_rect; | 210 : root_render_pass->output_rect; |
| 210 frame.root_damage_rect.Union(next_root_damage_rect_); | 211 frame.root_damage_rect.Union(next_root_damage_rect_); |
| 211 next_root_damage_rect_ = gfx::Rect(); | 212 next_root_damage_rect_ = gfx::Rect(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 } else { | 250 } else { |
| 250 overlay_processor_->ProcessForOverlays( | 251 overlay_processor_->ProcessForOverlays( |
| 251 resource_provider_, render_passes_in_draw_order, &frame.overlay_list, | 252 resource_provider_, render_passes_in_draw_order, &frame.overlay_list, |
| 252 &frame.root_damage_rect); | 253 &frame.root_damage_rect); |
| 253 | 254 |
| 254 // No need to render in case the damage rect is completely composited | 255 // No need to render in case the damage rect is completely composited |
| 255 // using | 256 // using |
| 256 // overlays and dont have any copy requests. | 257 // overlays and dont have any copy requests. |
| 257 if (frame.root_damage_rect.IsEmpty()) { | 258 if (frame.root_damage_rect.IsEmpty()) { |
| 258 bool handle_copy_requests = false; | 259 bool handle_copy_requests = false; |
| 259 for (auto* pass : *render_passes_in_draw_order) { | 260 for (const auto& pass : *render_passes_in_draw_order) { |
| 260 if (!pass->copy_requests.empty()) { | 261 if (!pass->copy_requests.empty()) { |
| 261 handle_copy_requests = true; | 262 handle_copy_requests = true; |
| 262 break; | 263 break; |
| 263 } | 264 } |
| 264 } | 265 } |
| 265 | 266 |
| 266 if (!handle_copy_requests) { | 267 if (!handle_copy_requests) { |
| 267 BindFramebufferToOutputSurface(&frame); | 268 BindFramebufferToOutputSurface(&frame); |
| 268 FinishDrawingFrame(&frame); | 269 FinishDrawingFrame(&frame); |
| 269 render_passes_in_draw_order->clear(); | 270 render_passes_in_draw_order->clear(); |
| 270 return; | 271 return; |
| 271 } | 272 } |
| 272 overlay_processor_->ProcessForOverlays( | 273 overlay_processor_->ProcessForOverlays( |
| 273 resource_provider_, render_passes_in_draw_order, | 274 resource_provider_, render_passes_in_draw_order, |
| 274 &frame.overlay_list, &frame.root_damage_rect); | 275 &frame.overlay_list, &frame.root_damage_rect); |
| 275 } | 276 } |
| 276 } | 277 } |
| 277 } | 278 } |
| 278 | 279 |
| 279 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { | 280 for (const auto& pass : *render_passes_in_draw_order) { |
| 280 RenderPass* pass = render_passes_in_draw_order->at(i); | 281 DrawRenderPass(&frame, pass.get()); |
| 281 DrawRenderPass(&frame, pass); | |
| 282 | 282 |
| 283 for (ScopedPtrVector<CopyOutputRequest>::iterator it = | 283 bool first_request = true; |
| 284 pass->copy_requests.begin(); | 284 for (auto& copy_request : pass->copy_requests) { |
| 285 it != pass->copy_requests.end(); | 285 // Doing a readback is destructive of our state on Mac, so make sure |
| 286 ++it) { | 286 // we restore the state between readbacks. http://crbug.com/99393. |
| 287 if (it != pass->copy_requests.begin()) { | 287 if (!first_request) |
| 288 // Doing a readback is destructive of our state on Mac, so make sure | 288 UseRenderPass(&frame, pass.get()); |
| 289 // we restore the state between readbacks. http://crbug.com/99393. | 289 CopyCurrentRenderPassToBitmap(&frame, std::move(copy_request)); |
| 290 UseRenderPass(&frame, pass); | 290 first_request = false; |
| 291 } | |
| 292 CopyCurrentRenderPassToBitmap(&frame, pass->copy_requests.take(it)); | |
| 293 } | 291 } |
| 294 } | 292 } |
| 295 FinishDrawingFrame(&frame); | 293 FinishDrawingFrame(&frame); |
| 296 | 294 |
| 297 render_passes_in_draw_order->clear(); | 295 render_passes_in_draw_order->clear(); |
| 298 } | 296 } |
| 299 | 297 |
| 300 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( | 298 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( |
| 301 const DrawingFrame* frame) { | 299 const DrawingFrame* frame) { |
| 302 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect; | 300 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect; |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 ScopedResource* texture = render_pass_textures_.get(id); | 568 ScopedResource* texture = render_pass_textures_.get(id); |
| 571 return texture && texture->id(); | 569 return texture && texture->id(); |
| 572 } | 570 } |
| 573 | 571 |
| 574 // static | 572 // static |
| 575 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { | 573 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { |
| 576 return render_pass->output_rect.size(); | 574 return render_pass->output_rect.size(); |
| 577 } | 575 } |
| 578 | 576 |
| 579 } // namespace cc | 577 } // namespace cc |
| OLD | NEW |