Reland 6914 w/ fixes.
git-svn-id: http://skia.googlecode.com/svn/trunk@6916 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp
index c31d774..eb3a586 100644
--- a/src/gpu/GrTexture.cpp
+++ b/src/gpu/GrTexture.cpp
@@ -15,7 +15,6 @@
#include "GrResourceCache.h"
SK_DEFINE_INST_COUNT(GrTexture)
-GR_DEFINE_RESOURCE_CACHE_TYPE(GrTexture)
/**
* This method allows us to interrupt the normal deletion process and place
@@ -116,97 +115,73 @@
}
}
-// These flags need to fit in <= 8 bits so they can be folded into the texture
+// These flags need to fit in a GrResourceKey::ResourceFlags so they can be folded into the texture
// key
-enum TextureBits {
- /*
- * The kNPOT bit is set when the texture is NPOT and is being repeated
- * but the hardware doesn't support that feature.
+enum TextureFlags {
+ /**
+ * The kStretchToPOT bit is set when the texture is NPOT and is being repeated but the
+ * hardware doesn't support that feature.
*/
- kNPOT_TextureBit = 0x1,
- /*
- * The kFilter bit can only be set when the kNPOT flag is set and indicates
- * whether the resizing of the texture should use filtering. This is
- * to handle cases where the original texture is indexed to disable
- * filtering.
+ kStretchToPOT_TextureFlag = 0x1,
+ /**
+ * The kFilter bit can only be set when the kStretchToPOT flag is set and indicates whether the
+ * stretched texture should be bilerp filtered or point sampled.
*/
- kFilter_TextureBit = 0x2,
- /*
- * The kScratch bit is set if the texture is being used as a scratch
- * texture.
- */
- kScratch_TextureBit = 0x4,
+ kFilter_TextureFlag = 0x2,
};
namespace {
-void gen_texture_key_values(const GrGpu* gpu,
- const GrTextureParams* params,
- const GrTextureDesc& desc,
- const GrCacheData& cacheData,
- bool scratch,
- GrCacheID* cacheID) {
-
- uint64_t clientKey = cacheData.fClientCacheID;
-
- if (scratch) {
- // Instead of a client-provided key of the texture contents
- // we create a key from the descriptor.
- GrAssert(GrCacheData::kScratch_CacheID == clientKey);
- clientKey = (desc.fFlags << 8) | ((uint64_t) desc.fConfig << 32);
- }
-
- cacheID->fPublicID = clientKey;
- cacheID->fDomain = cacheData.fResourceDomain;
-
- // we assume we only need 16 bits of width and height
- // assert that texture creation will fail anyway if this assumption
- // would cause key collisions.
- GrAssert(gpu->getCaps().maxTextureSize() <= SK_MaxU16);
- cacheID->fResourceSpecific32 = desc.fWidth | (desc.fHeight << 16);
-
- GrAssert(desc.fSampleCnt >= 0 && desc.fSampleCnt < 256);
- cacheID->fResourceSpecific16 = desc.fSampleCnt << 8;
-
- if (!gpu->getCaps().npotTextureTileSupport()) {
- bool isPow2 = GrIsPow2(desc.fWidth) && GrIsPow2(desc.fHeight);
-
- bool tiled = NULL != params && params->isTiled();
-
- if (tiled && !isPow2) {
- cacheID->fResourceSpecific16 |= kNPOT_TextureBit;
+GrResourceKey::ResourceFlags get_texture_flags(const GrGpu* gpu,
+ const GrTextureParams* params,
+ const GrTextureDesc& desc) {
+ GrResourceKey::ResourceFlags flags = 0;
+ bool tiled = NULL != params && params->isTiled();
+ if (tiled & !gpu->getCaps().npotTextureTileSupport()) {
+ if (!GrIsPow2(desc.fWidth) || GrIsPow2(desc.fHeight)) {
+ flags |= kStretchToPOT_TextureFlag;
if (params->isBilerp()) {
- cacheID->fResourceSpecific16 |= kFilter_TextureBit;
+ flags |= kFilter_TextureFlag;
}
}
}
+ return flags;
+}
- if (scratch) {
- cacheID->fResourceSpecific16 |= kScratch_TextureBit;
- }
+GrResourceKey::ResourceType texture_resource_type() {
+ static const GrResourceKey::ResourceType gType = GrResourceKey::GenerateResourceType();
+ return gType;
}
}
GrResourceKey GrTexture::ComputeKey(const GrGpu* gpu,
const GrTextureParams* params,
const GrTextureDesc& desc,
- const GrCacheData& cacheData,
- bool scratch) {
- GrCacheID id(GrTexture::GetResourceType());
- gen_texture_key_values(gpu, params, desc, cacheData, scratch, &id);
+ const GrCacheID& cacheID) {
+ GrResourceKey::ResourceFlags flags = get_texture_flags(gpu, params, desc);
+ return GrResourceKey(cacheID, texture_resource_type(), flags);
+}
- uint32_t v[4];
- id.toRaw(v);
- return GrResourceKey(v);
+GrResourceKey GrTexture::ComputeScratchKey(const GrTextureDesc& desc) {
+ GrCacheID::Key idKey;
+ // Instead of a client-provided key of the texture contents we create a key from the
+ // descriptor.
+ GR_STATIC_ASSERT(sizeof(idKey) >= 12);
+ GrAssert(desc.fHeight < (1 << 16));
+ GrAssert(desc.fWidth < (1 << 16));
+ idKey.fData32[0] = (desc.fWidth) | (desc.fHeight << 16);
+ idKey.fData32[1] = desc.fConfig | desc.fSampleCnt << 16;
+ idKey.fData32[2] = desc.fFlags;
+ static const int kPadSize = sizeof(idKey) - 12;
+ memset(idKey.fData8 + 12, 0, kPadSize);
+
+ GrCacheID cacheID(GrResourceKey::ScratchDomain(), idKey);
+ return GrResourceKey(cacheID, texture_resource_type(), 0);
}
bool GrTexture::NeedsResizing(const GrResourceKey& key) {
- return 0 != (key.getValue32(3) & kNPOT_TextureBit);
-}
-
-bool GrTexture::IsScratchTexture(const GrResourceKey& key) {
- return 0 != (key.getValue32(3) & kScratch_TextureBit);
+ return SkToBool(key.getResourceFlags() & kStretchToPOT_TextureFlag);
}
bool GrTexture::NeedsFiltering(const GrResourceKey& key) {
- return 0 != (key.getValue32(3) & kFilter_TextureBit);
+ return SkToBool(key.getResourceFlags() & kFilter_TextureFlag);
}