// Copyright (c) 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 CC_PAINT_TRANSFER_CACHE_ENTRY_H_ #define CC_PAINT_TRANSFER_CACHE_ENTRY_H_ #include #include "base/containers/span.h" #include "cc/paint/paint_export.h" class GrContext; namespace cc { // To add a new transfer cache entry type: // - Add a type name to the TransferCacheEntryType enum. // - Implement a ClientTransferCacheEntry and ServiceTransferCacheEntry for // your new type. // - Update ServiceTransferCacheEntry::Create in transfer_cache_entry.cc. enum class TransferCacheEntryType : uint32_t { kRawMemory, kImage, kPaintTypeface, kColorSpace, // Add new entries above this line, make sure to update kLast. kLast = kColorSpace, }; // An interface used on the client to serialize a transfer cache entry // into raw bytes that can be sent to the service. class CC_PAINT_EXPORT ClientTransferCacheEntry { public: virtual ~ClientTransferCacheEntry() {} // Returns the type of this entry. Combined with id, it should form a unique // identifier. virtual TransferCacheEntryType Type() const = 0; // Returns the id of this entry. Combined with type, it should form a unique // identifier. virtual uint32_t Id() const = 0; // Returns the serialized sized of this entry in bytes. This function will be // used to determine how much memory is going to be allocated and passed to // the Serialize() call. virtual size_t SerializedSize() const = 0; // Serializes the entry into the given span of memory. The size of the span is // guaranteed to be at least SerializedSize() bytes. Returns true on success // and false otherwise. virtual bool Serialize(base::span data) const = 0; // Returns the same value as Type() but as a uint32_t to use via // ContextSupport. uint32_t UnsafeType() const { return static_cast(Type()); } }; // An interface which receives the raw data sent by the client and // deserializes it into the appropriate service-side object. class CC_PAINT_EXPORT ServiceTransferCacheEntry { public: static std::unique_ptr Create( TransferCacheEntryType type); // Checks that |raw_type| represents a valid TransferCacheEntryType and // populates |type|. If |raw_type| is not valid, the function returns false // and |type| is not modified. static bool SafeConvertToType(uint32_t raw_type, TransferCacheEntryType* type); virtual ~ServiceTransferCacheEntry() {} // Returns the type of this entry. virtual TransferCacheEntryType Type() const = 0; // Returns the cached size of this entry. This value is used for memory // bookkeeping and to determine whether an unlocked cache entry will be // evicted. virtual size_t CachedSize() const = 0; // Deserialize the cache entry from the given span of memory with the given // context. virtual bool Deserialize(GrContext* context, base::span data) = 0; }; // Helpers to simplify subclassing. template class TransferCacheEntryBase : public Base { public: static constexpr TransferCacheEntryType kType = EntryType; TransferCacheEntryType Type() const final { return kType; } }; template using ClientTransferCacheEntryBase = TransferCacheEntryBase; template using ServiceTransferCacheEntryBase = TransferCacheEntryBase; }; // namespace cc #endif // CC_PAINT_TRANSFER_CACHE_ENTRY_H_