Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1015)

Unified Diff: services/ui/ws/server_window_compositor_frame_sink.cc

Issue 2471503002: Mus+Ash: Unify CompositorFrameSinks (Closed)
Patch Set: Added comment Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/ui/ws/server_window_compositor_frame_sink.cc
diff --git a/services/ui/ws/server_window_compositor_frame_sink.cc b/services/ui/ws/server_window_compositor_frame_sink.cc
index dcc9f5abf0a325759d21ace248c91ca9a8a1b098..e2330b745cb6770f67b80474ac5a600a65a358be 100644
--- a/services/ui/ws/server_window_compositor_frame_sink.cc
+++ b/services/ui/ws/server_window_compositor_frame_sink.cc
@@ -7,22 +7,36 @@
#include "base/callback.h"
#include "base/message_loop/message_loop.h"
#include "cc/output/compositor_frame.h"
+#include "cc/output/output_surface.h"
+#include "cc/output/texture_mailbox_deleter.h"
#include "cc/quads/shared_quad_state.h"
#include "cc/quads/surface_draw_quad.h"
+#include "cc/scheduler/begin_frame_source.h"
+#include "cc/surfaces/display_scheduler.h"
+#include "services/ui/surfaces/direct_output_surface.h"
#include "services/ui/surfaces/display_compositor.h"
#include "services/ui/ws/server_window.h"
#include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
#include "services/ui/ws/server_window_delegate.h"
+#if defined(USE_OZONE)
+#include "gpu/command_buffer/client/gles2_interface.h"
+#include "services/ui/surfaces/direct_output_surface_ozone.h"
+#endif
+
namespace ui {
namespace ws {
ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink(
ServerWindowCompositorFrameSinkManager* manager,
const cc::FrameSinkId& frame_sink_id,
+ gfx::AcceleratedWidget widget,
+ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+ scoped_refptr<SurfacesContextProvider> context_provider,
cc::mojom::MojoCompositorFrameSinkRequest request,
cc::mojom::MojoCompositorFrameSinkClientPtr client)
: frame_sink_id_(frame_sink_id),
+ task_runner_(base::ThreadTaskRunnerHandle::Get()),
gab 2016/11/02 18:07:33 #include "base/threading/thread_task_runner_handle
manager_(manager),
surface_factory_(frame_sink_id_,
manager_->GetCompositorFrameSinkManager(),
@@ -33,6 +47,9 @@ ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink(
manager_->GetCompositorFrameSinkManager();
surface_manager->RegisterFrameSinkId(frame_sink_id_);
surface_manager->RegisterSurfaceFactoryClient(frame_sink_id_, this);
+
+ if (widget != gfx::kNullAcceleratedWidget)
+ InitDisplay(widget, gpu_memory_buffer_manager, std::move(context_provider));
}
ServerWindowCompositorFrameSink::~ServerWindowCompositorFrameSink() {
@@ -61,12 +78,18 @@ void ServerWindowCompositorFrameSink::SubmitCompositorFrame(
surface_factory_.Destroy(local_frame_id_);
local_frame_id_ = surface_id_allocator_.GenerateId();
surface_factory_.Create(local_frame_id_);
+ if (display_)
+ display_->Resize(frame_size);
}
++ack_pending_count_;
surface_factory_.SubmitCompositorFrame(
local_frame_id_, std::move(frame),
base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck,
base::Unretained(this)));
+ if (display_) {
+ display_->SetSurfaceId(cc::SurfaceId(frame_sink_id_, local_frame_id_),
+ frame.metadata.device_scale_factor);
+ }
last_submitted_frame_size_ = frame_size;
ServerWindow* window = manager_->window_;
window->delegate()->OnScheduleWindowPaint(window);
@@ -84,6 +107,57 @@ void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
ack_pending_count_--;
}
+void ServerWindowCompositorFrameSink::InitDisplay(
+ gfx::AcceleratedWidget widget,
+ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+ scoped_refptr<SurfacesContextProvider> context_provider) {
+ // TODO(rjkroege): If there is something better to do than CHECK, add it.
+ CHECK(context_provider->BindToCurrentThread());
+
+ std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source(
+ new cc::DelayBasedBeginFrameSource(
+ base::MakeUnique<cc::DelayBasedTimeSource>(task_runner_.get())));
+
+ std::unique_ptr<cc::OutputSurface> display_output_surface;
+ if (context_provider->ContextCapabilities().surfaceless) {
+#if defined(USE_OZONE)
+ display_output_surface = base::MakeUnique<DirectOutputSurfaceOzone>(
+ context_provider, widget, synthetic_begin_frame_source.get(),
+ gpu_memory_buffer_manager, GL_TEXTURE_2D, GL_RGB);
+#else
+ NOTREACHED();
+#endif
+ } else {
+ display_output_surface = base::MakeUnique<DirectOutputSurface>(
+ context_provider, synthetic_begin_frame_source.get());
+ }
+
+ int max_frames_pending =
+ display_output_surface->capabilities().max_frames_pending;
+ DCHECK_GT(max_frames_pending, 0);
+
+ std::unique_ptr<cc::DisplayScheduler> scheduler(
+ new cc::DisplayScheduler(synthetic_begin_frame_source.get(),
+ task_runner_.get(), max_frames_pending));
+
+ display_.reset(new cc::Display(
+ nullptr /* bitmap_manager */, gpu_memory_buffer_manager,
+ cc::RendererSettings(), std::move(synthetic_begin_frame_source),
+ std::move(display_output_surface), std::move(scheduler),
+ base::MakeUnique<cc::TextureMailboxDeleter>(task_runner_.get())));
+ display_->Initialize(this, manager_->GetCompositorFrameSinkManager(),
+ frame_sink_id_);
+ display_->SetVisible(true);
+}
+
+void ServerWindowCompositorFrameSink::DisplayOutputSurfaceLost() {}
+
+void ServerWindowCompositorFrameSink::DisplayWillDrawAndSwap(
+ bool will_draw_and_swap,
+ const cc::RenderPassList& render_passes) {}
+
+void ServerWindowCompositorFrameSink::DisplayDidDrawAndSwap() {}
+
void ServerWindowCompositorFrameSink::ReturnResources(
const cc::ReturnedResourceArray& resources) {
if (resources.empty())

Powered by Google App Engine
This is Rietveld 408576698