1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBackendTextureImageGenerator_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define GrBackendTextureImageGenerator_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrRecordingContext.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMutex.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTextureGenerator.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ResourceKey.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrSemaphore; 22*c8dee2aaSAndroid Build Coastguard Worker class GrTexture; 23*c8dee2aaSAndroid Build Coastguard Worker class SkColorInfo; 24*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 25*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int; 26*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 27*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 28*c8dee2aaSAndroid Build Coastguard Worker enum class GrImageTexGenPolicy : int; 29*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 32*c8dee2aaSAndroid Build Coastguard Worker class RefCntedCallback; 33*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool; 34*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker /* 37*c8dee2aaSAndroid Build Coastguard Worker * This ImageGenerator is used to wrap a texture in one GrContext and can then be used as a source 38*c8dee2aaSAndroid Build Coastguard Worker * in another GrContext. It holds onto a semaphore which the producing GrContext will signal and the 39*c8dee2aaSAndroid Build Coastguard Worker * consuming GrContext will wait on before using the texture. Only one GrContext can ever be used 40*c8dee2aaSAndroid Build Coastguard Worker * as a consumer (this is mostly because Vulkan can't allow multiple things to wait on the same 41*c8dee2aaSAndroid Build Coastguard Worker * semaphore). 42*c8dee2aaSAndroid Build Coastguard Worker * 43*c8dee2aaSAndroid Build Coastguard Worker * In practice, this capability is used by clients to create backend-specific texture resources in 44*c8dee2aaSAndroid Build Coastguard Worker * one thread (with, say, GrContext-A) and then ship them over to another GrContext (say, 45*c8dee2aaSAndroid Build Coastguard Worker * GrContext-B) which will then use the texture as a source for draws. GrContext-A uses the 46*c8dee2aaSAndroid Build Coastguard Worker * semaphore to notify GrContext-B when the shared texture is ready to use. 47*c8dee2aaSAndroid Build Coastguard Worker */ 48*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTextureImageGenerator : public GrTextureGenerator { 49*c8dee2aaSAndroid Build Coastguard Worker public: 50*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<GrTextureGenerator> Make(const sk_sp<GrTexture>&, GrSurfaceOrigin, 51*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrSemaphore>, SkColorType, 52*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType, sk_sp<SkColorSpace>); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker ~GrBackendTextureImageGenerator() override; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker protected: onIsValid(GrRecordingContext * context)57*c8dee2aaSAndroid Build Coastguard Worker bool onIsValid(GrRecordingContext* context) const override { 58*c8dee2aaSAndroid Build Coastguard Worker if (context && context->abandoned()) { 59*c8dee2aaSAndroid Build Coastguard Worker return false; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker return true; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker bool onIsProtected() const override; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView onGenerateTexture(GrRecordingContext*, 66*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo&, 67*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped, 68*c8dee2aaSAndroid Build Coastguard Worker GrImageTexGenPolicy) override; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker private: 71*c8dee2aaSAndroid Build Coastguard Worker GrBackendTextureImageGenerator(const SkColorInfo&, 72*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<GrTexture>&, 73*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 74*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::DirectContextID owningContextID, 75*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrSemaphore>); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker static void ReleaseRefHelper_TextureReleaseProc(void* ctx); 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker class RefHelper : public SkNVRefCnt<RefHelper> { 80*c8dee2aaSAndroid Build Coastguard Worker public: 81*c8dee2aaSAndroid Build Coastguard Worker RefHelper(sk_sp<GrTexture>, 82*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::DirectContextID owningContextID, 83*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrSemaphore>); 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker ~RefHelper(); 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> fOriginalTexture; 88*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::DirectContextID fOwningContextID; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker // We use this key so that we don't rewrap the GrBackendTexture in a GrTexture for each 91*c8dee2aaSAndroid Build Coastguard Worker // proxy created from this generator for a particular borrowing context. 92*c8dee2aaSAndroid Build Coastguard Worker skgpu::UniqueKey fBorrowedTextureKey; 93*c8dee2aaSAndroid Build Coastguard Worker // There is no ref associated with this pointer. We rely on our atomic bookkeeping with the 94*c8dee2aaSAndroid Build Coastguard Worker // context ID to know when this pointer is valid and safe to use. This is used to make sure 95*c8dee2aaSAndroid Build Coastguard Worker // all uses of the wrapped texture are finished on the borrowing context before we open 96*c8dee2aaSAndroid Build Coastguard Worker // this back up to other contexts. In general a ref to this release proc is owned by all 97*c8dee2aaSAndroid Build Coastguard Worker // proxies and gpu uses of the backend texture. 98*c8dee2aaSAndroid Build Coastguard Worker skgpu::RefCntedCallback* fBorrowingContextReleaseProc; 99*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::DirectContextID fBorrowingContextID; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrSemaphore> fSemaphore; 102*c8dee2aaSAndroid Build Coastguard Worker }; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker RefHelper* fRefHelper; 105*c8dee2aaSAndroid Build Coastguard Worker // This Mutex is used to guard the borrowing of the texture to one GrContext at a time as well 106*c8dee2aaSAndroid Build Coastguard Worker // as the creation of the fBorrowingContextReleaseProc. The latter happening if two threads with 107*c8dee2aaSAndroid Build Coastguard Worker // the same consuming GrContext try to generate a texture at the same time. 108*c8dee2aaSAndroid Build Coastguard Worker SkMutex fBorrowingMutex; 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture fBackendTexture; 111*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin fSurfaceOrigin; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrTextureGenerator; 114*c8dee2aaSAndroid Build Coastguard Worker }; 115*c8dee2aaSAndroid Build Coastguard Worker #endif // GrBackendTextureImageGenerator_DEFINED 116