Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: src/core/SkImageCacherator.cpp

Issue 1409163002: Rewrite GrTextureMaker to disentangle bitmap case from base class and give GPU object a say in what… (Closed) Base URL: https://skia.googlesource.com/skia.git@move
Patch Set: tidy Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkImageCacherator.h ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkImageCacherator.cpp
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
index cd5ae57699b2ea52e186b88f4063e37496113bb4..71afc0e68aa7a29608e82ebcc887b10f03f5d10e 100644
--- a/src/core/SkImageCacherator.cpp
+++ b/src/core/SkImageCacherator.cpp
@@ -204,7 +204,9 @@ public:
};
static GrTexture* set_key_and_return(GrTexture* tex, const GrUniqueKey& key) {
- tex->resourcePriv().setUniqueKey(key);
+ if (key.isValid()) {
+ tex->resourcePriv().setUniqueKey(key);
+ }
return tex;
}
@@ -217,24 +219,16 @@ static GrTexture* set_key_and_return(GrTexture* tex, const GrUniqueKey& key) {
* 4. Ask the generator to return YUV planes, which the GPU can convert
* 5. Ask the generator to return RGB(A) data, which the GPU can convert
*/
-GrTexture* SkImageCacherator::lockUnstretchedTexture(GrContext* ctx, const SkImage* client) {
- // textures (at least the texture-key) only support 16bit dimensions, so abort early
- // if we're too big.
- if (fInfo.width() > 0xFFFF || fInfo.height() > 0xFFFF) {
- return nullptr;
- }
-
- GrUniqueKey key;
- const GrTextureParams& noStretchParams = GrTextureParams::ClampNoFilter();
- GrMakeKeyFromImageID(&key, fUniqueID, SkIRect::MakeWH(fInfo.width(), fInfo.height()),
- *ctx->caps(), noStretchParams);
-
+GrTexture* SkImageCacherator::lockTexture(GrContext* ctx, const GrUniqueKey& key,
+ const SkImage* client) {
// 1. Check the cache for a pre-existing one
- if (GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key)) {
- return tex;
+ if (key.isValid()) {
+ if (GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key)) {
+ return tex;
+ }
}
- // 2. Ask the genreator to natively create one
+ // 2. Ask the generator to natively create one
{
ScopedGenerator generator(this);
SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height());
@@ -267,54 +261,64 @@ GrTexture* SkImageCacherator::lockUnstretchedTexture(GrContext* ctx, const SkIma
// 5. Ask the generator to return RGB(A) data, which the GPU can convert
SkBitmap bitmap;
if (this->tryLockAsBitmap(&bitmap, client)) {
- return GrRefCachedBitmapTexture(ctx, bitmap, noStretchParams);
+ GrTexture* tex = GrUploadBitmapToTexture(ctx, bitmap);
+ if (tex) {
+ return set_key_and_return(tex, key);
+ }
}
return nullptr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
-#include "GrTextureMaker.h"
+#include "GrTextureParamsAdjuster.h"
-class Cacherator_GrTextureMaker : public GrTextureMaker {
+class Cacherator_GrTextureParamsAdjuster : public GrTextureParamsAdjuster {
public:
- Cacherator_GrTextureMaker(SkImageCacherator* cacher, const SkImage* client,
- const GrUniqueKey& unstretchedKey)
+ Cacherator_GrTextureParamsAdjuster(SkImageCacherator* cacher, const SkImage* client)
: INHERITED(cacher->info().width(), cacher->info().height())
, fCacher(cacher)
, fClient(client)
- , fUnstretchedKey(unstretchedKey)
- {}
+ {
+ if (client) {
+ GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(),
+ SkIRect::MakeWH(this->width(), this->height()));
+ }
+ }
protected:
+ GrTexture* peekOriginalTexture() override { return nullptr; }
+
// TODO: consider overriding this, for the case where the underlying generator might be
// able to efficiently produce a "stretched" texture natively (e.g. picture-backed)
-// GrTexture* onGenerateStretchedTexture(GrContext*, const SkGrStretch&) override;
+ // GrTexture* generateTextureForParams(GrContext*, const SkGrStretch&) override;
- GrTexture* onRefUnstretchedTexture(GrContext* ctx) override {
- return fCacher->lockUnstretchedTexture(ctx, fClient);
+ GrTexture* refOriginalTexture(GrContext* ctx) override {
+ return fCacher->lockTexture(ctx, fOriginalKey, fClient);
}
- bool onMakeStretchedKey(const SkGrStretch& stretch, GrUniqueKey* stretchedKey) override {
- return GrMakeStretchedKey(fUnstretchedKey, stretch, stretchedKey);
+ void makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) override {
+ if (fOriginalKey.isValid()) {
+ MakeCopyKeyFromOrigKey(fOriginalKey, stretch, paramsCopyKey);
+ }
}
- void onNotifyStretchCached(const GrUniqueKey& stretchedKey) override {
+ void didCacheCopy(const GrUniqueKey& copyKey) override {
if (fClient) {
as_IB(fClient)->notifyAddedToCache();
}
}
- bool onGetROBitmap(SkBitmap* bitmap) override {
+ bool getROBitmap(SkBitmap* bitmap) override {
return fCacher->lockAsBitmap(bitmap, fClient);
}
private:
SkImageCacherator* fCacher;
const SkImage* fClient;
- const GrUniqueKey fUnstretchedKey;
+ GrUniqueKey fOriginalKey;
- typedef GrTextureMaker INHERITED;
+ typedef GrTextureParamsAdjuster INHERITED;
};
GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParams& params,
@@ -323,12 +327,7 @@ GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParam
return nullptr;
}
- GrUniqueKey key;
- GrMakeKeyFromImageID(&key, this->uniqueID(),
- SkIRect::MakeWH(this->info().width(), this->info().height()),
- *ctx->caps(), GrTextureParams::ClampNoFilter());
-
- return Cacherator_GrTextureMaker(this, client, key).refCachedTexture(ctx, params);
+ return Cacherator_GrTextureParamsAdjuster(this, client).refTextureForParams(ctx, params);
}
#else
« no previous file with comments | « src/core/SkImageCacherator.h ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698