| Index: ui/compositor/test/in_process_context_factory.cc
|
| diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc
|
| index 42dd8b51c350b8115de56e86f054925bc811e745..a6a88a2410942938e63fe8194132f171b1855694 100644
|
| --- a/ui/compositor/test/in_process_context_factory.cc
|
| +++ b/ui/compositor/test/in_process_context_factory.cc
|
| @@ -32,6 +32,10 @@
|
| #include "ui/gl/gl_implementation.h"
|
| #include "ui/gl/test/gl_surface_test_support.h"
|
|
|
| +#if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW)
|
| +#include "gpu/ipc/common/gpu_surface_tracker.h"
|
| +#endif
|
| +
|
| namespace ui {
|
| namespace {
|
|
|
| @@ -113,6 +117,11 @@ class DirectOutputSurface : public cc::OutputSurface {
|
|
|
| } // namespace
|
|
|
| +struct InProcessContextFactory::PerCompositorData {
|
| + gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle;
|
| + std::unique_ptr<cc::Display> display;
|
| +};
|
| +
|
| InProcessContextFactory::InProcessContextFactory(
|
| bool context_factory_for_test,
|
| cc::SurfaceManager* surface_manager)
|
| @@ -166,10 +175,14 @@ void InProcessContextFactory::CreateCompositorFrameSink(
|
| attribs.sample_buffers = 0;
|
| attribs.fail_if_major_perf_caveat = false;
|
| attribs.bind_generates_resource = false;
|
| + PerCompositorData* data = per_compositor_data_[compositor.get()].get();
|
| + if (!data)
|
| + data = CreatePerCompositorData(compositor.get());
|
| +
|
| scoped_refptr<InProcessContextProvider> context_provider =
|
| InProcessContextProvider::Create(
|
| attribs, shared_worker_context_provider_.get(),
|
| - &gpu_memory_buffer_manager_, &image_factory_, compositor->widget(),
|
| + &gpu_memory_buffer_manager_, &image_factory_, data->surface_handle,
|
| "UICompositor");
|
|
|
| std::unique_ptr<cc::OutputSurface> display_output_surface;
|
| @@ -189,14 +202,15 @@ void InProcessContextFactory::CreateCompositorFrameSink(
|
| std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
|
| begin_frame_source.get(), compositor->task_runner().get(),
|
| display_output_surface->capabilities().max_frames_pending));
|
| - per_compositor_data_[compositor.get()] = base::MakeUnique<cc::Display>(
|
| +
|
| + data->display = base::MakeUnique<cc::Display>(
|
| &shared_bitmap_manager_, &gpu_memory_buffer_manager_,
|
| compositor->GetRendererSettings(), compositor->frame_sink_id(),
|
| std::move(begin_frame_source), std::move(display_output_surface),
|
| std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>(
|
| compositor->task_runner().get()));
|
|
|
| - auto* display = per_compositor_data_[compositor.get()].get();
|
| + auto* display = per_compositor_data_[compositor.get()]->display.get();
|
| auto compositor_frame_sink = base::MakeUnique<cc::DirectCompositorFrameSink>(
|
| compositor->frame_sink_id(), surface_manager_, display, context_provider,
|
| shared_worker_context_provider_, &gpu_memory_buffer_manager_,
|
| @@ -230,9 +244,16 @@ InProcessContextFactory::SharedMainThreadContextProvider() {
|
| }
|
|
|
| void InProcessContextFactory::RemoveCompositor(Compositor* compositor) {
|
| - if (!per_compositor_data_.count(compositor))
|
| + PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
|
| + if (it == per_compositor_data_.end())
|
| return;
|
| - per_compositor_data_.erase(compositor);
|
| + PerCompositorData* data = it->second.get();
|
| + DCHECK(data);
|
| +#if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW)
|
| + if (data->surface_handle)
|
| + gpu::GpuSurfaceTracker::Get()->RemoveSurface(data->surface_handle);
|
| +#endif
|
| + per_compositor_data_.erase(it);
|
| }
|
|
|
| bool InProcessContextFactory::DoesCreateTestContexts() {
|
| @@ -266,14 +287,14 @@ void InProcessContextFactory::SetDisplayVisible(ui::Compositor* compositor,
|
| bool visible) {
|
| if (!per_compositor_data_.count(compositor))
|
| return;
|
| - per_compositor_data_[compositor]->SetVisible(visible);
|
| + per_compositor_data_[compositor]->display->SetVisible(visible);
|
| }
|
|
|
| void InProcessContextFactory::ResizeDisplay(ui::Compositor* compositor,
|
| const gfx::Size& size) {
|
| if (!per_compositor_data_.count(compositor))
|
| return;
|
| - per_compositor_data_[compositor]->Resize(size);
|
| + per_compositor_data_[compositor]->display->Resize(size);
|
| }
|
|
|
| void InProcessContextFactory::AddObserver(ContextFactoryObserver* observer) {
|
| @@ -284,4 +305,27 @@ void InProcessContextFactory::RemoveObserver(ContextFactoryObserver* observer) {
|
| observer_list_.RemoveObserver(observer);
|
| }
|
|
|
| +InProcessContextFactory::PerCompositorData*
|
| +InProcessContextFactory::CreatePerCompositorData(ui::Compositor* compositor) {
|
| + DCHECK(!per_compositor_data_[compositor]);
|
| +
|
| + gfx::AcceleratedWidget widget = compositor->widget();
|
| +
|
| + auto data = base::MakeUnique<PerCompositorData>();
|
| + if (widget == gfx::kNullAcceleratedWidget) {
|
| + data->surface_handle = gpu::kNullSurfaceHandle;
|
| + } else {
|
| +#if defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW)
|
| + data->surface_handle = widget;
|
| +#else
|
| + gpu::GpuSurfaceTracker* tracker = gpu::GpuSurfaceTracker::Get();
|
| + data->surface_handle = tracker->AddSurfaceForNativeWidget(widget);
|
| +#endif
|
| + }
|
| +
|
| + PerCompositorData* return_ptr = data.get();
|
| + per_compositor_data_[compositor] = std::move(data);
|
| + return return_ptr;
|
| +}
|
| +
|
| } // namespace ui
|
|
|