Composite to cc::Display from ui::InProcessContextFactory.
The trees this composites may contain SurfaceLayers, so they have to be aggregated into a Display before being drawn. Also move OnscreenDisplayClient and SurfaceDisplayOutputSurface into cc/surfaces/ so they can be used by ui/compositor. Review URL: https://codereview.chromium.org/888783002 Cr-Commit-Position: refs/heads/master@{#314269}
This commit is contained in:
cc
cc.gyp
surfaces
content
browser
content_browser.gypiui
aura
compositor
views
examples
@ -589,6 +589,8 @@
|
|||||||
'surfaces/display.cc',
|
'surfaces/display.cc',
|
||||||
'surfaces/display.h',
|
'surfaces/display.h',
|
||||||
'surfaces/display_client.h',
|
'surfaces/display_client.h',
|
||||||
|
'surfaces/onscreen_display_client.cc',
|
||||||
|
'surfaces/onscreen_display_client.h',
|
||||||
'surfaces/surface.cc',
|
'surfaces/surface.cc',
|
||||||
'surfaces/surface.h',
|
'surfaces/surface.h',
|
||||||
'surfaces/surface_aggregator.cc',
|
'surfaces/surface_aggregator.cc',
|
||||||
@ -599,6 +601,8 @@
|
|||||||
'surfaces/surface_id.h',
|
'surfaces/surface_id.h',
|
||||||
'surfaces/surface_id_allocator.cc',
|
'surfaces/surface_id_allocator.cc',
|
||||||
'surfaces/surface_id_allocator.h',
|
'surfaces/surface_id_allocator.h',
|
||||||
|
'surfaces/surface_display_output_surface.cc',
|
||||||
|
'surfaces/surface_display_output_surface.h',
|
||||||
'surfaces/surface_manager.cc',
|
'surfaces/surface_manager.cc',
|
||||||
'surfaces/surface_manager.h',
|
'surfaces/surface_manager.h',
|
||||||
'surfaces/surface_resource_holder.cc',
|
'surfaces/surface_resource_holder.cc',
|
||||||
|
@ -18,10 +18,14 @@ component("surfaces") {
|
|||||||
"display.cc",
|
"display.cc",
|
||||||
"display.h",
|
"display.h",
|
||||||
"display_client.h",
|
"display_client.h",
|
||||||
|
"onscreen_display_client.cc",
|
||||||
|
"onscreen_display_client.h",
|
||||||
"surface.cc",
|
"surface.cc",
|
||||||
"surface.h",
|
"surface.h",
|
||||||
"surface_aggregator.cc",
|
"surface_aggregator.cc",
|
||||||
"surface_aggregator.h",
|
"surface_aggregator.h",
|
||||||
|
"surface_display_output_surface.cc",
|
||||||
|
"surface_display_output_surface.h",
|
||||||
"surface_factory.cc",
|
"surface_factory.cc",
|
||||||
"surface_factory.h",
|
"surface_factory.h",
|
||||||
"surface_factory_client.h",
|
"surface_factory_client.h",
|
||||||
|
@ -2,29 +2,29 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "content/browser/compositor/onscreen_display_client.h"
|
#include "cc/surfaces/onscreen_display_client.h"
|
||||||
|
|
||||||
#include "base/trace_event/trace_event.h"
|
#include "base/trace_event/trace_event.h"
|
||||||
#include "cc/output/output_surface.h"
|
#include "cc/output/output_surface.h"
|
||||||
|
#include "cc/surfaces/surface_display_output_surface.h"
|
||||||
#include "cc/surfaces/surface_factory.h"
|
#include "cc/surfaces/surface_factory.h"
|
||||||
#include "cc/surfaces/surface_manager.h"
|
#include "cc/surfaces/surface_manager.h"
|
||||||
#include "content/browser/compositor/surface_display_output_surface.h"
|
|
||||||
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
|
|
||||||
#include "content/common/host_shared_bitmap_manager.h"
|
|
||||||
|
|
||||||
namespace content {
|
namespace cc {
|
||||||
|
|
||||||
OnscreenDisplayClient::OnscreenDisplayClient(
|
OnscreenDisplayClient::OnscreenDisplayClient(
|
||||||
scoped_ptr<cc::OutputSurface> output_surface,
|
scoped_ptr<OutputSurface> output_surface,
|
||||||
cc::SurfaceManager* manager,
|
SurfaceManager* manager,
|
||||||
const cc::RendererSettings& settings,
|
SharedBitmapManager* bitmap_manager,
|
||||||
|
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
||||||
|
const RendererSettings& settings,
|
||||||
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
|
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
|
||||||
: output_surface_(output_surface.Pass()),
|
: output_surface_(output_surface.Pass()),
|
||||||
display_(new cc::Display(this,
|
display_(new Display(this,
|
||||||
manager,
|
manager,
|
||||||
HostSharedBitmapManager::current(),
|
bitmap_manager,
|
||||||
BrowserGpuMemoryBufferManager::current(),
|
gpu_memory_buffer_manager,
|
||||||
settings)),
|
settings)),
|
||||||
task_runner_(task_runner),
|
task_runner_(task_runner),
|
||||||
scheduled_draw_(false),
|
scheduled_draw_(false),
|
||||||
output_surface_lost_(false),
|
output_surface_lost_(false),
|
||||||
@ -60,9 +60,8 @@ void OnscreenDisplayClient::ScheduleDraw() {
|
|||||||
DCHECK(!deferred_draw_);
|
DCHECK(!deferred_draw_);
|
||||||
DCHECK(!scheduled_draw_);
|
DCHECK(!scheduled_draw_);
|
||||||
scheduled_draw_ = true;
|
scheduled_draw_ = true;
|
||||||
task_runner_->PostTask(
|
task_runner_->PostTask(FROM_HERE, base::Bind(&OnscreenDisplayClient::Draw,
|
||||||
FROM_HERE,
|
weak_ptr_factory_.GetWeakPtr()));
|
||||||
base::Bind(&OnscreenDisplayClient::Draw, weak_ptr_factory_.GetWeakPtr()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnscreenDisplayClient::OutputSurfaceLost() {
|
void OnscreenDisplayClient::OutputSurfaceLost() {
|
||||||
@ -90,9 +89,8 @@ void OnscreenDisplayClient::DidSwapBuffersComplete() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnscreenDisplayClient::SetMemoryPolicy(
|
void OnscreenDisplayClient::SetMemoryPolicy(const ManagedMemoryPolicy& policy) {
|
||||||
const cc::ManagedMemoryPolicy& policy) {
|
|
||||||
surface_display_output_surface_->SetMemoryPolicy(policy);
|
surface_display_output_surface_->SetMemoryPolicy(policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace content
|
} // namespace cc
|
@ -2,49 +2,51 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef CONTENT_BROWSER_COMPOSITOR_ONSCREEN_DISPLAY_CLIENT_H_
|
#ifndef CC_SURFACES_ONSCREEN_DISPLAY_CLIENT_H_
|
||||||
#define CONTENT_BROWSER_COMPOSITOR_ONSCREEN_DISPLAY_CLIENT_H_
|
#define CC_SURFACES_ONSCREEN_DISPLAY_CLIENT_H_
|
||||||
|
|
||||||
#include "cc/surfaces/display_client.h"
|
#include "cc/surfaces/display_client.h"
|
||||||
|
|
||||||
|
#include "base/compiler_specific.h"
|
||||||
#include "base/memory/ref_counted.h"
|
#include "base/memory/ref_counted.h"
|
||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
#include "base/single_thread_task_runner.h"
|
#include "base/single_thread_task_runner.h"
|
||||||
#include "cc/surfaces/display.h"
|
#include "cc/surfaces/display.h"
|
||||||
|
#include "cc/surfaces/surfaces_export.h"
|
||||||
|
|
||||||
namespace cc {
|
namespace cc {
|
||||||
class ContextProvider;
|
class ContextProvider;
|
||||||
class SurfaceManager;
|
class SurfaceManager;
|
||||||
}
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
class SurfaceDisplayOutputSurface;
|
class SurfaceDisplayOutputSurface;
|
||||||
|
|
||||||
// This class provides a DisplayClient implementation for drawing directly to an
|
// This class provides a DisplayClient implementation for drawing directly to an
|
||||||
// onscreen context.
|
// onscreen context.
|
||||||
class OnscreenDisplayClient : cc::DisplayClient {
|
class CC_SURFACES_EXPORT OnscreenDisplayClient
|
||||||
|
: NON_EXPORTED_BASE(DisplayClient) {
|
||||||
public:
|
public:
|
||||||
OnscreenDisplayClient(
|
OnscreenDisplayClient(
|
||||||
scoped_ptr<cc::OutputSurface> output_surface,
|
scoped_ptr<OutputSurface> output_surface,
|
||||||
cc::SurfaceManager* manager,
|
SurfaceManager* manager,
|
||||||
const cc::RendererSettings& settings,
|
SharedBitmapManager* bitmap_manager,
|
||||||
|
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
||||||
|
const RendererSettings& settings,
|
||||||
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
||||||
~OnscreenDisplayClient() override;
|
~OnscreenDisplayClient() override;
|
||||||
|
|
||||||
bool Initialize();
|
bool Initialize();
|
||||||
cc::Display* display() { return display_.get(); }
|
Display* display() { return display_.get(); }
|
||||||
void set_surface_output_surface(SurfaceDisplayOutputSurface* surface) {
|
void set_surface_output_surface(SurfaceDisplayOutputSurface* surface) {
|
||||||
surface_display_output_surface_ = surface;
|
surface_display_output_surface_ = surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cc::DisplayClient implementation.
|
// DisplayClient implementation.
|
||||||
void DisplayDamaged() override;
|
void DisplayDamaged() override;
|
||||||
void DidSwapBuffers() override;
|
void DidSwapBuffers() override;
|
||||||
void DidSwapBuffersComplete() override;
|
void DidSwapBuffersComplete() override;
|
||||||
void CommitVSyncParameters(base::TimeTicks timebase,
|
void CommitVSyncParameters(base::TimeTicks timebase,
|
||||||
base::TimeDelta interval) override;
|
base::TimeDelta interval) override;
|
||||||
void OutputSurfaceLost() override;
|
void OutputSurfaceLost() override;
|
||||||
void SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) override;
|
void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override;
|
||||||
|
|
||||||
bool output_surface_lost() { return output_surface_lost_; }
|
bool output_surface_lost() { return output_surface_lost_; }
|
||||||
|
|
||||||
@ -52,8 +54,8 @@ class OnscreenDisplayClient : cc::DisplayClient {
|
|||||||
void ScheduleDraw();
|
void ScheduleDraw();
|
||||||
void Draw();
|
void Draw();
|
||||||
|
|
||||||
scoped_ptr<cc::OutputSurface> output_surface_;
|
scoped_ptr<OutputSurface> output_surface_;
|
||||||
scoped_ptr<cc::Display> display_;
|
scoped_ptr<Display> display_;
|
||||||
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
||||||
SurfaceDisplayOutputSurface* surface_display_output_surface_;
|
SurfaceDisplayOutputSurface* surface_display_output_surface_;
|
||||||
bool scheduled_draw_;
|
bool scheduled_draw_;
|
||||||
@ -68,6 +70,6 @@ class OnscreenDisplayClient : cc::DisplayClient {
|
|||||||
DISALLOW_COPY_AND_ASSIGN(OnscreenDisplayClient);
|
DISALLOW_COPY_AND_ASSIGN(OnscreenDisplayClient);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace content
|
} // namespace cc
|
||||||
|
|
||||||
#endif // CONTENT_BROWSER_COMPOSITOR_ONSCREEN_DISPLAY_CLIENT_H_
|
#endif // CC_SURFACES_ONSCREEN_DISPLAY_CLIENT_H_
|
@ -2,23 +2,22 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "content/browser/compositor/surface_display_output_surface.h"
|
#include "cc/surfaces/surface_display_output_surface.h"
|
||||||
|
|
||||||
#include "cc/output/compositor_frame.h"
|
#include "cc/output/compositor_frame.h"
|
||||||
#include "cc/output/compositor_frame_ack.h"
|
#include "cc/output/compositor_frame_ack.h"
|
||||||
#include "cc/surfaces/display.h"
|
#include "cc/surfaces/display.h"
|
||||||
|
#include "cc/surfaces/onscreen_display_client.h"
|
||||||
#include "cc/surfaces/surface.h"
|
#include "cc/surfaces/surface.h"
|
||||||
#include "cc/surfaces/surface_manager.h"
|
#include "cc/surfaces/surface_manager.h"
|
||||||
#include "content/browser/compositor/onscreen_display_client.h"
|
|
||||||
|
|
||||||
namespace content {
|
namespace cc {
|
||||||
|
|
||||||
SurfaceDisplayOutputSurface::SurfaceDisplayOutputSurface(
|
SurfaceDisplayOutputSurface::SurfaceDisplayOutputSurface(
|
||||||
cc::SurfaceManager* surface_manager,
|
SurfaceManager* surface_manager,
|
||||||
cc::SurfaceIdAllocator* allocator,
|
SurfaceIdAllocator* allocator,
|
||||||
const scoped_refptr<cc::ContextProvider>& context_provider)
|
const scoped_refptr<ContextProvider>& context_provider)
|
||||||
: cc::OutputSurface(context_provider,
|
: OutputSurface(context_provider, nullptr),
|
||||||
scoped_ptr<cc::SoftwareOutputDevice>()),
|
|
||||||
display_client_(NULL),
|
display_client_(NULL),
|
||||||
surface_manager_(surface_manager),
|
surface_manager_(surface_manager),
|
||||||
factory_(surface_manager, this),
|
factory_(surface_manager, this),
|
||||||
@ -41,7 +40,7 @@ void SurfaceDisplayOutputSurface::ReceivedVSyncParameters(
|
|||||||
CommitVSyncParameters(timebase, interval);
|
CommitVSyncParameters(timebase, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceDisplayOutputSurface::SwapBuffers(cc::CompositorFrame* frame) {
|
void SurfaceDisplayOutputSurface::SwapBuffers(CompositorFrame* frame) {
|
||||||
gfx::Size frame_size =
|
gfx::Size frame_size =
|
||||||
frame->delegated_frame_data->render_pass_list.back()->output_rect.size();
|
frame->delegated_frame_data->render_pass_list.back()->output_rect.size();
|
||||||
if (frame_size != display_size_) {
|
if (frame_size != display_size_) {
|
||||||
@ -55,19 +54,17 @@ void SurfaceDisplayOutputSurface::SwapBuffers(cc::CompositorFrame* frame) {
|
|||||||
display_client_->display()->SetSurfaceId(surface_id_,
|
display_client_->display()->SetSurfaceId(surface_id_,
|
||||||
frame->metadata.device_scale_factor);
|
frame->metadata.device_scale_factor);
|
||||||
|
|
||||||
scoped_ptr<cc::CompositorFrame> frame_copy(new cc::CompositorFrame());
|
scoped_ptr<CompositorFrame> frame_copy(new CompositorFrame());
|
||||||
frame->AssignTo(frame_copy.get());
|
frame->AssignTo(frame_copy.get());
|
||||||
factory_.SubmitFrame(
|
factory_.SubmitFrame(
|
||||||
surface_id_,
|
surface_id_, frame_copy.Pass(),
|
||||||
frame_copy.Pass(),
|
|
||||||
base::Bind(&SurfaceDisplayOutputSurface::SwapBuffersComplete,
|
base::Bind(&SurfaceDisplayOutputSurface::SwapBuffersComplete,
|
||||||
base::Unretained(this)));
|
base::Unretained(this)));
|
||||||
|
|
||||||
client_->DidSwapBuffers();
|
client_->DidSwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SurfaceDisplayOutputSurface::BindToClient(
|
bool SurfaceDisplayOutputSurface::BindToClient(OutputSurfaceClient* client) {
|
||||||
cc::OutputSurfaceClient* client) {
|
|
||||||
DCHECK(client);
|
DCHECK(client);
|
||||||
DCHECK(display_client_);
|
DCHECK(display_client_);
|
||||||
client_ = client;
|
client_ = client;
|
||||||
@ -78,25 +75,24 @@ bool SurfaceDisplayOutputSurface::BindToClient(
|
|||||||
|
|
||||||
void SurfaceDisplayOutputSurface::ForceReclaimResources() {
|
void SurfaceDisplayOutputSurface::ForceReclaimResources() {
|
||||||
if (!surface_id_.is_null()) {
|
if (!surface_id_.is_null()) {
|
||||||
scoped_ptr<cc::CompositorFrame> empty_frame(new cc::CompositorFrame());
|
scoped_ptr<CompositorFrame> empty_frame(new CompositorFrame());
|
||||||
empty_frame->delegated_frame_data.reset(new cc::DelegatedFrameData);
|
empty_frame->delegated_frame_data.reset(new DelegatedFrameData);
|
||||||
factory_.SubmitFrame(surface_id_, empty_frame.Pass(),
|
factory_.SubmitFrame(surface_id_, empty_frame.Pass(),
|
||||||
cc::SurfaceFactory::DrawCallback());
|
SurfaceFactory::DrawCallback());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceDisplayOutputSurface::ReturnResources(
|
void SurfaceDisplayOutputSurface::ReturnResources(
|
||||||
const cc::ReturnedResourceArray& resources) {
|
const ReturnedResourceArray& resources) {
|
||||||
cc::CompositorFrameAck ack;
|
CompositorFrameAck ack;
|
||||||
ack.resources = resources;
|
ack.resources = resources;
|
||||||
if (client_)
|
if (client_)
|
||||||
client_->ReclaimResources(&ack);
|
client_->ReclaimResources(&ack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceDisplayOutputSurface::SwapBuffersComplete(
|
void SurfaceDisplayOutputSurface::SwapBuffersComplete(SurfaceDrawStatus drawn) {
|
||||||
cc::SurfaceDrawStatus drawn) {
|
|
||||||
if (client_ && !display_client_->output_surface_lost())
|
if (client_ && !display_client_->output_surface_lost())
|
||||||
client_->DidSwapBuffersComplete();
|
client_->DidSwapBuffersComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace content
|
} // namespace cc
|
63
cc/surfaces/surface_display_output_surface.h
Normal file
63
cc/surfaces/surface_display_output_surface.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// Copyright 2014 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef CC_SURFACES_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
||||||
|
#define CC_SURFACES_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
||||||
|
|
||||||
|
#include "cc/output/output_surface.h"
|
||||||
|
#include "cc/surfaces/surface_factory.h"
|
||||||
|
#include "cc/surfaces/surface_factory_client.h"
|
||||||
|
#include "cc/surfaces/surface_id_allocator.h"
|
||||||
|
#include "cc/surfaces/surfaces_export.h"
|
||||||
|
|
||||||
|
namespace cc {
|
||||||
|
class Display;
|
||||||
|
class OnscreenDisplayClient;
|
||||||
|
class SurfaceManager;
|
||||||
|
|
||||||
|
// This class is maps a compositor OutputSurface to the surface system's Display
|
||||||
|
// concept, allowing a compositor client to submit frames for a native root
|
||||||
|
// window or physical display.
|
||||||
|
class CC_SURFACES_EXPORT SurfaceDisplayOutputSurface
|
||||||
|
: public OutputSurface,
|
||||||
|
public SurfaceFactoryClient {
|
||||||
|
public:
|
||||||
|
// The underlying Display and SurfaceManager must outlive this class.
|
||||||
|
SurfaceDisplayOutputSurface(
|
||||||
|
SurfaceManager* surface_manager,
|
||||||
|
SurfaceIdAllocator* allocator,
|
||||||
|
const scoped_refptr<ContextProvider>& context_provider);
|
||||||
|
~SurfaceDisplayOutputSurface() override;
|
||||||
|
|
||||||
|
void set_display_client(OnscreenDisplayClient* display_client) {
|
||||||
|
display_client_ = display_client;
|
||||||
|
}
|
||||||
|
SurfaceFactory* factory() { return &factory_; }
|
||||||
|
void ReceivedVSyncParameters(base::TimeTicks timebase,
|
||||||
|
base::TimeDelta interval);
|
||||||
|
|
||||||
|
// OutputSurface implementation.
|
||||||
|
void SwapBuffers(CompositorFrame* frame) override;
|
||||||
|
bool BindToClient(OutputSurfaceClient* client) override;
|
||||||
|
void ForceReclaimResources() override;
|
||||||
|
|
||||||
|
// SurfaceFactoryClient implementation.
|
||||||
|
void ReturnResources(const ReturnedResourceArray& resources) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SwapBuffersComplete(SurfaceDrawStatus drawn);
|
||||||
|
|
||||||
|
OnscreenDisplayClient* display_client_;
|
||||||
|
SurfaceManager* surface_manager_;
|
||||||
|
SurfaceFactory factory_;
|
||||||
|
gfx::Size display_size_;
|
||||||
|
SurfaceId surface_id_;
|
||||||
|
SurfaceIdAllocator* allocator_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(SurfaceDisplayOutputSurface);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cc
|
||||||
|
|
||||||
|
#endif // CC_SURFACES_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
@ -390,12 +390,6 @@ source_set("browser") {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_aura || is_mac || is_android) {
|
|
||||||
sources += rebase_path(
|
|
||||||
content_browser_gypi_values.compositor_browser_surface_sources,
|
|
||||||
".",
|
|
||||||
"//content")
|
|
||||||
}
|
|
||||||
if (use_aura || is_mac) {
|
if (use_aura || is_mac) {
|
||||||
sources +=
|
sources +=
|
||||||
rebase_path(content_browser_gypi_values.compositor_browser_sources,
|
rebase_path(content_browser_gypi_values.compositor_browser_sources,
|
||||||
|
@ -14,15 +14,15 @@
|
|||||||
#include "base/threading/thread.h"
|
#include "base/threading/thread.h"
|
||||||
#include "cc/output/compositor_frame.h"
|
#include "cc/output/compositor_frame.h"
|
||||||
#include "cc/output/output_surface.h"
|
#include "cc/output/output_surface.h"
|
||||||
|
#include "cc/surfaces/onscreen_display_client.h"
|
||||||
|
#include "cc/surfaces/surface_display_output_surface.h"
|
||||||
#include "cc/surfaces/surface_manager.h"
|
#include "cc/surfaces/surface_manager.h"
|
||||||
#include "content/browser/compositor/browser_compositor_output_surface.h"
|
#include "content/browser/compositor/browser_compositor_output_surface.h"
|
||||||
#include "content/browser/compositor/browser_compositor_output_surface_proxy.h"
|
#include "content/browser/compositor/browser_compositor_output_surface_proxy.h"
|
||||||
#include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
|
#include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
|
||||||
#include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h"
|
#include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h"
|
||||||
#include "content/browser/compositor/onscreen_display_client.h"
|
|
||||||
#include "content/browser/compositor/reflector_impl.h"
|
#include "content/browser/compositor/reflector_impl.h"
|
||||||
#include "content/browser/compositor/software_browser_compositor_output_surface.h"
|
#include "content/browser/compositor/software_browser_compositor_output_surface.h"
|
||||||
#include "content/browser/compositor/surface_display_output_surface.h"
|
|
||||||
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
||||||
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
|
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
|
||||||
#include "content/browser/gpu/compositor_util.h"
|
#include "content/browser/gpu/compositor_util.h"
|
||||||
@ -66,7 +66,7 @@ namespace content {
|
|||||||
struct GpuProcessTransportFactory::PerCompositorData {
|
struct GpuProcessTransportFactory::PerCompositorData {
|
||||||
int surface_id;
|
int surface_id;
|
||||||
scoped_refptr<ReflectorImpl> reflector;
|
scoped_refptr<ReflectorImpl> reflector;
|
||||||
scoped_ptr<OnscreenDisplayClient> display_client;
|
scoped_ptr<cc::OnscreenDisplayClient> display_client;
|
||||||
};
|
};
|
||||||
|
|
||||||
GpuProcessTransportFactory::GpuProcessTransportFactory()
|
GpuProcessTransportFactory::GpuProcessTransportFactory()
|
||||||
@ -229,12 +229,14 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
|
|||||||
compositor->vsync_manager(),
|
compositor->vsync_manager(),
|
||||||
CreateOverlayCandidateValidator(compositor->widget())));
|
CreateOverlayCandidateValidator(compositor->widget())));
|
||||||
}
|
}
|
||||||
scoped_ptr<OnscreenDisplayClient> display_client(new OnscreenDisplayClient(
|
scoped_ptr<cc::OnscreenDisplayClient> display_client(
|
||||||
display_surface.Pass(), manager, compositor->GetRendererSettings(),
|
new cc::OnscreenDisplayClient(
|
||||||
compositor->task_runner()));
|
display_surface.Pass(), manager, HostSharedBitmapManager::current(),
|
||||||
|
BrowserGpuMemoryBufferManager::current(),
|
||||||
|
compositor->GetRendererSettings(), compositor->task_runner()));
|
||||||
|
|
||||||
scoped_ptr<SurfaceDisplayOutputSurface> output_surface(
|
scoped_ptr<cc::SurfaceDisplayOutputSurface> output_surface(
|
||||||
new SurfaceDisplayOutputSurface(
|
new cc::SurfaceDisplayOutputSurface(
|
||||||
manager, compositor->surface_id_allocator(), context_provider));
|
manager, compositor->surface_id_allocator(), context_provider));
|
||||||
display_client->set_surface_output_surface(output_surface.get());
|
display_client->set_surface_output_surface(output_surface.get());
|
||||||
output_surface->set_display_client(display_client.get());
|
output_surface->set_display_client(display_client.get());
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef CONTENT_BROWSER_COMPOSITOR_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
|
||||||
#define CONTENT_BROWSER_COMPOSITOR_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
|
||||||
|
|
||||||
#include "cc/output/output_surface.h"
|
|
||||||
#include "cc/surfaces/surface_factory.h"
|
|
||||||
#include "cc/surfaces/surface_factory_client.h"
|
|
||||||
#include "cc/surfaces/surface_id_allocator.h"
|
|
||||||
|
|
||||||
namespace cc {
|
|
||||||
class Display;
|
|
||||||
class SurfaceManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
class OnscreenDisplayClient;
|
|
||||||
|
|
||||||
// This class is maps a compositor OutputSurface to the surface system's Display
|
|
||||||
// concept, allowing a compositor client to submit frames for a native root
|
|
||||||
// window or physical display.
|
|
||||||
class SurfaceDisplayOutputSurface : public cc::OutputSurface,
|
|
||||||
public cc::SurfaceFactoryClient {
|
|
||||||
public:
|
|
||||||
// The underlying cc::Display and cc::SurfaceManager must outlive this class.
|
|
||||||
SurfaceDisplayOutputSurface(
|
|
||||||
cc::SurfaceManager* surface_manager,
|
|
||||||
cc::SurfaceIdAllocator* allocator,
|
|
||||||
const scoped_refptr<cc::ContextProvider>& context_provider);
|
|
||||||
~SurfaceDisplayOutputSurface() override;
|
|
||||||
|
|
||||||
void set_display_client(OnscreenDisplayClient* display_client) {
|
|
||||||
display_client_ = display_client;
|
|
||||||
}
|
|
||||||
cc::SurfaceFactory* factory() { return &factory_; }
|
|
||||||
void ReceivedVSyncParameters(base::TimeTicks timebase,
|
|
||||||
base::TimeDelta interval);
|
|
||||||
|
|
||||||
// cc::OutputSurface implementation.
|
|
||||||
void SwapBuffers(cc::CompositorFrame* frame) override;
|
|
||||||
bool BindToClient(cc::OutputSurfaceClient* client) override;
|
|
||||||
void ForceReclaimResources() override;
|
|
||||||
|
|
||||||
// cc::SurfaceFactoryClient implementation.
|
|
||||||
void ReturnResources(const cc::ReturnedResourceArray& resources) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SwapBuffersComplete(cc::SurfaceDrawStatus drawn);
|
|
||||||
|
|
||||||
OnscreenDisplayClient* display_client_;
|
|
||||||
cc::SurfaceManager* surface_manager_;
|
|
||||||
cc::SurfaceFactory factory_;
|
|
||||||
gfx::Size display_size_;
|
|
||||||
cc::SurfaceId surface_id_;
|
|
||||||
cc::SurfaceIdAllocator* allocator_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(SurfaceDisplayOutputSurface);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace content
|
|
||||||
|
|
||||||
#endif // CONTENT_BROWSER_COMPOSITOR_SURFACE_DISPLAY_OUTPUT_SURFACE_H_
|
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "cc/output/context_provider.h"
|
#include "cc/output/context_provider.h"
|
||||||
#include "cc/surfaces/surface_manager.h"
|
#include "cc/surfaces/surface_manager.h"
|
||||||
|
#include "content/browser/gpu/compositor_util.h"
|
||||||
#include "content/common/gpu/client/gl_helper.h"
|
#include "content/common/gpu/client/gl_helper.h"
|
||||||
#include "gpu/command_buffer/client/gles2_interface.h"
|
#include "gpu/command_buffer/client/gles2_interface.h"
|
||||||
#include "ui/compositor/compositor.h"
|
#include "ui/compositor/compositor.h"
|
||||||
@ -14,10 +15,11 @@
|
|||||||
namespace content {
|
namespace content {
|
||||||
|
|
||||||
NoTransportImageTransportFactory::NoTransportImageTransportFactory()
|
NoTransportImageTransportFactory::NoTransportImageTransportFactory()
|
||||||
// The context factory created here is for unit tests, thus passing in true
|
: surface_manager_(UseSurfacesEnabled() ? new cc::SurfaceManager : nullptr),
|
||||||
// in constructor.
|
// The context factory created here is for unit tests, thus passing in
|
||||||
: context_factory_(new ui::InProcessContextFactory(true)),
|
// true in constructor.
|
||||||
surface_manager_(new cc::SurfaceManager) {
|
context_factory_(
|
||||||
|
new ui::InProcessContextFactory(true, surface_manager_.get())) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NoTransportImageTransportFactory::~NoTransportImageTransportFactory() {
|
NoTransportImageTransportFactory::~NoTransportImageTransportFactory() {
|
||||||
|
@ -35,10 +35,10 @@ class NoTransportImageTransportFactory : public ImageTransportFactory {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
scoped_ptr<cc::SurfaceManager> surface_manager_;
|
||||||
scoped_ptr<ui::ContextFactory> context_factory_;
|
scoped_ptr<ui::ContextFactory> context_factory_;
|
||||||
scoped_refptr<cc::ContextProvider> context_provider_;
|
scoped_refptr<cc::ContextProvider> context_provider_;
|
||||||
scoped_ptr<GLHelper> gl_helper_;
|
scoped_ptr<GLHelper> gl_helper_;
|
||||||
scoped_ptr<cc::SurfaceManager> surface_manager_;
|
|
||||||
ObserverList<ImageTransportFactoryObserver> observer_list_;
|
ObserverList<ImageTransportFactoryObserver> observer_list_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(NoTransportImageTransportFactory);
|
DISALLOW_COPY_AND_ASSIGN(NoTransportImageTransportFactory);
|
||||||
|
@ -28,12 +28,12 @@
|
|||||||
#include "cc/output/output_surface.h"
|
#include "cc/output/output_surface.h"
|
||||||
#include "cc/output/output_surface_client.h"
|
#include "cc/output/output_surface_client.h"
|
||||||
#include "cc/scheduler/begin_frame_source.h"
|
#include "cc/scheduler/begin_frame_source.h"
|
||||||
|
#include "cc/surfaces/onscreen_display_client.h"
|
||||||
|
#include "cc/surfaces/surface_display_output_surface.h"
|
||||||
#include "cc/surfaces/surface_id_allocator.h"
|
#include "cc/surfaces/surface_id_allocator.h"
|
||||||
#include "cc/surfaces/surface_manager.h"
|
#include "cc/surfaces/surface_manager.h"
|
||||||
#include "cc/trees/layer_tree_host.h"
|
#include "cc/trees/layer_tree_host.h"
|
||||||
#include "content/browser/android/child_process_launcher_android.h"
|
#include "content/browser/android/child_process_launcher_android.h"
|
||||||
#include "content/browser/compositor/onscreen_display_client.h"
|
|
||||||
#include "content/browser/compositor/surface_display_output_surface.h"
|
|
||||||
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
||||||
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
|
#include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
|
||||||
#include "content/browser/gpu/compositor_util.h"
|
#include "content/browser/gpu/compositor_util.h"
|
||||||
@ -591,13 +591,14 @@ void CompositorImpl::CreateOutputSurface() {
|
|||||||
|
|
||||||
cc::SurfaceManager* manager = GetSurfaceManager();
|
cc::SurfaceManager* manager = GetSurfaceManager();
|
||||||
if (manager) {
|
if (manager) {
|
||||||
display_client_.reset(
|
display_client_.reset(new cc::OnscreenDisplayClient(
|
||||||
new OnscreenDisplayClient(real_output_surface.Pass(), manager,
|
real_output_surface.Pass(), manager, HostSharedBitmapManager::current(),
|
||||||
host_->settings().renderer_settings,
|
BrowserGpuMemoryBufferManager::current(),
|
||||||
base::MessageLoopProxy::current()));
|
host_->settings().renderer_settings,
|
||||||
scoped_ptr<SurfaceDisplayOutputSurface> surface_output_surface(
|
base::MessageLoopProxy::current()));
|
||||||
new SurfaceDisplayOutputSurface(manager, surface_id_allocator_.get(),
|
scoped_ptr<cc::SurfaceDisplayOutputSurface> surface_output_surface(
|
||||||
context_provider));
|
new cc::SurfaceDisplayOutputSurface(
|
||||||
|
manager, surface_id_allocator_.get(), context_provider));
|
||||||
|
|
||||||
display_client_->set_surface_output_surface(surface_output_surface.get());
|
display_client_->set_surface_output_surface(surface_output_surface.get());
|
||||||
surface_output_surface->set_display_client(display_client_.get());
|
surface_output_surface->set_display_client(display_client_.get());
|
||||||
|
@ -27,12 +27,12 @@ struct ANativeWindow;
|
|||||||
namespace cc {
|
namespace cc {
|
||||||
class Layer;
|
class Layer;
|
||||||
class LayerTreeHost;
|
class LayerTreeHost;
|
||||||
|
class OnscreenDisplayClient;
|
||||||
class SurfaceIdAllocator;
|
class SurfaceIdAllocator;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
class CompositorClient;
|
class CompositorClient;
|
||||||
class OnscreenDisplayClient;
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Browser-side compositor that manages a tree of content and UI layers.
|
// Browser-side compositor that manages a tree of content and UI layers.
|
||||||
@ -144,7 +144,7 @@ class CONTENT_EXPORT CompositorImpl
|
|||||||
ui::UIResourceProvider ui_resource_provider_;
|
ui::UIResourceProvider ui_resource_provider_;
|
||||||
ui::ResourceManagerImpl resource_manager_;
|
ui::ResourceManagerImpl resource_manager_;
|
||||||
|
|
||||||
scoped_ptr<OnscreenDisplayClient> display_client_;
|
scoped_ptr<cc::OnscreenDisplayClient> display_client_;
|
||||||
scoped_ptr<cc::SurfaceIdAllocator> surface_id_allocator_;
|
scoped_ptr<cc::SurfaceIdAllocator> surface_id_allocator_;
|
||||||
|
|
||||||
gfx::Size size_;
|
gfx::Size size_;
|
||||||
|
@ -1537,12 +1537,6 @@
|
|||||||
'browser/context_factory.cc',
|
'browser/context_factory.cc',
|
||||||
'browser/memory_pressure_observer.cc',
|
'browser/memory_pressure_observer.cc',
|
||||||
],
|
],
|
||||||
'compositor_browser_surface_sources': [
|
|
||||||
'browser/compositor/onscreen_display_client.cc',
|
|
||||||
'browser/compositor/onscreen_display_client.h',
|
|
||||||
'browser/compositor/surface_display_output_surface.cc',
|
|
||||||
'browser/compositor/surface_display_output_surface.h',
|
|
||||||
],
|
|
||||||
'plugin_browser_sources': [
|
'plugin_browser_sources': [
|
||||||
'browser/pepper_flash_settings_helper_impl.cc',
|
'browser/pepper_flash_settings_helper_impl.cc',
|
||||||
'browser/pepper_flash_settings_helper_impl.h',
|
'browser/pepper_flash_settings_helper_impl.h',
|
||||||
@ -1720,9 +1714,6 @@
|
|||||||
'../sandbox/sandbox.gyp:sandbox',
|
'../sandbox/sandbox.gyp:sandbox',
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
['OS!="ios"', {
|
|
||||||
'sources': [ '<@(compositor_browser_surface_sources)' ],
|
|
||||||
}],
|
|
||||||
['OS!="android" and OS!="ios"', {
|
['OS!="android" and OS!="ios"', {
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'browser/tracing/tracing_resources.gyp:tracing_resources',
|
'browser/tracing/tracing_resources.gyp:tracing_resources',
|
||||||
|
@ -302,7 +302,7 @@ int main(int argc, char** argv) {
|
|||||||
// The ContextFactory must exist before any Compositors are created.
|
// The ContextFactory must exist before any Compositors are created.
|
||||||
bool context_factory_for_test = false;
|
bool context_factory_for_test = false;
|
||||||
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
||||||
new ui::InProcessContextFactory(context_factory_for_test));
|
new ui::InProcessContextFactory(context_factory_for_test, nullptr));
|
||||||
|
|
||||||
base::i18n::InitializeICU();
|
base::i18n::InitializeICU();
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ int DemoMain() {
|
|||||||
// The ContextFactory must exist before any Compositors are created.
|
// The ContextFactory must exist before any Compositors are created.
|
||||||
bool context_factory_for_test = false;
|
bool context_factory_for_test = false;
|
||||||
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
||||||
new ui::InProcessContextFactory(context_factory_for_test));
|
new ui::InProcessContextFactory(context_factory_for_test, nullptr));
|
||||||
context_factory->set_use_test_surface(false);
|
context_factory->set_use_test_surface(false);
|
||||||
|
|
||||||
// Create the message-loop here before creating the root window.
|
// Create the message-loop here before creating the root window.
|
||||||
|
@ -30,7 +30,8 @@ ui::ContextFactory* InitializeContextFactoryForTests(bool enable_pixel_output) {
|
|||||||
if (enable_pixel_output)
|
if (enable_pixel_output)
|
||||||
g_disable_null_draw = new gfx::DisableNullDrawGLBindings;
|
g_disable_null_draw = new gfx::DisableNullDrawGLBindings;
|
||||||
bool context_factory_for_test = true;
|
bool context_factory_for_test = true;
|
||||||
g_implicit_factory = new InProcessContextFactory(context_factory_for_test);
|
g_implicit_factory =
|
||||||
|
new InProcessContextFactory(context_factory_for_test, nullptr);
|
||||||
return g_implicit_factory;
|
return g_implicit_factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include "cc/output/compositor_frame.h"
|
#include "cc/output/compositor_frame.h"
|
||||||
#include "cc/output/context_provider.h"
|
#include "cc/output/context_provider.h"
|
||||||
#include "cc/output/output_surface_client.h"
|
#include "cc/output/output_surface_client.h"
|
||||||
|
#include "cc/surfaces/onscreen_display_client.h"
|
||||||
|
#include "cc/surfaces/surface_display_output_surface.h"
|
||||||
#include "cc/surfaces/surface_id_allocator.h"
|
#include "cc/surfaces/surface_id_allocator.h"
|
||||||
#include "cc/test/pixel_test_output_surface.h"
|
#include "cc/test/pixel_test_output_surface.h"
|
||||||
#include "cc/test/test_shared_bitmap_manager.h"
|
#include "cc/test/test_shared_bitmap_manager.h"
|
||||||
@ -62,10 +64,13 @@ class DirectOutputSurface : public cc::OutputSurface {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
InProcessContextFactory::InProcessContextFactory(bool context_factory_for_test)
|
InProcessContextFactory::InProcessContextFactory(
|
||||||
|
bool context_factory_for_test,
|
||||||
|
cc::SurfaceManager* surface_manager)
|
||||||
: next_surface_id_namespace_(1u),
|
: next_surface_id_namespace_(1u),
|
||||||
use_test_surface_(true),
|
use_test_surface_(true),
|
||||||
context_factory_for_test_(context_factory_for_test) {
|
context_factory_for_test_(context_factory_for_test),
|
||||||
|
surface_manager_(surface_manager) {
|
||||||
DCHECK_NE(gfx::GetGLImplementation(), gfx::kGLImplementationNone)
|
DCHECK_NE(gfx::GetGLImplementation(), gfx::kGLImplementationNone)
|
||||||
<< "If running tests, ensure that main() is calling "
|
<< "If running tests, ensure that main() is calling "
|
||||||
<< "gfx::GLSurface::InitializeOneOffForTests()";
|
<< "gfx::GLSurface::InitializeOneOffForTests()";
|
||||||
@ -82,7 +87,9 @@ InProcessContextFactory::InProcessContextFactory(bool context_factory_for_test)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InProcessContextFactory::~InProcessContextFactory() {}
|
InProcessContextFactory::~InProcessContextFactory() {
|
||||||
|
DCHECK(per_compositor_data_.empty());
|
||||||
|
}
|
||||||
|
|
||||||
void InProcessContextFactory::CreateOutputSurface(
|
void InProcessContextFactory::CreateOutputSurface(
|
||||||
base::WeakPtr<Compositor> compositor,
|
base::WeakPtr<Compositor> compositor,
|
||||||
@ -105,13 +112,36 @@ void InProcessContextFactory::CreateOutputSurface(
|
|||||||
InProcessContextProvider::Create(attribs, lose_context_when_out_of_memory,
|
InProcessContextProvider::Create(attribs, lose_context_when_out_of_memory,
|
||||||
compositor->widget(), "UICompositor");
|
compositor->widget(), "UICompositor");
|
||||||
|
|
||||||
|
scoped_ptr<cc::OutputSurface> real_output_surface;
|
||||||
|
|
||||||
if (use_test_surface_) {
|
if (use_test_surface_) {
|
||||||
bool flipped_output_surface = false;
|
bool flipped_output_surface = false;
|
||||||
compositor->SetOutputSurface(make_scoped_ptr(new cc::PixelTestOutputSurface(
|
real_output_surface = make_scoped_ptr(new cc::PixelTestOutputSurface(
|
||||||
context_provider, flipped_output_surface)));
|
context_provider, flipped_output_surface));
|
||||||
} else {
|
} else {
|
||||||
compositor->SetOutputSurface(
|
real_output_surface =
|
||||||
make_scoped_ptr(new DirectOutputSurface(context_provider)));
|
make_scoped_ptr(new DirectOutputSurface(context_provider));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surface_manager_) {
|
||||||
|
scoped_ptr<cc::OnscreenDisplayClient> display_client(
|
||||||
|
new cc::OnscreenDisplayClient(
|
||||||
|
real_output_surface.Pass(), surface_manager_,
|
||||||
|
GetSharedBitmapManager(), GetGpuMemoryBufferManager(),
|
||||||
|
compositor->GetRendererSettings(), compositor->task_runner()));
|
||||||
|
scoped_ptr<cc::SurfaceDisplayOutputSurface> surface_output_surface(
|
||||||
|
new cc::SurfaceDisplayOutputSurface(surface_manager_,
|
||||||
|
compositor->surface_id_allocator(),
|
||||||
|
context_provider));
|
||||||
|
display_client->set_surface_output_surface(surface_output_surface.get());
|
||||||
|
surface_output_surface->set_display_client(display_client.get());
|
||||||
|
|
||||||
|
compositor->SetOutputSurface(surface_output_surface.Pass());
|
||||||
|
|
||||||
|
delete per_compositor_data_[compositor.get()];
|
||||||
|
per_compositor_data_[compositor.get()] = display_client.release();
|
||||||
|
} else {
|
||||||
|
compositor->SetOutputSurface(real_output_surface.Pass());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,7 +170,12 @@ InProcessContextFactory::SharedMainThreadContextProvider() {
|
|||||||
return shared_main_thread_contexts_;
|
return shared_main_thread_contexts_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InProcessContextFactory::RemoveCompositor(Compositor* compositor) {}
|
void InProcessContextFactory::RemoveCompositor(Compositor* compositor) {
|
||||||
|
if (!per_compositor_data_.count(compositor))
|
||||||
|
return;
|
||||||
|
delete per_compositor_data_[compositor];
|
||||||
|
per_compositor_data_.erase(compositor);
|
||||||
|
}
|
||||||
|
|
||||||
bool InProcessContextFactory::DoesCreateTestContexts() {
|
bool InProcessContextFactory::DoesCreateTestContexts() {
|
||||||
return context_factory_for_test_;
|
return context_factory_for_test_;
|
||||||
@ -169,6 +204,9 @@ InProcessContextFactory::CreateSurfaceIdAllocator() {
|
|||||||
|
|
||||||
void InProcessContextFactory::ResizeDisplay(ui::Compositor* compositor,
|
void InProcessContextFactory::ResizeDisplay(ui::Compositor* compositor,
|
||||||
const gfx::Size& size) {
|
const gfx::Size& size) {
|
||||||
|
if (!per_compositor_data_.count(compositor))
|
||||||
|
return;
|
||||||
|
per_compositor_data_[compositor]->display()->Resize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ui
|
} // namespace ui
|
||||||
|
@ -13,11 +13,19 @@ namespace base {
|
|||||||
class Thread;
|
class Thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace cc {
|
||||||
|
class OnscreenDisplayClient;
|
||||||
|
class SurfaceManager;
|
||||||
|
}
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
class InProcessContextFactory : public ContextFactory {
|
class InProcessContextFactory : public ContextFactory {
|
||||||
public:
|
public:
|
||||||
explicit InProcessContextFactory(bool context_factory_for_test);
|
// surface_manager is owned by the creator of this and must outlive the
|
||||||
|
// context factory.
|
||||||
|
InProcessContextFactory(bool context_factory_for_test,
|
||||||
|
cc::SurfaceManager* surface_manager);
|
||||||
~InProcessContextFactory() override;
|
~InProcessContextFactory() override;
|
||||||
|
|
||||||
// If true (the default) an OutputSurface is created that does not display
|
// If true (the default) an OutputSurface is created that does not display
|
||||||
@ -51,8 +59,10 @@ class InProcessContextFactory : public ContextFactory {
|
|||||||
cc::TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
|
cc::TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
|
||||||
uint32_t next_surface_id_namespace_;
|
uint32_t next_surface_id_namespace_;
|
||||||
bool use_test_surface_;
|
bool use_test_surface_;
|
||||||
|
bool context_factory_for_test_;
|
||||||
|
cc::SurfaceManager* surface_manager_;
|
||||||
|
|
||||||
const bool context_factory_for_test_;
|
base::hash_map<Compositor*, cc::OnscreenDisplayClient*> per_compositor_data_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(InProcessContextFactory);
|
DISALLOW_COPY_AND_ASSIGN(InProcessContextFactory);
|
||||||
};
|
};
|
||||||
|
@ -57,7 +57,7 @@ int main(int argc, char** argv) {
|
|||||||
// The ContextFactory must exist before any Compositors are created.
|
// The ContextFactory must exist before any Compositors are created.
|
||||||
bool context_factory_for_test = false;
|
bool context_factory_for_test = false;
|
||||||
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
scoped_ptr<ui::InProcessContextFactory> context_factory(
|
||||||
new ui::InProcessContextFactory(context_factory_for_test));
|
new ui::InProcessContextFactory(context_factory_for_test, nullptr));
|
||||||
context_factory->set_use_test_surface(false);
|
context_factory->set_use_test_surface(false);
|
||||||
|
|
||||||
base::MessageLoopForUI message_loop;
|
base::MessageLoopForUI message_loop;
|
||||||
|
Reference in New Issue
Block a user