2012-08-08 10:42:44 +00:00
|
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*
|
2012-08-23 18:09:54 +00:00
|
|
|
|
* 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
|
|
|
|
|
* <EFBFBD>dimensions<EFBFBD> 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
|
2012-08-08 10:42:44 +00:00
|
|
|
|
* private IDs.
|
|
|
|
|
*
|
|
|
|
|
* The domain portion identifies the cache client while the type field
|
2012-08-23 18:09:54 +00:00
|
|
|
|
* indicates the resource type. When the public portion indicates that the
|
2012-08-08 10:42:44 +00:00
|
|
|
|
* 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)
|
2012-08-13 17:47:59 +00:00
|
|
|
|
, fDomain(GrCacheData::kScratch_ResourceDomain)
|
2012-08-08 10:42:44 +00:00
|
|
|
|
, 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
|