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 GrContextThreadSafeProxy_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrContextThreadSafeProxy_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <atomic> 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 20*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormat; 23*c8dee2aaSAndroid Build Coastguard Worker class GrCaps; 24*c8dee2aaSAndroid Build Coastguard Worker class GrContextThreadSafeProxyPriv; 25*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceCharacterization; 26*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafeCache; 27*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafePipelineBuilder; 28*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps; 29*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 30*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType; 31*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu { class TextBlobRedrawCoordinator; } 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker /** 36*c8dee2aaSAndroid Build Coastguard Worker * Can be used to perform actions related to the generating GrContext in a thread safe manner. The 37*c8dee2aaSAndroid Build Coastguard Worker * proxy does not access the 3D API (e.g. OpenGL) that backs the generating GrContext. 38*c8dee2aaSAndroid Build Coastguard Worker */ 39*c8dee2aaSAndroid Build Coastguard Worker class SK_API GrContextThreadSafeProxy : public SkNVRefCnt<GrContextThreadSafeProxy> { 40*c8dee2aaSAndroid Build Coastguard Worker public: 41*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrContextThreadSafeProxy(); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** 44*c8dee2aaSAndroid Build Coastguard Worker * Create a surface characterization for a DDL that will be replayed into the GrContext 45*c8dee2aaSAndroid Build Coastguard Worker * that created this proxy. On failure the resulting characterization will be invalid (i.e., 46*c8dee2aaSAndroid Build Coastguard Worker * "!c.isValid()"). 47*c8dee2aaSAndroid Build Coastguard Worker * 48*c8dee2aaSAndroid Build Coastguard Worker * @param cacheMaxResourceBytes The max resource bytes limit that will be in effect 49*c8dee2aaSAndroid Build Coastguard Worker * when the DDL created with this characterization is 50*c8dee2aaSAndroid Build Coastguard Worker * replayed. 51*c8dee2aaSAndroid Build Coastguard Worker * Note: the contract here is that the DDL will be 52*c8dee2aaSAndroid Build Coastguard Worker * created as if it had a full 'cacheMaxResourceBytes' 53*c8dee2aaSAndroid Build Coastguard Worker * to use. If replayed into a GrContext that already has 54*c8dee2aaSAndroid Build Coastguard Worker * locked GPU memory, the replay can exceed the budget. 55*c8dee2aaSAndroid Build Coastguard Worker * To rephrase, all resource allocation decisions are 56*c8dee2aaSAndroid Build Coastguard Worker * made at record time and at playback time the budget 57*c8dee2aaSAndroid Build Coastguard Worker * limits will be ignored. 58*c8dee2aaSAndroid Build Coastguard Worker * @param ii The image info specifying properties of the SkSurface 59*c8dee2aaSAndroid Build Coastguard Worker * that the DDL created with this characterization will 60*c8dee2aaSAndroid Build Coastguard Worker * be replayed into. 61*c8dee2aaSAndroid Build Coastguard Worker * Note: Ganesh doesn't make use of the SkImageInfo's 62*c8dee2aaSAndroid Build Coastguard Worker * alphaType 63*c8dee2aaSAndroid Build Coastguard Worker * @param backendFormat Information about the format of the GPU surface that 64*c8dee2aaSAndroid Build Coastguard Worker * will back the SkSurface upon replay 65*c8dee2aaSAndroid Build Coastguard Worker * @param sampleCount The sample count of the SkSurface that the DDL 66*c8dee2aaSAndroid Build Coastguard Worker * created with this characterization will be replayed 67*c8dee2aaSAndroid Build Coastguard Worker * into 68*c8dee2aaSAndroid Build Coastguard Worker * @param origin The origin of the SkSurface that the DDL created with 69*c8dee2aaSAndroid Build Coastguard Worker * this characterization will be replayed into 70*c8dee2aaSAndroid Build Coastguard Worker * @param surfaceProps The surface properties of the SkSurface that the DDL 71*c8dee2aaSAndroid Build Coastguard Worker * created with this characterization will be replayed 72*c8dee2aaSAndroid Build Coastguard Worker * into 73*c8dee2aaSAndroid Build Coastguard Worker * @param isMipmapped Will the surface the DDL will be replayed into have 74*c8dee2aaSAndroid Build Coastguard Worker * space allocated for mipmaps? 75*c8dee2aaSAndroid Build Coastguard Worker * @param willUseGLFBO0 Will the surface the DDL will be replayed into be 76*c8dee2aaSAndroid Build Coastguard Worker * backed by GL FBO 0. This flag is only valid if using 77*c8dee2aaSAndroid Build Coastguard Worker * an GL backend. 78*c8dee2aaSAndroid Build Coastguard Worker * @param isTextureable Will the surface be able to act as a texture? 79*c8dee2aaSAndroid Build Coastguard Worker * @param isProtected Will the (Vulkan) surface be DRM protected? 80*c8dee2aaSAndroid Build Coastguard Worker * @param vkRTSupportsInputAttachment Can the vulkan surface be used as in input 81*c8dee2aaSAndroid Build Coastguard Worker attachment? 82*c8dee2aaSAndroid Build Coastguard Worker * @param forVulkanSecondaryCommandBuffer Will the surface be wrapping a vulkan secondary 83*c8dee2aaSAndroid Build Coastguard Worker * command buffer via a GrVkSecondaryCBDrawContext? If 84*c8dee2aaSAndroid Build Coastguard Worker * this is true then the following is required: 85*c8dee2aaSAndroid Build Coastguard Worker * isTexureable = false 86*c8dee2aaSAndroid Build Coastguard Worker * isMipmapped = false 87*c8dee2aaSAndroid Build Coastguard Worker * willUseGLFBO0 = false 88*c8dee2aaSAndroid Build Coastguard Worker * vkRTSupportsInputAttachment = false 89*c8dee2aaSAndroid Build Coastguard Worker */ 90*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceCharacterization createCharacterization( 91*c8dee2aaSAndroid Build Coastguard Worker size_t cacheMaxResourceBytes, 92*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& ii, 93*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat, 94*c8dee2aaSAndroid Build Coastguard Worker int sampleCount, 95*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin, 96*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps& surfaceProps, 97*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped isMipmapped, 98*c8dee2aaSAndroid Build Coastguard Worker bool willUseGLFBO0 = false, 99*c8dee2aaSAndroid Build Coastguard Worker bool isTextureable = true, 100*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected isProtected = GrProtected::kNo, 101*c8dee2aaSAndroid Build Coastguard Worker bool vkRTSupportsInputAttachment = false, 102*c8dee2aaSAndroid Build Coastguard Worker bool forVulkanSecondaryCommandBuffer = false); 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker /* 105*c8dee2aaSAndroid Build Coastguard Worker * Retrieve the default GrBackendFormat for a given SkColorType and renderability. 106*c8dee2aaSAndroid Build Coastguard Worker * It is guaranteed that this backend format will be the one used by the following 107*c8dee2aaSAndroid Build Coastguard Worker * SkColorType and GrSurfaceCharacterization-based createBackendTexture methods. 108*c8dee2aaSAndroid Build Coastguard Worker * 109*c8dee2aaSAndroid Build Coastguard Worker * The caller should check that the returned format is valid. 110*c8dee2aaSAndroid Build Coastguard Worker */ 111*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat defaultBackendFormat(SkColorType ct, GrRenderable renderable) const; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker /** 114*c8dee2aaSAndroid Build Coastguard Worker * Retrieve the GrBackendFormat for a given SkTextureCompressionType. This is 115*c8dee2aaSAndroid Build Coastguard Worker * guaranteed to match the backend format used by the following 116*c8dee2aaSAndroid Build Coastguard Worker * createCompressedBackendTexture methods that take a CompressionType. 117*c8dee2aaSAndroid Build Coastguard Worker * 118*c8dee2aaSAndroid Build Coastguard Worker * The caller should check that the returned format is valid. 119*c8dee2aaSAndroid Build Coastguard Worker */ 120*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat compressedBackendFormat(SkTextureCompressionType c) const; 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker /** 123*c8dee2aaSAndroid Build Coastguard Worker * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA 124*c8dee2aaSAndroid Build Coastguard Worker * rendering is supported for the color type. 0 is returned if rendering to this color type 125*c8dee2aaSAndroid Build Coastguard Worker * is not supported at all. 126*c8dee2aaSAndroid Build Coastguard Worker */ 127*c8dee2aaSAndroid Build Coastguard Worker int maxSurfaceSampleCountForColorType(SkColorType colorType) const; 128*c8dee2aaSAndroid Build Coastguard Worker isValid()129*c8dee2aaSAndroid Build Coastguard Worker bool isValid() const { return nullptr != fCaps; } 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const GrContextThreadSafeProxy& that) const { 132*c8dee2aaSAndroid Build Coastguard Worker // Each GrContext should only ever have a single thread-safe proxy. 133*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((this == &that) == (this->fContextID == that.fContextID)); 134*c8dee2aaSAndroid Build Coastguard Worker return this == &that; 135*c8dee2aaSAndroid Build Coastguard Worker } 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const GrContextThreadSafeProxy& that) const { return !(*this == that); } 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker // Provides access to functions that aren't part of the public API. 140*c8dee2aaSAndroid Build Coastguard Worker GrContextThreadSafeProxyPriv priv(); 141*c8dee2aaSAndroid Build Coastguard Worker const GrContextThreadSafeProxyPriv priv() const; // NOLINT(readability-const-return-type) 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker protected: 144*c8dee2aaSAndroid Build Coastguard Worker // DDL TODO: need to add unit tests for backend & maybe options 145*c8dee2aaSAndroid Build Coastguard Worker GrContextThreadSafeProxy(GrBackendApi, const GrContextOptions&); 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker private: 148*c8dee2aaSAndroid Build Coastguard Worker friend class GrContextThreadSafeProxyPriv; // for ctor and hidden methods 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker void abandonContext(); 151*c8dee2aaSAndroid Build Coastguard Worker bool abandoned() const; 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker // TODO: This should be part of the constructor but right now we have a chicken-and-egg problem 154*c8dee2aaSAndroid Build Coastguard Worker // with GrContext where we get the caps by creating a GPU which requires a context (see the 155*c8dee2aaSAndroid Build Coastguard Worker // `init` method on GrContext_Base). 156*c8dee2aaSAndroid Build Coastguard Worker void init(sk_sp<const GrCaps>, sk_sp<GrThreadSafePipelineBuilder>); 157*c8dee2aaSAndroid Build Coastguard Worker 158*c8dee2aaSAndroid Build Coastguard Worker virtual bool isValidCharacterizationForVulkan(sk_sp<const GrCaps>, 159*c8dee2aaSAndroid Build Coastguard Worker bool isTextureable, 160*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped isMipmapped, 161*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected isProtected, 162*c8dee2aaSAndroid Build Coastguard Worker bool vkRTSupportsInputAttachment, 163*c8dee2aaSAndroid Build Coastguard Worker bool forVulkanSecondaryCommandBuffer); 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker const GrBackendApi fBackend; 166*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions fOptions; 167*c8dee2aaSAndroid Build Coastguard Worker const uint32_t fContextID; 168*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrCaps> fCaps; 169*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<sktext::gpu::TextBlobRedrawCoordinator> fTextBlobRedrawCoordinator; 170*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrThreadSafeCache> fThreadSafeCache; 171*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrThreadSafePipelineBuilder> fPipelineBuilder; 172*c8dee2aaSAndroid Build Coastguard Worker std::atomic<bool> fAbandoned{false}; 173*c8dee2aaSAndroid Build Coastguard Worker }; 174*c8dee2aaSAndroid Build Coastguard Worker 175*c8dee2aaSAndroid Build Coastguard Worker #endif 176