|  | /* | 
|  | * Copyright 2019 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef GrRecordingContextPriv_DEFINED | 
|  | #define GrRecordingContextPriv_DEFINED | 
|  |  | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkTypes.h" | 
|  | #include "include/gpu/GrRecordingContext.h" | 
|  | #include "src/gpu/RefCntedCallback.h" | 
|  | #include "src/gpu/ganesh/Device_v1.h" | 
|  | #include "src/gpu/ganesh/GrImageContextPriv.h" | 
|  | #include "src/text/gpu/SDFTControl.h" | 
|  |  | 
|  | class GrImageInfo; | 
|  | class SkDeferredDisplayList; | 
|  | namespace skgpu { | 
|  | class Swizzle; | 
|  | } | 
|  | namespace skgpu::ganesh { | 
|  | class SurfaceContext; | 
|  | class SurfaceFillContext; | 
|  | }  // namespace skgpu::ganesh | 
|  |  | 
|  | /** Class that exposes methods on GrRecordingContext that are only intended for use internal to | 
|  | Skia. This class is purely a privileged window into GrRecordingContext. It should never have | 
|  | additional data members or virtual methods. */ | 
|  | class GrRecordingContextPriv : public GrImageContextPriv { | 
|  | public: | 
|  | GrRecordingContext* context() { return static_cast<GrRecordingContext*>(fContext); } | 
|  | const GrRecordingContext* context() const { | 
|  | return static_cast<const GrRecordingContext*>(fContext); | 
|  | } | 
|  |  | 
|  | GrProxyProvider* proxyProvider() { return this->context()->proxyProvider(); } | 
|  | const GrProxyProvider* proxyProvider() const { return this->context()->proxyProvider(); } | 
|  |  | 
|  | GrDrawingManager* drawingManager() { return this->context()->drawingManager(); } | 
|  |  | 
|  | SkArenaAlloc* recordTimeAllocator() { return this->context()->arenas().recordTimeAllocator(); } | 
|  | sktext::gpu::SubRunAllocator* recordTimeSubRunAllocator() { | 
|  | return this->context()->arenas().recordTimeSubRunAllocator(); | 
|  | } | 
|  | GrRecordingContext::Arenas arenas() { return this->context()->arenas(); } | 
|  |  | 
|  | GrRecordingContext::OwnedArenas&& detachArenas() { return this->context()->detachArenas(); } | 
|  |  | 
|  | void recordProgramInfo(const GrProgramInfo* programInfo) { | 
|  | this->context()->recordProgramInfo(programInfo); | 
|  | } | 
|  |  | 
|  | void detachProgramData(skia_private::TArray<GrRecordingContext::ProgramData>* dst) { | 
|  | this->context()->detachProgramData(dst); | 
|  | } | 
|  |  | 
|  | sktext::gpu::TextBlobRedrawCoordinator* getTextBlobCache() { | 
|  | return this->context()->getTextBlobRedrawCoordinator(); | 
|  | } | 
|  |  | 
|  | GrThreadSafeCache* threadSafeCache() { return this->context()->threadSafeCache(); } | 
|  |  | 
|  | void moveRenderTasksToDDL(SkDeferredDisplayList*); | 
|  |  | 
|  | /** | 
|  | * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.) | 
|  | * | 
|  | * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to | 
|  | * ensure its lifetime is tied to that of the context. | 
|  | */ | 
|  | void addOnFlushCallbackObject(GrOnFlushCallbackObject*); | 
|  |  | 
|  | GrAuditTrail* auditTrail() { return this->context()->fAuditTrail.get(); } | 
|  |  | 
|  | #if GR_TEST_UTILS | 
|  | // Used by tests that intentionally exercise codepaths that print warning messages, in order to | 
|  | // not confuse users with output that looks like a testing failure. | 
|  | class AutoSuppressWarningMessages { | 
|  | public: | 
|  | AutoSuppressWarningMessages(GrRecordingContext* context) : fContext(context) { | 
|  | ++fContext->fSuppressWarningMessages; | 
|  | } | 
|  | ~AutoSuppressWarningMessages() { | 
|  | --fContext->fSuppressWarningMessages; | 
|  | } | 
|  | private: | 
|  | GrRecordingContext* fContext; | 
|  | }; | 
|  | void incrSuppressWarningMessages() { ++this->context()->fSuppressWarningMessages; } | 
|  | void decrSuppressWarningMessages() { --this->context()->fSuppressWarningMessages; } | 
|  | #endif | 
|  |  | 
|  | void printWarningMessage(const char* msg) const { | 
|  | #if GR_TEST_UTILS | 
|  | if (this->context()->fSuppressWarningMessages > 0) { | 
|  | return; | 
|  | } | 
|  | #endif | 
|  | SkDebugf("%s", msg); | 
|  | } | 
|  |  | 
|  | GrRecordingContext::Stats* stats() { | 
|  | return &this->context()->fStats; | 
|  | } | 
|  |  | 
|  | #if GR_GPU_STATS && GR_TEST_UTILS | 
|  | using DMSAAStats = GrRecordingContext::DMSAAStats; | 
|  | DMSAAStats& dmsaaStats() { return this->context()->fDMSAAStats; } | 
|  | #endif | 
|  |  | 
|  | sktext::gpu::SDFTControl getSDFTControl(bool useSDFTForSmallText) const; | 
|  |  | 
|  | /** | 
|  | * Create a GrRecordingContext without a resource cache | 
|  | */ | 
|  | static sk_sp<GrRecordingContext> MakeDDL(sk_sp<GrContextThreadSafeProxy>); | 
|  |  | 
|  | sk_sp<skgpu::ganesh::Device> createDevice(GrColorType, | 
|  | sk_sp<GrSurfaceProxy>, | 
|  | sk_sp<SkColorSpace>, | 
|  | GrSurfaceOrigin, | 
|  | const SkSurfaceProps&, | 
|  | skgpu::ganesh::Device::InitContents); | 
|  | sk_sp<skgpu::ganesh::Device> createDevice(skgpu::Budgeted, | 
|  | const SkImageInfo&, | 
|  | SkBackingFit, | 
|  | int sampleCount, | 
|  | skgpu::Mipmapped, | 
|  | skgpu::Protected, | 
|  | GrSurfaceOrigin, | 
|  | const SkSurfaceProps&, | 
|  | skgpu::ganesh::Device::InitContents); | 
|  |  | 
|  | // If the passed in GrSurfaceProxy is renderable this will return a SurfaceDrawContext, | 
|  | // otherwise it will return a SurfaceContext. | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceContext> makeSC(GrSurfaceProxyView readView, | 
|  | const GrColorInfo&); | 
|  |  | 
|  | // Makes either a SurfaceContext, SurfaceFillContext, or a SurfaceDrawContext, depending on | 
|  | // GrRenderable and the GrImageInfo. | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceContext> makeSC( | 
|  | const GrImageInfo&, | 
|  | const GrBackendFormat&, | 
|  | std::string_view label, | 
|  | SkBackingFit = SkBackingFit::kExact, | 
|  | GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, | 
|  | skgpu::Renderable = skgpu::Renderable::kNo, | 
|  | int renderTargetSampleCnt = 1, | 
|  | skgpu::Mipmapped = skgpu::Mipmapped::kNo, | 
|  | skgpu::Protected = skgpu::Protected::kNo, | 
|  | skgpu::Budgeted = skgpu::Budgeted::kYes); | 
|  |  | 
|  | /** | 
|  | * Uses GrImageInfo's color type to pick the default texture format. Will return a | 
|  | * SurfaceDrawContext if possible. | 
|  | */ | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceFillContext> makeSFC( | 
|  | GrImageInfo, | 
|  | std::string_view label, | 
|  | SkBackingFit = SkBackingFit::kExact, | 
|  | int sampleCount = 1, | 
|  | skgpu::Mipmapped = skgpu::Mipmapped::kNo, | 
|  | skgpu::Protected = skgpu::Protected::kNo, | 
|  | GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, | 
|  | skgpu::Budgeted = skgpu::Budgeted::kYes); | 
|  |  | 
|  | /** | 
|  | * Makes a custom configured SurfaceFillContext where the caller specifies the specific | 
|  | * texture format and swizzles. The color type will be kUnknown. Returns a SurfaceDrawContext | 
|  | * if possible. | 
|  | */ | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceFillContext> makeSFC(SkAlphaType, | 
|  | sk_sp<SkColorSpace>, | 
|  | SkISize dimensions, | 
|  | SkBackingFit, | 
|  | const GrBackendFormat&, | 
|  | int sampleCount, | 
|  | skgpu::Mipmapped, | 
|  | skgpu::Protected, | 
|  | skgpu::Swizzle readSwizzle, | 
|  | skgpu::Swizzle writeSwizzle, | 
|  | GrSurfaceOrigin, | 
|  | skgpu::Budgeted, | 
|  | std::string_view label); | 
|  |  | 
|  | /** | 
|  | * Like the above but uses GetFallbackColorTypeAndFormat to find a fallback color type (and | 
|  | * compatible format) if the passed GrImageInfo's color type is not renderable. | 
|  | */ | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceFillContext> makeSFCWithFallback( | 
|  | GrImageInfo, | 
|  | SkBackingFit = SkBackingFit::kExact, | 
|  | int sampleCount = 1, | 
|  | skgpu::Mipmapped = skgpu::Mipmapped::kNo, | 
|  | skgpu::Protected = skgpu::Protected::kNo, | 
|  | GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, | 
|  | skgpu::Budgeted = skgpu::Budgeted::kYes); | 
|  |  | 
|  | /** | 
|  | * Creates a SurfaceFillContext from an existing GrBackendTexture. The GrColorInfo's color | 
|  | * type must be compatible with backend texture's format or this will fail. All formats are | 
|  | * considered compatible with kUnknown. Returns a SurfaceDrawContext if possible. | 
|  | */ | 
|  | std::unique_ptr<skgpu::ganesh::SurfaceFillContext> makeSFCFromBackendTexture( | 
|  | GrColorInfo, | 
|  | const GrBackendTexture&, | 
|  | int sampleCount, | 
|  | GrSurfaceOrigin, | 
|  | sk_sp<skgpu::RefCntedCallback> releaseHelper); | 
|  |  | 
|  | protected: | 
|  | explicit GrRecordingContextPriv(GrRecordingContext* rContext) : GrImageContextPriv(rContext) {} | 
|  |  | 
|  | private: | 
|  | GrRecordingContextPriv(const GrRecordingContextPriv&) = delete; | 
|  | GrRecordingContextPriv& operator=(const GrRecordingContextPriv&) = delete; | 
|  |  | 
|  | // No taking addresses of this type. | 
|  | const GrRecordingContextPriv* operator&() const; | 
|  | GrRecordingContextPriv* operator&(); | 
|  |  | 
|  | friend class GrRecordingContext; // to construct/copy this type. | 
|  |  | 
|  | using INHERITED = GrImageContextPriv; | 
|  | }; | 
|  |  | 
|  | inline GrRecordingContextPriv GrRecordingContext::priv() { return GrRecordingContextPriv(this); } | 
|  |  | 
|  | inline const GrRecordingContextPriv GrRecordingContext::priv () const {  // NOLINT(readability-const-return-type) | 
|  | return GrRecordingContextPriv(const_cast<GrRecordingContext*>(this)); | 
|  | } | 
|  |  | 
|  | #endif |