blob: 265cd71377a3a8172eb3cf6cdfe6e874935ebf3d [file] [log] [blame]
/*
* 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/SkBackingFit.h"
#include "src/gpu/ganesh/Device.h"
#include "src/gpu/ganesh/GrImageContextPriv.h"
#include "src/text/gpu/SDFTControl.h"
class GrImageInfo;
class GrDeferredDisplayList;
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(GrDeferredDisplayList*);
/**
* 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 defined(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 defined(GR_TEST_UTILS)
if (this->context()->fSuppressWarningMessages > 0) {
return;
}
#endif
SkDebugf("%s", msg);
}
GrRecordingContext::Stats* stats() {
return &this->context()->fStats;
}
#if GR_GPU_STATS && defined(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,
int sampleCount,
skgpu::Mipmapped,
skgpu::Protected,
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