| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/mus/surfaces/top_level_display_client.h" | 5 #include "components/mus/surfaces/top_level_display_client.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/threading/thread_task_runner_handle.h" | 8 #include "cc/output/output_surface.h" |
| 9 #include "cc/output/compositor_frame.h" | |
| 10 #include "cc/output/copy_output_request.h" | |
| 11 #include "cc/scheduler/begin_frame_source.h" | |
| 12 #include "cc/surfaces/display.h" | 9 #include "cc/surfaces/display.h" |
| 13 #include "cc/surfaces/display_scheduler.h" | |
| 14 #include "cc/surfaces/surface.h" | |
| 15 #include "components/mus/gles2/gpu_state.h" | |
| 16 #include "components/mus/surfaces/direct_output_surface.h" | |
| 17 #include "components/mus/surfaces/surfaces_context_provider.h" | |
| 18 #include "components/mus/surfaces/surfaces_state.h" | |
| 19 | 10 |
| 20 #if defined(USE_OZONE) | 11 namespace mus { |
| 21 #include "components/mus/surfaces/direct_output_surface_ozone.h" | |
| 22 #include "gpu/command_buffer/client/gles2_interface.h" | |
| 23 #endif | |
| 24 | 12 |
| 25 namespace base { | 13 TopLevelDisplayClient::TopLevelDisplayClient( |
| 26 class SingleThreadTaskRunner; | 14 std::unique_ptr<cc::OutputSurface> output_surface, |
| 15 cc::SurfaceManager* surface_manager, |
| 16 cc::SharedBitmapManager* bitmap_manager, |
| 17 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 18 const cc::RendererSettings& settings, |
| 19 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 20 uint32_t compositor_surface_namespace) |
| 21 : output_surface_(std::move(output_surface)), |
| 22 task_runner_(task_runner), |
| 23 display_(new cc::Display(this, |
| 24 surface_manager, |
| 25 bitmap_manager, |
| 26 gpu_memory_buffer_manager, |
| 27 settings, |
| 28 compositor_surface_namespace)) {} |
| 29 |
| 30 TopLevelDisplayClient::~TopLevelDisplayClient() { |
| 27 } | 31 } |
| 28 | 32 |
| 29 namespace mus { | 33 bool TopLevelDisplayClient::Initialize() { |
| 30 namespace { | 34 DCHECK(output_surface_); |
| 31 void CallCallback(const base::Closure& callback, cc::SurfaceDrawStatus status) { | 35 return display_->Initialize(std::move(output_surface_), task_runner_.get()); |
| 32 callback.Run(); | |
| 33 } | |
| 34 } | |
| 35 | |
| 36 TopLevelDisplayClient::TopLevelDisplayClient( | |
| 37 gfx::AcceleratedWidget widget, | |
| 38 const scoped_refptr<GpuState>& gpu_state, | |
| 39 const scoped_refptr<SurfacesState>& surfaces_state) | |
| 40 : task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
| 41 surfaces_state_(surfaces_state), | |
| 42 factory_(surfaces_state->manager(), this), | |
| 43 cc_id_(static_cast<uint64_t>(surfaces_state->next_id_namespace()) << 32) { | |
| 44 factory_.Create(cc_id_); | |
| 45 surfaces_state_->manager()->RegisterSurfaceIdNamespace(cc_id_.id_namespace()); | |
| 46 | |
| 47 display_.reset(new cc::Display(this, surfaces_state_->manager(), nullptr, | |
| 48 nullptr, cc::RendererSettings(), | |
| 49 cc_id_.id_namespace())); | |
| 50 | |
| 51 scoped_refptr<SurfacesContextProvider> surfaces_context_provider( | |
| 52 new SurfacesContextProvider(widget, gpu_state)); | |
| 53 // TODO(rjkroege): If there is something better to do than CHECK, add it. | |
| 54 CHECK(surfaces_context_provider->BindToCurrentThread()); | |
| 55 | |
| 56 std::unique_ptr<cc::OutputSurface> output_surface; | |
| 57 if (surfaces_context_provider->ContextCapabilities().surfaceless) { | |
| 58 #if defined(USE_OZONE) | |
| 59 output_surface = base::WrapUnique(new DirectOutputSurfaceOzone( | |
| 60 surfaces_context_provider, widget, task_runner_.get(), GL_TEXTURE_2D, | |
| 61 GL_RGB)); | |
| 62 #else | |
| 63 NOTREACHED(); | |
| 64 #endif | |
| 65 } else { | |
| 66 output_surface = base::WrapUnique( | |
| 67 new DirectOutputSurface(surfaces_context_provider, task_runner_.get())); | |
| 68 } | |
| 69 | |
| 70 int max_frames_pending = output_surface->capabilities().max_frames_pending; | |
| 71 DCHECK_GT(max_frames_pending, 0); | |
| 72 | |
| 73 if (gpu_state->HardwareRenderingAvailable()) { | |
| 74 display_->Initialize(std::move(output_surface), task_runner_.get()); | |
| 75 } else { | |
| 76 // TODO(rjkroege): Implement software compositing. | |
| 77 } | |
| 78 display_->Resize(last_submitted_frame_size_); | |
| 79 | |
| 80 // TODO(fsamuel): Plumb the proper device scale factor. | |
| 81 display_->SetSurfaceId(cc_id_, 1.f /* device_scale_factor */); | |
| 82 } | |
| 83 | |
| 84 TopLevelDisplayClient::~TopLevelDisplayClient() { | |
| 85 surfaces_state_->manager()->InvalidateSurfaceIdNamespace( | |
| 86 cc_id_.id_namespace()); | |
| 87 factory_.Destroy(cc_id_); | |
| 88 } | |
| 89 | |
| 90 void TopLevelDisplayClient::SubmitCompositorFrame( | |
| 91 std::unique_ptr<cc::CompositorFrame> frame, | |
| 92 const base::Closure& callback) { | |
| 93 pending_frame_ = std::move(frame); | |
| 94 | |
| 95 last_submitted_frame_size_ = | |
| 96 pending_frame_->delegated_frame_data->render_pass_list.back() | |
| 97 ->output_rect.size(); | |
| 98 display_->Resize(last_submitted_frame_size_); | |
| 99 factory_.SubmitCompositorFrame(cc_id_, std::move(pending_frame_), | |
| 100 base::Bind(&CallCallback, callback)); | |
| 101 } | |
| 102 | |
| 103 void TopLevelDisplayClient::RequestCopyOfOutput( | |
| 104 std::unique_ptr<cc::CopyOutputRequest> output_request) { | |
| 105 factory_.RequestCopyOfSurface(cc_id_, std::move(output_request)); | |
| 106 } | 36 } |
| 107 | 37 |
| 108 void TopLevelDisplayClient::OutputSurfaceLost() { | 38 void TopLevelDisplayClient::OutputSurfaceLost() { |
| 109 if (!display_) // Shutdown case | 39 if (!display_) // Shutdown case |
| 110 return; | 40 return; |
| 111 display_.reset(); | 41 display_.reset(); |
| 112 } | 42 } |
| 113 | 43 |
| 114 void TopLevelDisplayClient::SetMemoryPolicy( | 44 void TopLevelDisplayClient::SetMemoryPolicy( |
| 115 const cc::ManagedMemoryPolicy& policy) {} | 45 const cc::ManagedMemoryPolicy& policy) {} |
| 116 | 46 |
| 117 void TopLevelDisplayClient::ReturnResources( | |
| 118 const cc::ReturnedResourceArray& resources) { | |
| 119 // TODO(fsamuel): Implement this. | |
| 120 } | |
| 121 | |
| 122 void TopLevelDisplayClient::SetBeginFrameSource( | |
| 123 cc::BeginFrameSource* begin_frame_source) { | |
| 124 // TODO(tansell): Implement this. | |
| 125 } | |
| 126 | |
| 127 } // namespace mus | 47 } // namespace mus |
| OLD | NEW |