/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrCacheID_DEFINED #define GrCacheID_DEFINED #include "GrTypes.h" /////////////////////////////////////////////////////////////////////////////// #define GR_DECLARE_RESOURCE_CACHE_TYPE() \ static int8_t GetResourceType(); #define GR_DEFINE_RESOURCE_CACHE_TYPE(ClassName) \ int8_t ClassName::GetResourceType() { \ static int8_t kResourceTypeID = 0; \ if (0 == kResourceTypeID) { \ kResourceTypeID = GrCacheID::GetNextResourceType(); \ } \ return kResourceTypeID; \ } /////////////////////////////////////////////////////////////////////////////// #define GR_DECLARE_RESOURCE_CACHE_DOMAIN(AccessorName) \ static int8_t AccessorName(); #define GR_DEFINE_RESOURCE_CACHE_DOMAIN(ClassName, AccessorName) \ int8_t ClassName::AccessorName() { \ static int8_t kDomainID = 0; \ if (0 == kDomainID) { \ kDomainID = GrCacheID::GetNextDomain(); \ } \ return kDomainID; \ } /** * The cache ID adds structure to the IDs used for caching GPU resources. It * is broken into three portions: * the public portion - which is filled in by Skia clients * the private portion - which is used by the cache (domain & type) * the resource-specific portion - which is filled in by each GrResource- * derived class. * * For the public portion each client of the cache makes up its own * unique-per-resource identifier (e.g., bitmap genID). A public ID of * 'kScratch_CacheID' indicates that the resource is a "scratch" resource. * When used to acquire a resource it indicates the cache user is * looking for a resource that matches a resource-subclass-specific set of * “dimensions” such as width, height, buffer size, or pixel config, but not * for particular resource contents (e.g., texel or vertex values). The public * IDs are unique within a private ID value but not necessarily across * private IDs. * * The domain portion identifies the cache client while the type field * indicates the resource type. When the public portion indicates that the * resource is a scratch resource, the domain field should be kUnrestricted * so that scratch resources can be recycled across domains. */ class GrCacheID { public: uint64_t fPublicID; uint32_t fResourceSpecific32; uint8_t fDomain; private: uint8_t fResourceType; public: uint16_t fResourceSpecific16; GrCacheID(uint8_t resourceType) : fPublicID(kDefaultPublicCacheID) , fDomain(GrCacheData::kScratch_ResourceDomain) , fResourceType(resourceType) { } void toRaw(uint32_t v[4]); uint8_t getResourceType() const { return fResourceType; } /* * Default value for public portion of GrCacheID */ static const uint64_t kDefaultPublicCacheID = 0; static const uint8_t kInvalid_ResourceType = 0; static uint8_t GetNextDomain(); static uint8_t GetNextResourceType(); }; #endif // GrCacheID_DEFINED