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

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

Issue 2651843002: FrameGenerator should receive SurfaceInfo and use it in frame generation (Closed)
Patch Set: c Created 3 years, 11 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
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/ws/frame_generator.cc
diff --git a/services/ui/ws/frame_generator.cc b/services/ui/ws/frame_generator.cc
index ec6a34716b7dfec7468062626fe847d5bf48c14a..ba893e2095cb53ccc60cc1e438b7668ec5827727 100644
--- a/services/ui/ws/frame_generator.cc
+++ b/services/ui/ws/frame_generator.cc
@@ -31,6 +31,14 @@ FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
DCHECK(delegate_);
}
+void FrameGenerator::SetDeviceScaleFactor(float device_scale_factor) {
+ if (device_scale_factor_ == device_scale_factor)
+ return;
+ device_scale_factor_ = device_scale_factor;
+ if (compositor_frame_sink_)
+ compositor_frame_sink_->SetNeedsBeginFrame(true);
+}
+
FrameGenerator::~FrameGenerator() {
// Invalidate WeakPtrs now to avoid callbacks back into the
// FrameGenerator during destruction of |compositor_frame_sink_|.
@@ -50,23 +58,17 @@ void FrameGenerator::OnAcceleratedWidgetAvailable(
root_window_->CreateDisplayCompositorFrameSink(
widget, std::move(sink_request), binding_.CreateInterfacePtrAndBind(),
std::move(display_request));
- // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
- // even when we don't need it. Once surface ID propagation work is done,
- // this will not be necessary because FrameGenerator will only need a
- // BeginFrame if the window manager changes.
- compositor_frame_sink_->SetNeedsBeginFrame(true);
}
-void FrameGenerator::OnSurfaceCreated(const cc::SurfaceId& surface_id,
- ServerWindow* window) {
- DCHECK(surface_id.is_valid());
+void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) {
+ DCHECK(surface_info.id().is_valid());
// Only handle embedded surfaces changing here. The display root surface
// changing is handled immediately after the CompositorFrame is submitted.
- // TODO(samans): Only tell FrameGenerator about WM surface instead of all
- // all surfaces.
- if (window == delegate_->GetActiveRootWindow())
- window_manager_surface_id_ = surface_id;
+ if (surface_info != window_manager_surface_info_) {
+ window_manager_surface_info_ = surface_info;
+ compositor_frame_sink_->SetNeedsBeginFrame(true);
+ }
}
void FrameGenerator::DidReceiveCompositorFrameAck() {}
@@ -91,6 +93,7 @@ void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
std::move(frame));
+ compositor_frame_sink_->SetNeedsBeginFrame(false);
last_submitted_frame_size_ = frame_size;
}
}
@@ -112,7 +115,7 @@ cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
render_pass->SetNew(render_pass_id, output_rect, output_rect,
gfx::Transform());
- DrawWindow(render_pass.get(), delegate_->GetActiveRootWindow());
+ DrawWindow(render_pass.get());
cc::CompositorFrame frame;
frame.render_pass_list.push_back(std::move(render_pass));
@@ -121,7 +124,10 @@ cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform());
cc::SharedQuadState* shared_state =
invert_pass->CreateAndAppendSharedQuadState();
- shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
+ gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
+ output_rect.size(), window_manager_surface_info_.device_scale_factor(),
+ window_manager_surface_info_.device_scale_factor());
+ shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect,
output_rect, false, 1.f, SkBlendMode::kSrcOver, 0);
auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
render_pass->filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
@@ -134,48 +140,42 @@ cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
}
frame.metadata.device_scale_factor = device_scale_factor_;
- if (window_manager_surface_id_.is_valid())
- frame.metadata.referenced_surfaces.push_back(window_manager_surface_id_);
+ if (window_manager_surface_info_.id().is_valid()) {
+ frame.metadata.referenced_surfaces.push_back(
+ window_manager_surface_info_.id());
+ }
return frame;
}
-void FrameGenerator::DrawWindow(cc::RenderPass* pass, ServerWindow* window) {
- if (!window || !window->visible())
- return;
+void FrameGenerator::DrawWindow(cc::RenderPass* pass) {
+ DCHECK(window_manager_surface_info_.id().is_valid());
- if (!window->compositor_frame_sink_manager())
- return;
-
- cc::SurfaceId default_surface_id =
- window->compositor_frame_sink_manager()->GetLatestSurfaceId();
-
- if (!default_surface_id.is_valid())
- return;
+ const gfx::Rect bounds_at_origin(
+ window_manager_surface_info_.size_in_pixels());
gfx::Transform quad_to_target_transform;
- quad_to_target_transform.Translate(window->bounds().x(),
- window->bounds().y());
+ quad_to_target_transform.Translate(bounds_at_origin.x(),
+ bounds_at_origin.y());
cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
- const gfx::Rect bounds_at_origin(window->bounds().size());
+ gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
+ bounds_at_origin.size(),
+ window_manager_surface_info_.device_scale_factor(),
+ window_manager_surface_info_.device_scale_factor());
+
// TODO(fsamuel): These clipping and visible rects are incorrect. They need
// to be populated from CompositorFrame structs.
- sqs->SetAll(
- quad_to_target_transform, bounds_at_origin.size() /* layer_bounds */,
- bounds_at_origin /* visible_layer_bounds */,
- bounds_at_origin /* clip_rect */, false /* is_clipped */,
- 1.0f /* opacity */, SkBlendMode::kSrcOver, 0 /* sorting-context_id */);
+ sqs->SetAll(quad_to_target_transform, scaled_bounds /* layer_bounds */,
+ bounds_at_origin /* visible_layer_bounds */,
+ bounds_at_origin /* clip_rect */, false /* is_clipped */,
+ 1.0f /* opacity */, SkBlendMode::kSrcOver,
+ 0 /* sorting-context_id */);
auto* quad = pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
- quad->SetAll(sqs, bounds_at_origin /* rect */,
- gfx::Rect() /* opaque_rect */,
+ quad->SetAll(sqs, bounds_at_origin /* rect */, gfx::Rect() /* opaque_rect */,
bounds_at_origin /* visible_rect */, true /* needs_blending*/,
- default_surface_id);
-}
-
-void FrameGenerator::OnWindowDestroying(ServerWindow* window) {
- Remove(window);
+ window_manager_surface_info_.id());
}
} // namespace ws
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/frame_generator_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698