Chromium Code Reviews| Index: cc/surfaces/display.cc |
| diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc |
| index ba4ed0315315060956e6c212cf91f70fc9e196ea..54b64b687f081c10d40a461de17b96d7f959b0d7 100644 |
| --- a/cc/surfaces/display.cc |
| +++ b/cc/surfaces/display.cc |
| @@ -11,21 +11,36 @@ |
| #include "cc/output/compositor_frame.h" |
| #include "cc/output/direct_renderer.h" |
| #include "cc/output/gl_renderer.h" |
| +#include "cc/output/software_renderer.h" |
| #include "cc/surfaces/display_client.h" |
| #include "cc/surfaces/surface.h" |
| -#include "ui/gfx/frame_time.h" |
| namespace cc { |
| +static ResourceProvider::ResourceId ResourceRemapHelper( |
| + bool* invalid_frame, |
| + const ResourceProvider::ResourceIdMap& child_to_parent_map, |
| + ResourceProvider::ResourceIdArray* resources_in_frame, |
| + ResourceProvider::ResourceId id) { |
| + ResourceProvider::ResourceIdMap::const_iterator it = |
| + child_to_parent_map.find(id); |
| + if (it == child_to_parent_map.end()) { |
| + *invalid_frame = true; |
| + return 0; |
| + } |
| + |
| + DCHECK_EQ(it->first, id); |
| + ResourceProvider::ResourceId remapped_id = it->second; |
| + resources_in_frame->push_back(id); |
| + return remapped_id; |
| +} |
| Display::Display(DisplayClient* client, |
| SurfaceManager* manager, |
| SharedBitmapManager* bitmap_manager) |
| - : scheduled_draw_(false), |
| - client_(client), |
| + : client_(client), |
| manager_(manager), |
| aggregator_(manager), |
| - bitmap_manager_(bitmap_manager), |
| - schedule_draw_factory_(this) { |
| + bitmap_manager_(bitmap_manager) { |
| } |
| Display::~Display() { |
| @@ -39,6 +54,52 @@ bool Display::Draw() { |
| if (!current_surface_) |
| return false; |
| + if (!output_surface_) { |
| + scoped_ptr<OutputSurface> output_surface = client_->CreateOutputSurface(); |
|
jamesr
2014/06/09 02:39:27
this block is long enough to be its own function
|
| + if (!output_surface->BindToClient(this)) |
| + return false; |
| + |
| + int highp_threshold_min = 0; |
| + bool use_rgba_4444_texture_format = false; |
| + size_t id_allocation_chunk_size = 1; |
| + bool use_distance_field_text = false; |
| + scoped_ptr<ResourceProvider> resource_provider = |
| + ResourceProvider::Create(output_surface.get(), |
| + bitmap_manager_, |
| + highp_threshold_min, |
| + use_rgba_4444_texture_format, |
| + id_allocation_chunk_size, |
| + use_distance_field_text); |
| + if (!resource_provider) |
| + return false; |
| + |
| + LayerTreeSettings settings; |
| + if (output_surface->context_provider()) { |
| + TextureMailboxDeleter* texture_mailbox_deleter = NULL; |
| + scoped_ptr<GLRenderer> renderer = |
| + GLRenderer::Create(this, |
| + &settings, |
| + output_surface.get(), |
| + resource_provider.get(), |
| + texture_mailbox_deleter, |
| + highp_threshold_min); |
| + if (!renderer) |
| + return false; |
| + renderer_ = renderer.Pass(); |
| + } else { |
| + scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( |
| + this, &settings, output_surface.get(), resource_provider.get()); |
| + if (!renderer) |
| + return false; |
| + renderer_ = renderer.Pass(); |
| + } |
| + |
| + output_surface_ = output_surface.Pass(); |
| + resource_provider_ = resource_provider.Pass(); |
| + child_id_ = resource_provider_->CreateChild( |
| + base::Bind(&Display::ReturnResources, base::Unretained(this))); |
| + } |
| + |
| // TODO(jamesr): Use the surface aggregator instead. |
| scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| CompositorFrame* current_frame = current_surface_->GetEligibleFrame(); |
| @@ -47,59 +108,78 @@ bool Display::Draw() { |
| RenderPass::CopyAll(current_frame->delegated_frame_data->render_pass_list, |
| &frame_data->render_pass_list); |
| - if (!layer_tree_host_) { |
| - // TODO(jbauman): Switch to use ResourceProvider and GLRenderer directly, |
| - // as using LayerTreeHost from here is a layering violation. |
| - LayerTreeSettings settings; |
| - layer_tree_host_ = LayerTreeHost::CreateSingleThreaded( |
| - this, this, bitmap_manager_, settings); |
| - resource_collection_ = new DelegatedFrameResourceCollection; |
| - resource_collection_->SetClient(this); |
| - layer_tree_host_->SetLayerTreeHostClientReady(); |
| - } |
| - if (!delegated_frame_provider_ || |
| - delegated_frame_provider_->frame_size() != |
| - frame_data->render_pass_list.back()->output_rect.size()) { |
| - delegated_frame_provider_ = |
| - new DelegatedFrameProvider(resource_collection_, frame_data.Pass()); |
| - delegated_layer_ = |
| - DelegatedRendererLayer::Create(delegated_frame_provider_); |
| - |
| - layer_tree_host_->SetRootLayer(delegated_layer_); |
| - delegated_layer_->SetDisplaySize(current_surface_->size()); |
| - delegated_layer_->SetBounds(current_surface_->size()); |
| - delegated_layer_->SetContentsOpaque(true); |
| - delegated_layer_->SetIsDrawable(true); |
| - } else { |
| - delegated_frame_provider_->SetFrameData(frame_data.Pass()); |
| + if (frame_data->render_pass_list.empty()) |
| + return false; |
| + |
| + const ResourceProvider::ResourceIdMap& resource_map = |
| + resource_provider_->GetChildToParentMap(child_id_); |
| + resource_provider_->ReceiveFromChild(child_id_, frame_data->resource_list); |
|
jamesr
2014/06/09 02:39:27
i've got another patch in the queue that does the
|
| + |
| + bool invalid_frame = false; |
| + ResourceProvider::ResourceIdArray resources_in_frame; |
| + DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = |
| + base::Bind(&ResourceRemapHelper, |
| + &invalid_frame, |
| + resource_map, |
| + &resources_in_frame); |
| + for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { |
| + RenderPass* pass = frame_data->render_pass_list[i]; |
| + for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
| + DrawQuad* quad = pass->quad_list[j]; |
| + quad->IterateResources(remap_resources_to_parent_callback); |
| + } |
| } |
| - layer_tree_host_->SetViewportSize(current_surface_->size()); |
| + if (invalid_frame) |
| + return false; |
| + resource_provider_->DeclareUsedResourcesFromChild(child_id_, |
| + resources_in_frame); |
| + |
| + float device_scale_factor = 1.0f; |
| + gfx::Rect device_viewport_rect = gfx::Rect(current_surface_->size()); |
| + gfx::Rect device_clip_rect = device_viewport_rect; |
| + bool disable_picture_quad_image_filtering = false; |
| + |
| + renderer_->DrawFrame(&frame_data->render_pass_list, |
| + device_scale_factor, |
| + device_viewport_rect, |
| + device_clip_rect, |
| + disable_picture_quad_image_filtering); |
| + CompositorFrameMetadata metadata; |
| + renderer_->SwapBuffers(metadata); |
| return true; |
| } |
| -scoped_ptr<OutputSurface> Display::CreateOutputSurface(bool fallback) { |
| - return client_->CreateOutputSurface(); |
| +void Display::DeferredInitialize() { |
|
jamesr
2014/06/09 02:39:27
could these all be inline? the clang checker shoul
|
| } |
| - |
| -void Display::ScheduleComposite() { |
| - if (scheduled_draw_) |
| - return; |
| - |
| - scheduled_draw_ = true; |
| - |
| - base::MessageLoop::current()->PostTask( |
| - FROM_HERE, |
| - base::Bind(&Display::DoComposite, schedule_draw_factory_.GetWeakPtr())); |
| +void Display::ReleaseGL() { |
| } |
| - |
| -void Display::ScheduleAnimation() { |
| - ScheduleComposite(); |
| +void Display::CommitVSyncParameters(base::TimeTicks timebase, |
| + base::TimeDelta interval) { |
| +} |
| +void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
| +} |
| +void Display::BeginFrame(const BeginFrameArgs& args) { |
| +} |
| +void Display::DidSwapBuffers() { |
| +} |
| +void Display::DidSwapBuffersComplete() { |
| +} |
| +void Display::ReclaimResources(const CompositorFrameAck* ack) { |
| +} |
| +void Display::DidLoseOutputSurface() { |
| +} |
| +void Display::SetExternalDrawConstraints(const gfx::Transform& transform, |
| + const gfx::Rect& viewport, |
| + const gfx::Rect& clip, |
| + bool valid_for_tile_management) { |
| +} |
| +void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| +} |
| +void Display::SetTreeActivationCallback(const base::Closure& callback) { |
| } |
| -void Display::DoComposite() { |
| - scheduled_draw_ = false; |
| - layer_tree_host_->Composite(gfx::FrameTime::Now()); |
| +void Display::SetFullRootLayerDamage() { |
| } |
| int Display::CurrentSurfaceID() { |
| @@ -107,8 +187,6 @@ int Display::CurrentSurfaceID() { |
| } |
| void Display::ReturnResources(const ReturnedResourceArray& resources) { |
| - // We never generate any resources, so we should never have any returned. |
| - DCHECK(resources.empty()); |
| } |
| } // namespace cc |