blob: e593d7ee3f39d1beecbfb9115f7ca6716d66e6f6 [file] [log] [blame]
/*
* 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