aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-08-13 13:32:39 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-13 13:32:39 -0700
commit8f34372f7e97482e5e61ab298b7edaa008ba2f4c (patch)
tree48581497c1bcfb3420c6aba6c6fe27d344f96855 /src/gpu
parent5a16cf654548190841b5af27af04e7995582ad7b (diff)
Extend SkImageGenerator to support natively generated GrTextures. As part of this, added uniqueID() to the generator, and made it be in the same namespace is bitmaps, pixelrefs, images.
To do this, create SkImageCacherator, which wraps a generator and provides an interface to get a cached answer for either the raster or texture output of the generator. BUG=skia: Review URL: https://codereview.chromium.org/1291803002
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/SkGr.cpp76
-rw-r--r--src/gpu/SkGrPriv.h32
2 files changed, 99 insertions, 9 deletions
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 53f640b601..6c1ec4bed0 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -143,7 +143,7 @@ static bool make_stretched_key(const GrUniqueKey& origKey, const Stretch& stretc
uint32_t width = SkToU16(stretch.fWidth);
uint32_t height = SkToU16(stretch.fHeight);
static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
- GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 3);
+ GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 2);
builder[0] = stretch.fType;
builder[1] = width | (height << 16);
builder.finish();
@@ -153,22 +153,55 @@ static bool make_stretched_key(const GrUniqueKey& origKey, const Stretch& stretc
return false;
}
-static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) {
- // Our id includes the offset, width, and height so that bitmaps created by extractSubset()
- // are unique.
- uint32_t genID = bitmap.getGenerationID();
- SkIPoint origin = bitmap.pixelRefOrigin();
- uint32_t width = SkToU16(bitmap.width());
- uint32_t height = SkToU16(bitmap.height());
+static void make_unstretched_key(GrUniqueKey* key, uint32_t imageID,
+ U16CPU width, U16CPU height, SkIPoint origin) {
+ SkASSERT((uint16_t)width == width);
+ SkASSERT((uint16_t)height == height);
static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
GrUniqueKey::Builder builder(key, kDomain, 4);
- builder[0] = genID;
+ builder[0] = imageID;
builder[1] = origin.fX;
builder[2] = origin.fY;
builder[3] = width | (height << 16);
}
+void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID,
+ U16CPU width, U16CPU height, SkIPoint origin,
+ const GrCaps& caps, SkImageUsageType usage) {
+ const Stretch::Type stretches[] = {
+ Stretch::kNone_Type, // kUntiled_SkImageUsageType
+ Stretch::kNearest_Type, // kTiled_Unfiltered_SkImageUsageType
+ Stretch::kBilerp_Type, // kTiled_Filtered_SkImageUsageType
+ };
+
+ const bool isPow2 = SkIsPow2(width) && SkIsPow2(height);
+ const bool needToStretch = !isPow2 &&
+ usage != kUntiled_SkImageUsageType &&
+ !caps.npotTextureTileSupport();
+
+ if (needToStretch) {
+ GrUniqueKey tmpKey;
+ make_unstretched_key(&tmpKey, imageID, width, height, origin);
+
+ Stretch stretch;
+ stretch.fType = stretches[usage];
+ stretch.fWidth = SkNextPow2(width);
+ stretch.fHeight = SkNextPow2(height);
+ if (!make_stretched_key(tmpKey, stretch, key)) {
+ goto UNSTRETCHED;
+ }
+ } else {
+ UNSTRETCHED:
+ make_unstretched_key(key, imageID, width, height, origin);
+ }
+}
+
+static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) {
+ make_unstretched_key(key, bitmap.getGenerationID(), bitmap.width(), bitmap.height(),
+ bitmap.pixelRefOrigin());
+}
+
static void make_bitmap_keys(const SkBitmap& bitmap,
const Stretch& stretch,
GrUniqueKey* key,
@@ -649,6 +682,31 @@ GrTexture* GrRefCachedBitmapTexture(GrContext* ctx,
return NULL;
}
+
+// TODO: make this be the canonical signature, and turn the version that takes GrTextureParams*
+// into a wrapper that contains the inverse of these tables.
+GrTexture* GrRefCachedBitmapTexture(GrContext* ctx,
+ const SkBitmap& bitmap,
+ SkImageUsageType usage) {
+ // Just need a params that will trigger the correct cache key / etc, since the usage doesn't
+ // tell us the specifics about filter level or specific tiling.
+
+ const SkShader::TileMode tiles[] = {
+ SkShader::kClamp_TileMode, // kUntiled_SkImageUsageType
+ SkShader::kRepeat_TileMode, // kTiled_Unfiltered_SkImageUsageType
+ SkShader::kRepeat_TileMode, // kTiled_Filtered_SkImageUsageType
+ };
+
+ const GrTextureParams::FilterMode filters[] = {
+ GrTextureParams::kNone_FilterMode, // kUntiled_SkImageUsageType
+ GrTextureParams::kNone_FilterMode, // kTiled_Unfiltered_SkImageUsageType
+ GrTextureParams::kBilerp_FilterMode, // kTiled_Filtered_SkImageUsageType
+ };
+
+ GrTextureParams params(tiles[usage], filters[usage]);
+ return GrRefCachedBitmapTexture(ctx, bitmap, &params);
+}
+
///////////////////////////////////////////////////////////////////////////////
// alphatype is ignore for now, but if GrPixelConfig is expanded to encompass
diff --git a/src/gpu/SkGrPriv.h b/src/gpu/SkGrPriv.h
new file mode 100644
index 0000000000..4688adb045
--- /dev/null
+++ b/src/gpu/SkGrPriv.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkGrPriv_DEFINED
+#define SkGrPriv_DEFINED
+
+#include "GrTypes.h"
+#include "SkPoint.h"
+
+class GrCaps;
+class GrUniqueKey;
+
+/**
+ * Our key includes the offset, width, and height so that bitmaps created by extractSubset()
+ * are unique.
+ *
+ * The imageID is in the shared namespace (see SkNextID::ImageID()
+ * - SkBitmap/SkPixelRef
+ * - SkImage
+ * - SkImageGenerator
+ *
+ * Note: width/height must fit in 16bits for this impl.
+ */
+void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID,
+ U16CPU width, U16CPU height, SkIPoint origin,
+ const GrCaps&, SkImageUsageType);
+
+#endif