1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 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 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrImageContext_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrImageContext_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SingleOwner.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrContext_Base.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class GrContextThreadSafeProxy; 17*c8dee2aaSAndroid Build Coastguard Worker class GrImageContextPriv; 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker // This is now just a view on a ThreadSafeProxy, that SkImages can attempt to 20*c8dee2aaSAndroid Build Coastguard Worker // downcast to a GrDirectContext as a backdoor to some operations. Once we remove the backdoors, 21*c8dee2aaSAndroid Build Coastguard Worker // this goes away and SkImages just hold ThreadSafeProxies. 22*c8dee2aaSAndroid Build Coastguard Worker class GrImageContext : public GrContext_Base { 23*c8dee2aaSAndroid Build Coastguard Worker public: 24*c8dee2aaSAndroid Build Coastguard Worker ~GrImageContext() override; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker // Provides access to functions that aren't part of the public API. 27*c8dee2aaSAndroid Build Coastguard Worker GrImageContextPriv priv(); 28*c8dee2aaSAndroid Build Coastguard Worker const GrImageContextPriv priv() const; // NOLINT(readability-const-return-type) 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker protected: 31*c8dee2aaSAndroid Build Coastguard Worker friend class GrImageContextPriv; // for hidden functions 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker GrImageContext(sk_sp<GrContextThreadSafeProxy>); 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker SK_API virtual void abandonContext(); 36*c8dee2aaSAndroid Build Coastguard Worker SK_API virtual bool abandoned(); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker /** This is only useful for debug purposes */ singleOwner()39*c8dee2aaSAndroid Build Coastguard Worker skgpu::SingleOwner* singleOwner() const { return &fSingleOwner; } 40*c8dee2aaSAndroid Build Coastguard Worker asImageContext()41*c8dee2aaSAndroid Build Coastguard Worker GrImageContext* asImageContext() override { return this; } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker private: 44*c8dee2aaSAndroid Build Coastguard Worker // When making promise images, we currently need a placeholder GrImageContext instance to give 45*c8dee2aaSAndroid Build Coastguard Worker // to the SkImage that has no real power, just a wrapper around the ThreadSafeProxy. 46*c8dee2aaSAndroid Build Coastguard Worker // TODO: De-power SkImage to ThreadSafeProxy or at least figure out a way to share one instance. 47*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<GrImageContext> MakeForPromiseImage(sk_sp<GrContextThreadSafeProxy>); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker // In debug builds we guard against improper thread handling 50*c8dee2aaSAndroid Build Coastguard Worker // This guard is passed to the GrDrawingManager and, from there to all the 51*c8dee2aaSAndroid Build Coastguard Worker // GrSurfaceDrawContexts. It is also passed to the GrResourceProvider and SkGpuDevice. 52*c8dee2aaSAndroid Build Coastguard Worker // TODO: Move this down to GrRecordingContext. 53*c8dee2aaSAndroid Build Coastguard Worker mutable skgpu::SingleOwner fSingleOwner; 54*c8dee2aaSAndroid Build Coastguard Worker }; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker #endif 57