Index: services/view_manager/display_manager.cc |
diff --git a/services/view_manager/display_manager.cc b/services/view_manager/display_manager.cc |
index 0e4f3b8f48f9bdd4f387722a56b5175a717e4838..e9d0816264b26e583490615f91c1823d19e27b21 100644 |
--- a/services/view_manager/display_manager.cc |
+++ b/services/view_manager/display_manager.cc |
@@ -5,7 +5,6 @@ |
#include "services/view_manager/display_manager.h" |
#include "base/numerics/safe_conversions.h" |
-#include "cc/surfaces/surface_id_allocator.h" |
#include "mojo/converters/geometry/geometry_type_converters.h" |
#include "mojo/converters/surfaces/surfaces_type_converters.h" |
#include "mojo/public/cpp/application/application_connection.h" |
@@ -13,6 +12,7 @@ |
#include "mojo/services/gpu/public/interfaces/gpu.mojom.h" |
#include "mojo/services/surfaces/public/cpp/surfaces_utils.h" |
#include "mojo/services/surfaces/public/interfaces/quads.mojom.h" |
+#include "mojo/services/surfaces/public/interfaces/surfaces.mojom.h" |
#include "services/view_manager/connection_manager.h" |
#include "services/view_manager/server_view.h" |
#include "services/view_manager/view_coordinate_conversions.h" |
@@ -23,8 +23,6 @@ using mojo::Size; |
namespace view_manager { |
namespace { |
-static uint32_t kLocalSurfaceID = 1u; |
- |
void DrawViewTree(mojo::Pass* pass, |
const ServerView* view, |
const gfx::Vector2d& parent_to_root_origin_offset, |
@@ -81,8 +79,6 @@ DefaultDisplayManager::DefaultDisplayManager( |
app_connection_(app_connection), |
connection_manager_(nullptr), |
draw_timer_(false, false), |
- id_namespace_(0u), |
- surface_allocated_(false), |
native_viewport_closed_callback_(native_viewport_closed_callback), |
weak_factory_(this) { |
metrics_.size = mojo::Size::New(); |
@@ -95,15 +91,18 @@ void DefaultDisplayManager::Init(ConnectionManager* connection_manager) { |
app_impl_->ConnectToService("mojo:native_viewport_service", |
&native_viewport_); |
native_viewport_.set_error_handler(this); |
- native_viewport_->Create( |
- metrics_.size->Clone(), |
- base::Bind(&DefaultDisplayManager::OnCreatedNativeViewport, |
- weak_factory_.GetWeakPtr())); |
+ native_viewport_->Create(metrics_.size->Clone(), |
+ base::Bind(&DefaultDisplayManager::OnMetricsChanged, |
+ weak_factory_.GetWeakPtr())); |
native_viewport_->Show(); |
- app_impl_->ConnectToService("mojo:surfaces_service", &surface_); |
- surface_->GetIdNamespace(base::Bind(&DefaultDisplayManager::SetIdNamespace, |
- base::Unretained(this))); |
+ mojo::ContextProviderPtr context_provider; |
+ native_viewport_->GetContextProvider(GetProxy(&context_provider)); |
+ mojo::DisplayFactoryPtr display_factory; |
+ app_impl_->ConnectToService("mojo:surfaces_service", &display_factory); |
+ display_factory->Create(context_provider.Pass(), |
+ nullptr, // returner - we never submit resources. |
+ GetProxy(&display_)); |
mojo::NativeViewportEventDispatcherPtr event_dispatcher; |
app_connection_->ConnectToService(&event_dispatcher); |
@@ -122,11 +121,7 @@ void DefaultDisplayManager::SchedulePaint(const ServerView* view, |
if (root_relative_rect.IsEmpty()) |
return; |
dirty_rect_.Union(root_relative_rect); |
- if (!draw_timer_.IsRunning()) { |
- draw_timer_.Start( |
- FROM_HERE, base::TimeDelta(), |
- base::Bind(&DefaultDisplayManager::Draw, base::Unretained(this))); |
- } |
+ WantToDraw(); |
} |
void DefaultDisplayManager::SetViewportSize(const gfx::Size& size) { |
@@ -137,18 +132,7 @@ const mojo::ViewportMetrics& DefaultDisplayManager::GetViewportMetrics() { |
return metrics_; |
} |
-void DefaultDisplayManager::OnCreatedNativeViewport( |
- uint64_t native_viewport_id, |
- mojo::ViewportMetricsPtr metrics) { |
- OnMetricsChanged(metrics.Pass()); |
-} |
- |
void DefaultDisplayManager::Draw() { |
- if (!surface_allocated_) { |
- surface_->CreateSurface(kLocalSurfaceID); |
- surface_allocated_ = true; |
- } |
- |
Rect rect; |
rect.width = metrics_.size->width; |
rect.height = metrics_.size->height; |
@@ -160,16 +144,26 @@ void DefaultDisplayManager::Draw() { |
auto frame = mojo::Frame::New(); |
frame->passes.push_back(pass.Pass()); |
frame->resources.resize(0u); |
- surface_->SubmitFrame(kLocalSurfaceID, frame.Pass(), mojo::Closure()); |
+ frame_pending_ = true; |
+ display_->SubmitFrame( |
+ frame.Pass(), |
+ base::Bind(&DefaultDisplayManager::DidDraw, base::Unretained(this))); |
dirty_rect_ = gfx::Rect(); |
+} |
- if (id_namespace_ == 0u) |
+void DefaultDisplayManager::DidDraw() { |
+ frame_pending_ = false; |
+ if (!dirty_rect_.IsEmpty()) |
+ WantToDraw(); |
+} |
+ |
+void DefaultDisplayManager::WantToDraw() { |
+ if (draw_timer_.IsRunning() || frame_pending_) |
return; |
- auto qualified_id = mojo::SurfaceId::New(); |
- qualified_id->id_namespace = id_namespace_; |
- qualified_id->local = kLocalSurfaceID; |
- native_viewport_->SubmittedFrame(qualified_id.Pass()); |
+ draw_timer_.Start( |
+ FROM_HERE, base::TimeDelta(), |
+ base::Bind(&DefaultDisplayManager::Draw, base::Unretained(this))); |
} |
void DefaultDisplayManager::OnMetricsChanged(mojo::ViewportMetricsPtr metrics) { |
@@ -178,25 +172,10 @@ void DefaultDisplayManager::OnMetricsChanged(mojo::ViewportMetricsPtr metrics) { |
gfx::Rect bounds(metrics_.size.To<gfx::Size>()); |
connection_manager_->root()->SetBounds(bounds); |
connection_manager_->ProcessViewportMetricsChanged(metrics_, *metrics); |
- if (!surface_allocated_) |
- return; |
- surface_->DestroySurface(kLocalSurfaceID); |
- surface_allocated_ = false; |
- SchedulePaint(connection_manager_->root(), bounds); |
native_viewport_->RequestMetrics(base::Bind( |
&DefaultDisplayManager::OnMetricsChanged, weak_factory_.GetWeakPtr())); |
} |
-void DefaultDisplayManager::SetIdNamespace(uint32_t id_namespace) { |
- id_namespace_ = id_namespace; |
- if (surface_allocated_) { |
- auto qualified_id = mojo::SurfaceId::New(); |
- qualified_id->id_namespace = id_namespace_; |
- qualified_id->local = kLocalSurfaceID; |
- native_viewport_->SubmittedFrame(qualified_id.Pass()); |
- } |
-} |
- |
void DefaultDisplayManager::OnConnectionError() { |
// This is called when the native_viewport is torn down before |
// ~DefaultDisplayManager may be called. |