| Index: cc/surfaces/surface_display_output_surface.cc
|
| diff --git a/cc/surfaces/surface_display_output_surface.cc b/cc/surfaces/surface_display_output_surface.cc
|
| index d2093ac026a8de76ea6b87fbdcdff878f284b2d1..73dd6e3581b67d74fd306e87b77818b4749a9465 100644
|
| --- a/cc/surfaces/surface_display_output_surface.cc
|
| +++ b/cc/surfaces/surface_display_output_surface.cc
|
| @@ -8,103 +8,121 @@
|
| #include "cc/output/compositor_frame.h"
|
| #include "cc/output/compositor_frame_ack.h"
|
| #include "cc/surfaces/display.h"
|
| -#include "cc/surfaces/onscreen_display_client.h"
|
| #include "cc/surfaces/surface.h"
|
| +#include "cc/surfaces/surface_id_allocator.h"
|
| #include "cc/surfaces/surface_manager.h"
|
|
|
| namespace cc {
|
|
|
| SurfaceDisplayOutputSurface::SurfaceDisplayOutputSurface(
|
| SurfaceManager* surface_manager,
|
| - SurfaceIdAllocator* allocator,
|
| + SurfaceIdAllocator* surface_id_allocator,
|
| + Display* display,
|
| scoped_refptr<ContextProvider> context_provider,
|
| scoped_refptr<ContextProvider> worker_context_provider)
|
| : OutputSurface(std::move(context_provider),
|
| std::move(worker_context_provider),
|
| nullptr),
|
| - display_client_(nullptr),
|
| - factory_(surface_manager, this),
|
| - allocator_(allocator) {
|
| - factory_.set_needs_sync_points(false);
|
| + surface_manager_(surface_manager),
|
| + surface_id_allocator_(surface_id_allocator),
|
| + display_(display),
|
| + factory_(surface_manager, this) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| capabilities_.delegated_rendering = true;
|
| capabilities_.adjust_deadline_for_parent = true;
|
| capabilities_.can_force_reclaim_resources = true;
|
| +
|
| // Display and SurfaceDisplayOutputSurface share a GL context, so sync
|
| // points aren't needed when passing resources between them.
|
| capabilities_.delegated_sync_points_required = false;
|
| + factory_.set_needs_sync_points(false);
|
| }
|
|
|
| SurfaceDisplayOutputSurface::SurfaceDisplayOutputSurface(
|
| SurfaceManager* surface_manager,
|
| - SurfaceIdAllocator* allocator,
|
| + SurfaceIdAllocator* surface_id_allocator,
|
| + Display* display,
|
| scoped_refptr<VulkanContextProvider> vulkan_context_provider)
|
| : OutputSurface(std::move(vulkan_context_provider)),
|
| - display_client_(nullptr),
|
| - factory_(surface_manager, this),
|
| - allocator_(allocator) {
|
| + surface_manager_(surface_manager),
|
| + surface_id_allocator_(surface_id_allocator),
|
| + display_(display),
|
| + factory_(surface_manager, this) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| capabilities_.delegated_rendering = true;
|
| capabilities_.adjust_deadline_for_parent = true;
|
| capabilities_.can_force_reclaim_resources = true;
|
| }
|
|
|
| SurfaceDisplayOutputSurface::~SurfaceDisplayOutputSurface() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| if (HasClient())
|
| DetachFromClient();
|
| - if (!surface_id_.is_null()) {
|
| - factory_.Destroy(surface_id_);
|
| - }
|
| }
|
|
|
| void SurfaceDisplayOutputSurface::SwapBuffers(CompositorFrame* frame) {
|
| gfx::Size frame_size =
|
| frame->delegated_frame_data->render_pass_list.back()->output_rect.size();
|
| - if (frame_size.IsEmpty() || frame_size != display_size_) {
|
| - if (!surface_id_.is_null()) {
|
| - factory_.Destroy(surface_id_);
|
| + if (frame_size.IsEmpty() || frame_size != last_swap_frame_size_) {
|
| + if (!delegated_surface_id_.is_null()) {
|
| + factory_.Destroy(delegated_surface_id_);
|
| }
|
| - surface_id_ = allocator_->GenerateId();
|
| - factory_.Create(surface_id_);
|
| - display_size_ = frame_size;
|
| + delegated_surface_id_ = surface_id_allocator_->GenerateId();
|
| + factory_.Create(delegated_surface_id_);
|
| + last_swap_frame_size_ = frame_size;
|
| }
|
| - display_client_->display()->SetSurfaceId(surface_id_,
|
| - frame->metadata.device_scale_factor);
|
| + display_->SetSurfaceId(delegated_surface_id_,
|
| + frame->metadata.device_scale_factor);
|
|
|
| client_->DidSwapBuffers();
|
|
|
| std::unique_ptr<CompositorFrame> frame_copy(new CompositorFrame());
|
| frame->AssignTo(frame_copy.get());
|
| factory_.SubmitCompositorFrame(
|
| - surface_id_, std::move(frame_copy),
|
| + delegated_surface_id_, std::move(frame_copy),
|
| base::Bind(&SurfaceDisplayOutputSurface::SwapBuffersComplete,
|
| base::Unretained(this)));
|
| }
|
|
|
| bool SurfaceDisplayOutputSurface::BindToClient(OutputSurfaceClient* client) {
|
| - DCHECK(client);
|
| - DCHECK(display_client_);
|
| - client_ = client;
|
| - factory_.manager()->RegisterSurfaceFactoryClient(allocator_->id_namespace(),
|
| - this);
|
| -
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (!OutputSurface::BindToClient(client))
|
| + return false;
|
| +
|
| + // We want the Display's output surface to hear about lost context, and since
|
| + // this shares a context with it, we should not be listening for lost context
|
| + // callbacks on the context here.
|
| + if (context_provider())
|
| + context_provider()->SetLostContextCallback(base::Closure());
|
| +
|
| + surface_manager_->RegisterSurfaceFactoryClient(
|
| + surface_id_allocator_->id_namespace(), this);
|
| // Avoid initializing GL context here, as this should be sharing the
|
| // Display's context.
|
| - return display_client_->Initialize();
|
| + bool init = display_->Initialize(this);
|
| + // Since this class shares its GL context with the Display, Initialize should
|
| + // not be possible to fail.
|
| + DCHECK(init);
|
| + return true;
|
| }
|
|
|
| void SurfaceDisplayOutputSurface::ForceReclaimResources() {
|
| - if (!surface_id_.is_null())
|
| - factory_.SubmitCompositorFrame(surface_id_, nullptr,
|
| + if (!delegated_surface_id_.is_null()) {
|
| + factory_.SubmitCompositorFrame(delegated_surface_id_, nullptr,
|
| SurfaceFactory::DrawCallback());
|
| + }
|
| }
|
|
|
| void SurfaceDisplayOutputSurface::DetachFromClient() {
|
| DCHECK(HasClient());
|
| // Unregister the SurfaceFactoryClient here instead of the dtor so that only
|
| // one client is alive for this namespace at any given time.
|
| - factory_.manager()->UnregisterSurfaceFactoryClient(
|
| - allocator_->id_namespace());
|
| + surface_manager_->UnregisterSurfaceFactoryClient(
|
| + surface_id_allocator_->id_namespace());
|
| + if (!delegated_surface_id_.is_null())
|
| + factory_.Destroy(delegated_surface_id_);
|
| +
|
| OutputSurface::DetachFromClient();
|
| - DCHECK(!HasClient());
|
| }
|
|
|
| void SurfaceDisplayOutputSurface::ReturnResources(
|
| @@ -121,8 +139,19 @@ void SurfaceDisplayOutputSurface::SetBeginFrameSource(
|
| client_->SetBeginFrameSource(begin_frame_source);
|
| }
|
|
|
| +void SurfaceDisplayOutputSurface::DisplayOutputSurfaceLost() {
|
| + output_surface_lost_ = true;
|
| + DidLoseOutputSurface();
|
| +}
|
| +
|
| +void SurfaceDisplayOutputSurface::DisplaySetMemoryPolicy(
|
| + const ManagedMemoryPolicy& policy) {
|
| + SetMemoryPolicy(policy);
|
| +}
|
| +
|
| void SurfaceDisplayOutputSurface::SwapBuffersComplete(SurfaceDrawStatus drawn) {
|
| - if (client_ && !display_client_->output_surface_lost())
|
| + // TODO(danakj): Why the lost check?
|
| + if (!output_surface_lost_)
|
| client_->DidSwapBuffersComplete();
|
| }
|
|
|
|
|