diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkImageCacherator.cpp | 1 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrBitmapTextureMaker.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrTextureAdjuster.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrTextureMaker.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrTextureProvider.h | 178 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 1 | ||||
-rw-r--r-- | src/gpu/effects/GrTextureStripAtlas.cpp | 1 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 1 |
9 files changed, 186 insertions, 0 deletions
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp index f36af3f259..17cac1b4ee 100644 --- a/src/core/SkImageCacherator.cpp +++ b/src/core/SkImageCacherator.cpp @@ -22,6 +22,7 @@ #include "GrImageTextureMaker.h" #include "GrResourceKey.h" #include "GrSamplerParams.h" +#include "GrTextureProvider.h" #include "GrYUVProvider.h" #include "SkGr.h" #include "SkGrPriv.h" diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index dcc34295a4..2ee942d316 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -23,6 +23,7 @@ #include "GrFragmentProcessor.h" #include "GrShaderCaps.h" #include "GrStyle.h" +#include "GrTextureProvider.h" #include "GrTextureProxy.h" #include "effects/GrSimpleTextureEffect.h" #include "glsl/GrGLSLFragmentProcessor.h" diff --git a/src/gpu/GrBitmapTextureMaker.cpp b/src/gpu/GrBitmapTextureMaker.cpp index 9d577cdcd1..cff052fa53 100644 --- a/src/gpu/GrBitmapTextureMaker.cpp +++ b/src/gpu/GrBitmapTextureMaker.cpp @@ -9,6 +9,7 @@ #include "GrContext.h" #include "GrGpuResourcePriv.h" +#include "GrTextureProvider.h" #include "SkBitmap.h" #include "SkGrPriv.h" #include "SkPixelRef.h" diff --git a/src/gpu/GrTextureAdjuster.cpp b/src/gpu/GrTextureAdjuster.cpp index 0c9c23ed07..27f8d6db9a 100644 --- a/src/gpu/GrTextureAdjuster.cpp +++ b/src/gpu/GrTextureAdjuster.cpp @@ -11,6 +11,7 @@ #include "GrGpu.h" #include "GrGpuResourcePriv.h" #include "GrTexture.h" +#include "GrTextureProvider.h" #include "SkGrPriv.h" GrTextureAdjuster::GrTextureAdjuster(GrTexture* original, SkAlphaType alphaType, diff --git a/src/gpu/GrTextureMaker.cpp b/src/gpu/GrTextureMaker.cpp index e68703afa1..ac89af7d87 100644 --- a/src/gpu/GrTextureMaker.cpp +++ b/src/gpu/GrTextureMaker.cpp @@ -9,6 +9,7 @@ #include "GrContext.h" #include "GrGpu.h" +#include "GrTextureProvider.h" GrTexture* GrTextureMaker::refTextureForParams(const GrSamplerParams& params, SkColorSpace* dstColorSpace, diff --git a/src/gpu/GrTextureProvider.h b/src/gpu/GrTextureProvider.h new file mode 100644 index 0000000000..dd139cc0e7 --- /dev/null +++ b/src/gpu/GrTextureProvider.h @@ -0,0 +1,178 @@ +/* + * 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 GrTextureProvider_DEFINED +#define GrTextureProvider_DEFINED + +#include "GrTexture.h" +#include "GrTypes.h" + +class GrSingleOwner; + +class SK_API GrTextureProvider { +public: + /////////////////////////////////////////////////////////////////////////// + // Textures + + /** + * Creates a new texture in the resource cache and returns it. The caller owns a + * ref on the returned texture which must be balanced by a call to unref. + * + * @param desc Description of the texture properties. + * @param budgeted Does the texture count against the resource cache budget? + * @param texels A contiguous array of mipmap levels + * @param mipLevelCount The amount of elements in the texels array + */ + GrTexture* createMipMappedTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, + const GrMipLevel* texels, int mipLevelCount, + uint32_t flags = 0); + + /** + * This function is a shim which creates a SkTArray<GrMipLevel> of size 1. + * It then calls createTexture with that SkTArray. + * + * @param srcData Pointer to the pixel values (optional). + * @param rowBytes The number of bytes between rows of the texture. Zero + * implies tightly packed rows. For compressed pixel configs, this + * field is ignored. + */ + GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, const void* srcData, + size_t rowBytes, uint32_t flags = 0); + + /** Shortcut for creating a texture with no initial data to upload. */ + GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, uint32_t flags = 0) { + return this->createTexture(desc, budgeted, nullptr, 0, flags); + } + + /** Assigns a unique key to the texture. The texture will be findable via this key using + findTextureByUniqueKey(). If an existing texture has this key, it's key will be removed. */ + void assignUniqueKeyToTexture(const GrUniqueKey& key, GrTexture* texture) { + SkASSERT(key.isValid()); + this->assignUniqueKeyToResource(key, texture); + } + + /** Finds a texture by unique key. If the texture is found it is ref'ed and returned. */ + GrTexture* findAndRefTextureByUniqueKey(const GrUniqueKey& key); + + /** + * Determines whether a texture is associated with the unique key. If the texture is found it + * will not be locked or returned. This call does not affect the priority of the resource for + * deletion. + */ + bool existsTextureWithUniqueKey(const GrUniqueKey& key) const { + return this->existsResourceWithUniqueKey(key); + } + + /** + * Finds a texture that approximately matches the descriptor. Will be at least as large in width + * and height as desc specifies. If desc specifies that the texture should be a render target + * then result will be a render target. Format and sample count will always match the request. + * The contents of the texture are undefined. The caller owns a ref on the returned texture and + * must balance with a call to unref. + */ + GrTexture* createApproxTexture(const GrSurfaceDesc&, uint32_t flags = 0); + + /** Legacy function that no longer should be used. */ + enum ScratchTexMatch { + kExact_ScratchTexMatch, + kApprox_ScratchTexMatch + }; + GrTexture* refScratchTexture(const GrSurfaceDesc& desc, ScratchTexMatch match, uint32_t flags) { + if (kApprox_ScratchTexMatch == match) { + return this->createApproxTexture(desc, flags); + } else { + return this->createTexture(desc, SkBudgeted::kYes, flags); + } + } + + /////////////////////////////////////////////////////////////////////////// + // Wrapped Backend Surfaces + + /** + * Wraps an existing texture with a GrTexture object. + * + * OpenGL: if the object is a texture Gr may change its GL texture params + * when it is drawn. + * + * @return GrTexture object or NULL on failure. + */ + sk_sp<GrTexture> wrapBackendTexture(const GrBackendTextureDesc& desc, + GrWrapOwnership = kBorrow_GrWrapOwnership); + + /** + * Wraps an existing render target with a GrRenderTarget object. It is + * similar to wrapBackendTexture but can be used to draw into surfaces + * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that + * the client will resolve to a texture). Currently wrapped render targets + * always use the kBorrow_GrWrapOwnership semantics. + * + * @return GrRenderTarget object or NULL on failure. + */ + sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc); + + static const int kMinScratchTextureSize; + +protected: + GrTextureProvider(GrGpu* gpu, GrResourceCache* cache, GrSingleOwner* singleOwner); + + /** + * Assigns a unique key to a resource. If the key is associated with another resource that + * association is removed and replaced by this resource. + */ + void assignUniqueKeyToResource(const GrUniqueKey&, GrGpuResource*); + + /** + * Finds a resource in the cache, based on the specified key. This is intended for use in + * conjunction with addResourceToCache(). The return value will be NULL if not found. The + * caller must balance with a call to unref(). + */ + GrGpuResource* findAndRefResourceByUniqueKey(const GrUniqueKey&); + + /** + * Determines whether a resource is in the cache. If the resource is found it + * will not be locked or returned. This call does not affect the priority of + * the resource for deletion. + */ + bool existsResourceWithUniqueKey(const GrUniqueKey& key) const; + + enum ScratchTextureFlags { + kExact_ScratchTextureFlag = 0x1, + kNoPendingIO_ScratchTextureFlag = 0x2, // (http://skbug.com/4156) + kNoCreate_ScratchTextureFlag = 0x4, + kLastScratchTextureFlag = kNoCreate_ScratchTextureFlag + }; + + /** A common impl for GrTextureProvider and GrResourceProvider variants. */ + GrTexture* internalCreateApproxTexture(const GrSurfaceDesc& desc, uint32_t scratchTextureFlags); + + GrTexture* refScratchTexture(const GrSurfaceDesc&, uint32_t scratchTextureFlags); + + void abandon() { + fCache = NULL; + fGpu = NULL; + } + + GrResourceCache* cache() { return fCache; } + const GrResourceCache* cache() const { return fCache; } + + GrGpu* gpu() { return fGpu; } + const GrGpu* gpu() const { return fGpu; } + + bool isAbandoned() const { + SkASSERT(SkToBool(fGpu) == SkToBool(fCache)); + return !SkToBool(fCache); + } + +private: + GrResourceCache* fCache; + GrGpu* fGpu; + + // In debug builds we guard against improper thread handling + SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;) +}; + +#endif diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index b685723970..6eaba4c7fe 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -14,6 +14,7 @@ #include "GrGpuResourcePriv.h" #include "GrRenderTargetContext.h" #include "GrTexturePriv.h" +#include "GrTextureProvider.h" #include "GrTextureProxy.h" #include "GrTypes.h" #include "GrXferProcessor.h" diff --git a/src/gpu/effects/GrTextureStripAtlas.cpp b/src/gpu/effects/GrTextureStripAtlas.cpp index f49830481b..1791b20e70 100644 --- a/src/gpu/effects/GrTextureStripAtlas.cpp +++ b/src/gpu/effects/GrTextureStripAtlas.cpp @@ -10,6 +10,7 @@ #include "GrContextPriv.h" #include "GrResourceProvider.h" #include "GrSurfaceContext.h" +#include "GrTextureProvider.h" #include "SkGr.h" #include "SkPixelRef.h" #include "SkTSearch.h" diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 33d17bc644..88d18893d7 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -19,6 +19,7 @@ #include "GrRenderTargetContext.h" #include "GrTextureAdjuster.h" #include "GrTexturePriv.h" +#include "GrTextureProvider.h" #include "GrTextureProxy.h" #include "effects/GrYUVEffect.h" #include "SkCanvas.h" |