| Index: components/viz/service/hit_test/hit_test_aggregator.h
|
| diff --git a/components/viz/service/hit_test/hit_test_aggregator.h b/components/viz/service/hit_test/hit_test_aggregator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e03289a12c5b6490c18ac7e12d2208b63411327f
|
| --- /dev/null
|
| +++ b/components/viz/service/hit_test/hit_test_aggregator.h
|
| @@ -0,0 +1,118 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +#define COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +
|
| +#include "cc/surfaces/surface_id.h"
|
| +#include "cc/surfaces/surface_observer.h"
|
| +#include "components/viz/common/display_hit_test_region.h"
|
| +#include "components/viz/service/viz_service_export.h"
|
| +#include "services/viz/public/interfaces/hit_test_region_list.mojom.h"
|
| +
|
| +namespace viz {
|
| +namespace hit_test {
|
| +
|
| +namespace test {
|
| +class HitTestAggregatorTest;
|
| +}
|
| +
|
| +// HitTestAggregator collects HitTestRegionList objects from surfaces and
|
| +// aggregates them into a DisplayHitTesData structue made available in
|
| +// shared memory to enable efficient hit testing across processes.
|
| +//
|
| +// This is intended to be created in the viz or GPU process. For mus+ash this
|
| +// will be true after the mus process split.
|
| +
|
| +class VIZ_SERVICE_EXPORT HitTestAggregator : public cc::SurfaceObserver {
|
| + public:
|
| + HitTestAggregator();
|
| + ~HitTestAggregator();
|
| +
|
| + // Called when HitTestRegionList is submitted along with every call
|
| + // to SubmitCompositorFrame. This is collected in pending_ until
|
| + // surfaces are aggregated and put on the display.
|
| + void SubmitHitTestRegionList(
|
| + hit_test::mojom::HitTestRegionListPtr hit_test_region_list);
|
| +
|
| + // Called after surfaces have been aggregated into the DisplayFrame.
|
| + // In this call HitTestRegionList structures received from active surfaces
|
| + // are aggregated into the DisplayHitTestRegionList structure in
|
| + // shared memory used for event targetting.
|
| + void Aggregate(cc::SurfaceId display_surface_id);
|
| +
|
| + // Performs the work of Aggregate by creating a PostTask so that
|
| + // the work is not directly on the call.
|
| + void PostTaskAggregate(cc::SurfaceId display_surface_id);
|
| +
|
| + // Called at BeginFrame. Swaps buffers in shared memory.
|
| + void Swap();
|
| +
|
| + private:
|
| + friend class test::HitTestAggregatorTest;
|
| +
|
| + // Allocates memory for the DisplayHitTestRegionList Structure.
|
| + void AllocateDisplayHitTestRegionList();
|
| + void AllocateDisplayHitTestRegionList(int length);
|
| +
|
| + // Appends the root element to the DisplayHitTestRegionList structure.
|
| + void AppendRoot(cc::SurfaceId surface_id);
|
| +
|
| + // Appends a region to the DisplayHitTestRegionList structure to recursively
|
| + // build the tree.
|
| + int AppendRegion(DisplayHitTestRegion* regions,
|
| + const hit_test::mojom::HitTestRegionPtr& region,
|
| + int index);
|
| +
|
| + // cc::SurfaceObserver:
|
| + void OnSurfaceCreated(const cc::SurfaceInfo& surface_info) override {}
|
| + void OnSurfaceDestroyed(const cc::SurfaceId& surface_id) override {}
|
| + bool OnSurfaceDamaged(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameAck& ack) override;
|
| + void OnSurfaceDiscarded(const cc::SurfaceId& surface_id) override;
|
| + void OnSurfaceDamageExpected(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameArgs& args) override {}
|
| +
|
| + // Called when a surface has been aggregated and added to the
|
| + // display frame. HitTestRegionList objects are held but ignored until
|
| + // this happens. HitTestRegionList for the surface is copied from |pending_|
|
| + // to |active_| in this method.
|
| + void OnSurfaceWillDraw(const cc::SurfaceId& surface_id) override;
|
| +
|
| + using HitTestRegionListMap =
|
| + std::map<cc::SurfaceId, hit_test::mojom::HitTestRegionListPtr>;
|
| +
|
| + // The collection of received HitTestRegionList objects that have not yet
|
| + // been added to the DisplayFrame (OnSurfaceWillDraw has not been called).
|
| + HitTestRegionListMap pending_;
|
| +
|
| + // The collection of HitTestRegionList objects that have been added to the
|
| + // DisplayFrame (OnSurfaceWillDraw has been called).
|
| + HitTestRegionListMap active_;
|
| +
|
| + // Keeps track of the number of regions in the active list
|
| + // so that we know when we exceed the available length.
|
| + int active_region_count_;
|
| +
|
| + mojo::ScopedSharedBufferHandle read_handle_;
|
| + mojo::ScopedSharedBufferHandle write_handle_;
|
| +
|
| + // The number of elements allocated.
|
| + int read_size_;
|
| + int write_size_;
|
| +
|
| + mojo::ScopedSharedBufferMapping read_buffer_;
|
| + mojo::ScopedSharedBufferMapping write_buffer_;
|
| +
|
| + // Handles the case when this object is deleted after
|
| + // the PostTaskAggregation call is scheduled but before invocation.
|
| + base::WeakPtrFactory<HitTestAggregator> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HitTestAggregator);
|
| +};
|
| +
|
| +} // namespace hit_test
|
| +} // namespace viz
|
| +
|
| +#endif // COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
|
|