mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The raw pointer isn't a reliable id as the allocator can reuse an address that's just been released for another layer. This will fix Fuchsia bug FL-216. This problem was not affecting non-Fuchsia Flutter probably because non-Fuchsia Flutter purges the raster cache key much more frequently so we won't see a key collision. In Fuchsia, as the key has to wait for the Vulkan surface to render asynchronously, this suddenly becomes an issue.
65 lines
1.8 KiB
C++
65 lines
1.8 KiB
C++
// Copyright 2013 The Flutter 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 FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|
|
#define FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|
|
|
|
#include <unordered_map>
|
|
#include "flutter/flow/matrix_decomposition.h"
|
|
#include "flutter/fml/logging.h"
|
|
|
|
namespace flutter {
|
|
|
|
template <typename ID>
|
|
class RasterCacheKey {
|
|
public:
|
|
RasterCacheKey(ID id, const SkMatrix& ctm) : id_(id), matrix_(ctm) {
|
|
matrix_[SkMatrix::kMTransX] = SkScalarFraction(ctm.getTranslateX());
|
|
matrix_[SkMatrix::kMTransY] = SkScalarFraction(ctm.getTranslateY());
|
|
#ifndef SUPPORT_FRACTIONAL_TRANSLATION
|
|
FML_DCHECK(matrix_.getTranslateX() == 0 && matrix_.getTranslateY() == 0);
|
|
#endif
|
|
}
|
|
|
|
ID id() const { return id_; }
|
|
const SkMatrix& matrix() const { return matrix_; }
|
|
|
|
struct Hash {
|
|
uint32_t operator()(RasterCacheKey const& key) const {
|
|
return std::hash<ID>()(key.id_);
|
|
}
|
|
};
|
|
|
|
struct Equal {
|
|
constexpr bool operator()(const RasterCacheKey& lhs,
|
|
const RasterCacheKey& rhs) const {
|
|
return lhs.id_ == rhs.id_ && lhs.matrix_ == rhs.matrix_;
|
|
}
|
|
};
|
|
|
|
template <class Value>
|
|
using Map = std::unordered_map<RasterCacheKey, Value, Hash, Equal>;
|
|
|
|
private:
|
|
ID id_;
|
|
|
|
// ctm where only fractional (0-1) translations are preserved:
|
|
// matrix_ = ctm;
|
|
// matrix_[SkMatrix::kMTransX] = SkScalarFraction(ctm.getTranslateX());
|
|
// matrix_[SkMatrix::kMTransY] = SkScalarFraction(ctm.getTranslateY());
|
|
SkMatrix matrix_;
|
|
};
|
|
|
|
// The ID is the uint32_t picture uniqueID
|
|
using PictureRasterCacheKey = RasterCacheKey<uint32_t>;
|
|
|
|
class Layer;
|
|
|
|
// The ID is the uint64_t layer unique_id
|
|
using LayerRasterCacheKey = RasterCacheKey<uint64_t>;
|
|
|
|
} // namespace flutter
|
|
|
|
#endif // FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|