Commit 1e1bdbbd authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Fix HUD location and size when displaying the FPS meter

The author of https://crrev.com/588577 did not realize the HUD layer
could be used for non-full-viewport rect debug information such as the
FPS meter. This patch restores the non-rect size logic from
https://crrev.com/588577 and adds a test of the FPS meter size.

Bug: 894717
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: Ied6d6c80e396ab59dbc201994db5214ed1db09a0
Reviewed-on: https://chromium-review.googlesource.com/c/1277658Reviewed-by: default avatarenne <enne@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599282}
parent b72f17d0
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/trace_event/trace_event.h" #include "base/trace_event/trace_event.h"
#include "cc/layers/heads_up_display_layer_impl.h" #include "cc/layers/heads_up_display_layer_impl.h"
#include "cc/trees/layer_tree_host.h"
namespace cc { namespace cc {
...@@ -27,6 +28,32 @@ HeadsUpDisplayLayer::HeadsUpDisplayLayer() ...@@ -27,6 +28,32 @@ HeadsUpDisplayLayer::HeadsUpDisplayLayer()
HeadsUpDisplayLayer::~HeadsUpDisplayLayer() = default; HeadsUpDisplayLayer::~HeadsUpDisplayLayer() = default;
void HeadsUpDisplayLayer::UpdateLocationAndSize(
const gfx::Size& device_viewport,
float device_scale_factor) {
gfx::Size device_viewport_in_layout_pixels =
gfx::Size(device_viewport.width() / device_scale_factor,
device_viewport.height() / device_scale_factor);
gfx::Size bounds;
gfx::Transform matrix;
matrix.MakeIdentity();
if (layer_tree_host()->GetDebugState().ShowHudRects()) {
bounds = device_viewport_in_layout_pixels;
} else {
// If the HUD is not displaying full-viewport rects (e.g., it is showing the
// FPS meter), use a fixed size.
constexpr int kDefaultHUDSize = 256;
bounds.SetSize(kDefaultHUDSize, kDefaultHUDSize);
matrix.Translate(device_viewport_in_layout_pixels.width() - kDefaultHUDSize,
0.0);
}
SetBounds(bounds);
SetTransform(matrix);
}
bool HeadsUpDisplayLayer::HasDrawableContent() const { bool HeadsUpDisplayLayer::HasDrawableContent() const {
return true; return true;
} }
......
...@@ -20,6 +20,9 @@ class CC_EXPORT HeadsUpDisplayLayer : public Layer { ...@@ -20,6 +20,9 @@ class CC_EXPORT HeadsUpDisplayLayer : public Layer {
public: public:
static scoped_refptr<HeadsUpDisplayLayer> Create(); static scoped_refptr<HeadsUpDisplayLayer> Create();
void UpdateLocationAndSize(const gfx::Size& device_viewport,
float device_scale_factor);
std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
// Layer overrides. // Layer overrides.
......
...@@ -82,5 +82,24 @@ class HudWithRootLayerChange : public HeadsUpDisplayTest { ...@@ -82,5 +82,24 @@ class HudWithRootLayerChange : public HeadsUpDisplayTest {
SINGLE_AND_MULTI_THREAD_TEST_F(HudWithRootLayerChange); SINGLE_AND_MULTI_THREAD_TEST_F(HudWithRootLayerChange);
class HeadsUpDisplaySizeWithFPS : public LayerTreeTest {
public:
void InitializeSettings(LayerTreeSettings* settings) override {
settings->initial_debug_state.show_fps_counter = true;
}
void BeginTest() override { PostSetNeedsCommitToMainThread(); }
void DidCommit() override {
ASSERT_TRUE(layer_tree_host()->hud_layer());
EXPECT_EQ(gfx::Size(256, 256), layer_tree_host()->hud_layer()->bounds());
EndTest();
}
void AfterTest() override {}
};
SINGLE_AND_MULTI_THREAD_TEST_F(HeadsUpDisplaySizeWithFPS);
} // namespace } // namespace
} // namespace cc } // namespace cc
...@@ -1412,14 +1412,10 @@ void LayerTreeHost::UpdateHudLayer(bool show_hud_info) { ...@@ -1412,14 +1412,10 @@ void LayerTreeHost::UpdateHudLayer(bool show_hud_info) {
if (show_hud_info) { if (show_hud_info) {
if (!hud_layer_.get()) if (!hud_layer_.get())
hud_layer_ = HeadsUpDisplayLayer::Create(); hud_layer_ = HeadsUpDisplayLayer::Create();
gfx::Size device_viewport_in_layout_pixels =
gfx::Size(device_viewport_size_.width() / device_scale_factor_,
device_viewport_size_.height() / device_scale_factor_);
hud_layer_->SetBounds(device_viewport_in_layout_pixels);
if (root_layer_.get() && !hud_layer_->parent()) if (root_layer_.get() && !hud_layer_->parent())
root_layer_->AddChild(hud_layer_); root_layer_->AddChild(hud_layer_);
hud_layer_->UpdateLocationAndSize(device_viewport_size_,
device_scale_factor_);
} else if (hud_layer_.get()) { } else if (hud_layer_.get()) {
hud_layer_->RemoveFromParent(); hud_layer_->RemoveFromParent();
hud_layer_ = nullptr; hud_layer_ = nullptr;
......
...@@ -470,8 +470,8 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient { ...@@ -470,8 +470,8 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient {
void SetElasticOverscrollFromImplSide(gfx::Vector2dF elastic_overscroll); void SetElasticOverscrollFromImplSide(gfx::Vector2dF elastic_overscroll);
gfx::Vector2dF elastic_overscroll() const { return elastic_overscroll_; } gfx::Vector2dF elastic_overscroll() const { return elastic_overscroll_; }
// Ensures a HUD layer exists if it is needed, and updates the layer bounds. // Ensures a HUD layer exists if it is needed, and updates the HUD bounds and
// If a HUD layer exists but is no longer needed, it is destroyed. // position. If a HUD layer exists but is no longer needed, it is destroyed.
void UpdateHudLayer(bool show_hud_info); void UpdateHudLayer(bool show_hud_info);
HeadsUpDisplayLayer* hud_layer() const { return hud_layer_.get(); } HeadsUpDisplayLayer* hud_layer() const { return hud_layer_.get(); }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment