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

Unified Diff: content/browser/compositor/gpu_process_transport_factory.cc

Issue 2029323004: Get rid of virtual Display::CreateScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@onscreendisplayclient
Patch Set: displaytest: unusedvar Created 4 years, 6 months 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: content/browser/compositor/gpu_process_transport_factory.cc
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 6fdb92e360299c8d0235df72ab40d2ad3bd0b4a1..2c0e1453fad86e443e081853eb71cdc6a48b3917 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -20,10 +20,14 @@
#include "cc/base/histograms.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/output_surface.h"
+#include "cc/output/texture_mailbox_deleter.h"
#include "cc/output/vulkan_in_process_context_provider.h"
#include "cc/raster/single_thread_task_graph_runner.h"
#include "cc/raster/task_graph_runner.h"
+#include "cc/scheduler/begin_frame_source.h"
+#include "cc/scheduler/delay_based_time_source.h"
#include "cc/surfaces/display.h"
+#include "cc/surfaces/display_scheduler.h"
#include "cc/surfaces/surface_display_output_surface.h"
#include "cc/surfaces/surface_manager.h"
#include "components/display_compositor/compositor_overlay_candidate_validator.h"
@@ -152,6 +156,7 @@ namespace content {
struct GpuProcessTransportFactory::PerCompositorData {
gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle;
BrowserCompositorOutputSurface* display_output_surface = nullptr;
+ cc::SyntheticBeginFrameSource* begin_frame_source = nullptr;
ReflectorImpl* reflector = nullptr;
std::unique_ptr<cc::Display> display;
bool output_is_secure = false;
@@ -279,6 +284,7 @@ void GpuProcessTransportFactory::CreateOutputSurface(
// TODO(danakj): We can destroy the |data->display| here when the compositor
// destroys its OutputSurface before calling back here.
data->display_output_surface = nullptr;
+ data->begin_frame_source = nullptr;
}
#if defined(OS_WIN)
@@ -420,6 +426,17 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
}
}
+ std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source;
+ if (!compositor->GetRendererSettings().disable_display_vsync) {
+ begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
+ base::MakeUnique<cc::DelayBasedTimeSource>(
+ compositor->task_runner().get())));
+ } else {
+ begin_frame_source.reset(new cc::BackToBackBeginFrameSource(
+ base::MakeUnique<cc::DelayBasedTimeSource>(
+ compositor->task_runner().get())));
+ }
+
std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface;
#if defined(ENABLE_VULKAN)
std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface;
@@ -441,7 +458,7 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
display_output_surface =
base::WrapUnique(new SoftwareBrowserCompositorOutputSurface(
CreateSoftwareOutputDevice(compositor.get()),
- compositor->vsync_manager(), compositor->task_runner().get()));
+ compositor->vsync_manager(), begin_frame_source.get()));
} else {
DCHECK(context_provider);
const auto& capabilities = context_provider->ContextCapabilities();
@@ -449,21 +466,21 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
display_output_surface =
base::WrapUnique(new OffscreenBrowserCompositorOutputSurface(
context_provider, compositor->vsync_manager(),
- compositor->task_runner().get(),
+ begin_frame_source.get(),
std::unique_ptr<display_compositor::
CompositorOverlayCandidateValidator>()));
} else if (capabilities.surfaceless) {
#if defined(OS_MACOSX)
display_output_surface = base::WrapUnique(new GpuOutputSurfaceMac(
context_provider, data->surface_handle, compositor->vsync_manager(),
- compositor->task_runner().get(),
+ begin_frame_source.get(),
CreateOverlayCandidateValidator(compositor->widget()),
BrowserGpuMemoryBufferManager::current()));
#else
display_output_surface =
base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface(
context_provider, data->surface_handle,
- compositor->vsync_manager(), compositor->task_runner().get(),
+ compositor->vsync_manager(), begin_frame_source.get(),
CreateOverlayCandidateValidator(compositor->widget()),
GL_TEXTURE_2D, GL_RGB,
BrowserGpuMemoryBufferManager::current()));
@@ -478,12 +495,13 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
display_output_surface =
base::WrapUnique(new GpuBrowserCompositorOutputSurface(
context_provider, compositor->vsync_manager(),
- compositor->task_runner().get(), std::move(validator)));
+ begin_frame_source.get(), std::move(validator)));
}
}
}
data->display_output_surface = display_output_surface.get();
+ data->begin_frame_source = begin_frame_source.get();
if (data->reflector)
data->reflector->OnSourceSurfaceReady(data->display_output_surface);
@@ -492,13 +510,19 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
compositor->widget());
#endif
+ std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
+ begin_frame_source.get(), compositor->task_runner().get(),
+ display_output_surface->capabilities().max_frames_pending));
+
// The Display owns and uses the |display_output_surface| created above.
data->display = base::MakeUnique<cc::Display>(
surface_manager_.get(), HostSharedBitmapManager::current(),
BrowserGpuMemoryBufferManager::current(),
compositor->GetRendererSettings(),
compositor->surface_id_allocator()->id_namespace(),
- compositor->task_runner().get(), std::move(display_output_surface));
+ std::move(begin_frame_source), std::move(display_output_surface),
+ std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>(
+ compositor->task_runner().get()));
// The |delegated_output_surface| is given back to the compositor, it
// delegates to the Display as its root surface. Importantly, it shares the
@@ -631,10 +655,8 @@ void GpuProcessTransportFactory::SetAuthoritativeVSyncInterval(
return;
PerCompositorData* data = it->second;
DCHECK(data);
- if (data->display_output_surface) {
- data->display_output_surface->begin_frame_source()
- ->SetAuthoritativeVSyncInterval(interval);
- }
+ if (data->begin_frame_source)
+ data->begin_frame_source->SetAuthoritativeVSyncInterval(interval);
}
void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor,

Powered by Google App Engine
This is Rietveld 408576698