Migrate gpu resource methods to GrDirectContext
Cut & paste job
Change-Id: I92e7d1ca5fdf7a7f9961b77a6088f06ed401cc2a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/325616
Auto-Submit: Adlai Holler <adlai@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/include/gpu/GrDirectContext.h b/include/gpu/GrDirectContext.h
index 06037b1..9ec2f86 100644
--- a/include/gpu/GrDirectContext.h
+++ b/include/gpu/GrDirectContext.h
@@ -202,7 +202,77 @@
*/
void setResourceCacheLimit(size_t maxResourceBytes);
- void freeGpuResources() override;
+ /**
+ * Frees GPU created by the context. Can be called to reduce GPU memory
+ * pressure.
+ */
+ void freeGpuResources();
+
+ /**
+ * Purge GPU resources that haven't been used in the past 'msNotUsed' milliseconds or are
+ * otherwise marked for deletion, regardless of whether the context is under budget.
+ */
+ void performDeferredCleanup(std::chrono::milliseconds msNotUsed);
+
+ // Temporary compatibility API for Android.
+ void purgeResourcesNotUsedInMs(std::chrono::milliseconds msNotUsed) {
+ this->performDeferredCleanup(msNotUsed);
+ }
+
+ /**
+ * Purge unlocked resources from the cache until the the provided byte count has been reached
+ * or we have purged all unlocked resources. The default policy is to purge in LRU order, but
+ * can be overridden to prefer purging scratch resources (in LRU order) prior to purging other
+ * resource types.
+ *
+ * @param maxBytesToPurge the desired number of bytes to be purged.
+ * @param preferScratchResources If true scratch resources will be purged prior to other
+ * resource types.
+ */
+ void purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources);
+
+ /**
+ * This entry point is intended for instances where an app has been backgrounded or
+ * suspended.
+ * If 'scratchResourcesOnly' is true all unlocked scratch resources will be purged but the
+ * unlocked resources with persistent data will remain. If 'scratchResourcesOnly' is false
+ * then all unlocked resources will be purged.
+ * In either case, after the unlocked resources are purged a separate pass will be made to
+ * ensure that resource usage is under budget (i.e., even if 'scratchResourcesOnly' is true
+ * some resources with persistent data may be purged to be under budget).
+ *
+ * @param scratchResourcesOnly If true only unlocked scratch resources will be purged prior
+ * enforcing the budget requirements.
+ */
+ void purgeUnlockedResources(bool scratchResourcesOnly);
+
+ /**
+ * Gets the maximum supported texture size.
+ */
+ using GrRecordingContext::maxTextureSize;
+
+ /**
+ * Gets the maximum supported render target size.
+ */
+ using GrRecordingContext::maxRenderTargetSize;
+
+ /**
+ * Can a SkImage be created with the given color type.
+ */
+ using GrRecordingContext::colorTypeSupportedAsImage;
+
+ /**
+ * Can a SkSurface be created with the given color type. To check whether MSAA is supported
+ * use maxSurfaceSampleCountForColorType().
+ */
+ using GrRecordingContext::colorTypeSupportedAsSurface;
+
+ /**
+ * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
+ * rendering is supported for the color type. 0 is returned if rendering to this color type
+ * is not supported at all.
+ */
+ using GrRecordingContext::maxSurfaceSampleCountForColorType;
protected:
GrDirectContext(GrBackendApi backend, const GrContextOptions& options);
diff --git a/include/private/GrContext.h b/include/private/GrContext.h
index d768fb7..92c5eea 100644
--- a/include/private/GrContext.h
+++ b/include/private/GrContext.h
@@ -57,78 +57,6 @@
public:
~GrContext() override;
- /**
- * Frees GPU created by the context. Can be called to reduce GPU memory
- * pressure.
- */
- virtual void freeGpuResources();
-
- /**
- * Purge GPU resources that haven't been used in the past 'msNotUsed' milliseconds or are
- * otherwise marked for deletion, regardless of whether the context is under budget.
- */
- void performDeferredCleanup(std::chrono::milliseconds msNotUsed);
-
- // Temporary compatibility API for Android.
- void purgeResourcesNotUsedInMs(std::chrono::milliseconds msNotUsed) {
- this->performDeferredCleanup(msNotUsed);
- }
-
- /**
- * Purge unlocked resources from the cache until the the provided byte count has been reached
- * or we have purged all unlocked resources. The default policy is to purge in LRU order, but
- * can be overridden to prefer purging scratch resources (in LRU order) prior to purging other
- * resource types.
- *
- * @param maxBytesToPurge the desired number of bytes to be purged.
- * @param preferScratchResources If true scratch resources will be purged prior to other
- * resource types.
- */
- void purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources);
-
- /**
- * This entry point is intended for instances where an app has been backgrounded or
- * suspended.
- * If 'scratchResourcesOnly' is true all unlocked scratch resources will be purged but the
- * unlocked resources with persistent data will remain. If 'scratchResourcesOnly' is false
- * then all unlocked resources will be purged.
- * In either case, after the unlocked resources are purged a separate pass will be made to
- * ensure that resource usage is under budget (i.e., even if 'scratchResourcesOnly' is true
- * some resources with persistent data may be purged to be under budget).
- *
- * @param scratchResourcesOnly If true only unlocked scratch resources will be purged prior
- * enforcing the budget requirements.
- */
- void purgeUnlockedResources(bool scratchResourcesOnly);
-
- /**
- * Gets the maximum supported texture size.
- */
- using GrRecordingContext::maxTextureSize;
-
- /**
- * Gets the maximum supported render target size.
- */
- using GrRecordingContext::maxRenderTargetSize;
-
- /**
- * Can a SkImage be created with the given color type.
- */
- using GrRecordingContext::colorTypeSupportedAsImage;
-
- /**
- * Can a SkSurface be created with the given color type. To check whether MSAA is supported
- * use maxSurfaceSampleCountForColorType().
- */
- using GrRecordingContext::colorTypeSupportedAsSurface;
-
- /**
- * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
- * rendering is supported for the color type. 0 is returned if rendering to this color type
- * is not supported at all.
- */
- using GrRecordingContext::maxSurfaceSampleCountForColorType;
-
///////////////////////////////////////////////////////////////////////////
// Misc.
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 2788aae..183cd59 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -54,74 +54,6 @@
GrContext::~GrContext() = default;
-//////////////////////////////////////////////////////////////////////////////
-
-void GrContext::freeGpuResources() {
- ASSERT_SINGLE_OWNER
-
- if (this->abandoned()) {
- return;
- }
-
- // TODO: the glyph cache doesn't hold any GpuResources so this call should not be needed here.
- // Some slack in the GrTextBlob's implementation requires it though. That could be fixed.
- fStrikeCache->freeAll();
-
- this->drawingManager()->freeGpuResources();
-
- fResourceCache->purgeAllUnlocked();
-}
-
-void GrContext::purgeUnlockedResources(bool scratchResourcesOnly) {
- ASSERT_SINGLE_OWNER
-
- if (this->abandoned()) {
- return;
- }
-
- fResourceCache->purgeUnlockedResources(scratchResourcesOnly);
- fResourceCache->purgeAsNeeded();
-
- // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
- // place to purge stale blobs
- this->getTextBlobCache()->purgeStaleBlobs();
-}
-
-void GrContext::performDeferredCleanup(std::chrono::milliseconds msNotUsed) {
- TRACE_EVENT0("skia.gpu", TRACE_FUNC);
-
- ASSERT_SINGLE_OWNER
-
- if (this->abandoned()) {
- return;
- }
-
- this->checkAsyncWorkCompletion();
- fMappedBufferManager->process();
- auto purgeTime = GrStdSteadyClock::now() - msNotUsed;
-
- fResourceCache->purgeAsNeeded();
- fResourceCache->purgeResourcesNotUsedSince(purgeTime);
-
- if (auto ccpr = this->drawingManager()->getCoverageCountingPathRenderer()) {
- ccpr->purgeCacheEntriesOlderThan(this->proxyProvider(), purgeTime);
- }
-
- // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
- // place to purge stale blobs
- this->getTextBlobCache()->purgeStaleBlobs();
-}
-
-void GrContext::purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources) {
- ASSERT_SINGLE_OWNER
-
- if (this->abandoned()) {
- return;
- }
-
- fResourceCache->purgeUnlockedResources(bytesToPurge, preferScratchResources);
-}
-
size_t GrContext::ComputeImageSize(sk_sp<SkImage> image, GrMipmapped mipMapped, bool useNextPow2) {
if (!image->isTextureBacked()) {
return 0;
diff --git a/src/gpu/GrDirectContext.cpp b/src/gpu/GrDirectContext.cpp
index dcdcc47..f2e8f3f 100644
--- a/src/gpu/GrDirectContext.cpp
+++ b/src/gpu/GrDirectContext.cpp
@@ -13,10 +13,12 @@
#include "src/gpu/GrClientMappedBufferManager.h"
#include "src/gpu/GrContextPriv.h"
#include "src/gpu/GrContextThreadSafeProxyPriv.h"
+#include "src/gpu/GrDrawingManager.h"
#include "src/gpu/GrGpu.h"
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/GrShaderUtils.h"
+#include "src/gpu/ccpr/GrCoverageCountingPathRenderer.h"
#include "src/gpu/effects/GrSkSLFP.h"
#include "src/gpu/gl/GrGLGpu.h"
#include "src/gpu/mock/GrMockGpu.h"
@@ -150,13 +152,25 @@
}
void GrDirectContext::freeGpuResources() {
+ ASSERT_SINGLE_OWNER
+
+ if (this->abandoned()) {
+ return;
+ }
+
this->flushAndSubmit();
if (fSmallPathAtlasMgr) {
fSmallPathAtlasMgr->reset();
}
fAtlasManager->freeAll();
- INHERITED::freeGpuResources();
+ // TODO: the glyph cache doesn't hold any GpuResources so this call should not be needed here.
+ // Some slack in the GrTextBlob's implementation requires it though. That could be fixed.
+ fStrikeCache->freeAll();
+
+ this->drawingManager()->freeGpuResources();
+
+ fResourceCache->purgeAllUnlocked();
}
bool GrDirectContext::init() {
@@ -266,6 +280,57 @@
fResourceCache->setLimit(maxResourceBytes);
}
+void GrDirectContext::purgeUnlockedResources(bool scratchResourcesOnly) {
+ ASSERT_SINGLE_OWNER
+
+ if (this->abandoned()) {
+ return;
+ }
+
+ fResourceCache->purgeUnlockedResources(scratchResourcesOnly);
+ fResourceCache->purgeAsNeeded();
+
+ // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
+ // place to purge stale blobs
+ this->getTextBlobCache()->purgeStaleBlobs();
+}
+
+void GrDirectContext::performDeferredCleanup(std::chrono::milliseconds msNotUsed) {
+ TRACE_EVENT0("skia.gpu", TRACE_FUNC);
+
+ ASSERT_SINGLE_OWNER
+
+ if (this->abandoned()) {
+ return;
+ }
+
+ this->checkAsyncWorkCompletion();
+ fMappedBufferManager->process();
+ auto purgeTime = GrStdSteadyClock::now() - msNotUsed;
+
+ fResourceCache->purgeAsNeeded();
+ fResourceCache->purgeResourcesNotUsedSince(purgeTime);
+
+ if (auto ccpr = this->drawingManager()->getCoverageCountingPathRenderer()) {
+ ccpr->purgeCacheEntriesOlderThan(this->proxyProvider(), purgeTime);
+ }
+
+ // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
+ // place to purge stale blobs
+ this->getTextBlobCache()->purgeStaleBlobs();
+}
+
+void GrDirectContext::purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources) {
+ ASSERT_SINGLE_OWNER
+
+ if (this->abandoned()) {
+ return;
+ }
+
+ fResourceCache->purgeUnlockedResources(bytesToPurge, preferScratchResources);
+}
+
+
GrSmallPathAtlasMgr* GrDirectContext::onGetSmallPathAtlasMgr() {
if (!fSmallPathAtlasMgr) {
fSmallPathAtlasMgr = std::make_unique<GrSmallPathAtlasMgr>();