#include "src/gpu/ganesh/GrProxyProvider.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkData.h"
#include "include/core/SkPixmap.h"
#include "include/core/SkSize.h"
#include "include/core/SkTypes.h"
#include "include/gpu/GpuTypes.h"
#include "include/gpu/ganesh/GrBackendSurface.h"
#include "include/gpu/ganesh/GrContextThreadSafeProxy.h"
#include "include/gpu/ganesh/GrDirectContext.h"
#include "include/private/base/SingleOwner.h"
#include "include/private/gpu/ganesh/GrImageContext.h"
#include "src/core/SkImageInfoPriv.h"
#include "src/core/SkMipmap.h"
#include "src/core/SkTraceEvent.h"
#include "src/gpu/SkBackingFit.h"
#include "src/gpu/Swizzle.h"
#include "src/gpu/ganesh/GrCaps.h"
#include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h"
#include "src/gpu/ganesh/GrDirectContextPriv.h"
#include "src/gpu/ganesh/GrGpuResource.h"
#include "src/gpu/ganesh/GrGpuResourcePriv.h"
#include "src/gpu/ganesh/GrImageContextPriv.h"
#include "src/gpu/ganesh/GrRenderTarget.h"
#include "src/gpu/ganesh/GrRenderTargetProxy.h"
#include "src/gpu/ganesh/GrResourceCache.h"
#include "src/gpu/ganesh/GrResourceProvider.h"
#include "src/gpu/ganesh/GrSurface.h"
#include "src/gpu/ganesh/GrSurfaceProxy.h"
#include "src/gpu/ganesh/GrSurfaceProxyPriv.h"
#include "src/gpu/ganesh/GrSurfaceProxyView.h"
#include "src/gpu/ganesh/GrTexture.h"
#include "src/gpu/ganesh/GrTextureProxyCacheAccess.h"
#include "src/gpu/ganesh/GrTextureRenderTargetProxy.h"
#include <functional>
#include <memory>
#include <tuple>
#include <utility>
#define ASSERT_SINGLE_OWNER …
GrProxyProvider::GrProxyProvider(GrImageContext* imageContext) : … { … }
GrProxyProvider::~GrProxyProvider() { … }
bool GrProxyProvider::assignUniqueKeyToProxy(const skgpu::UniqueKey& key, GrTextureProxy* proxy) { … }
void GrProxyProvider::adoptUniqueKeyFromSurface(GrTextureProxy* proxy, const GrSurface* surf) { … }
void GrProxyProvider::removeUniqueKeyFromProxy(GrTextureProxy* proxy) { … }
sk_sp<GrTextureProxy> GrProxyProvider::findProxyByUniqueKey(const skgpu::UniqueKey& key) { … }
#if defined(GPU_TEST_UTILS)
sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createInstantiatedProxy(
SkISize dimensions,
const GrBackendFormat& format,
GrRenderable renderable,
int renderTargetSampleCnt,
SkBackingFit fit,
skgpu::Budgeted budgeted,
GrProtected isProtected) {
ASSERT_SINGLE_OWNER
if (this->isAbandoned()) {
return nullptr;
}
auto direct = fImageContext->asDirectContext();
if (!direct) {
return nullptr;
}
if (this->caps()->isFormatCompressed(format)) {
return nullptr;
}
GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
sk_sp<GrTexture> tex;
if (SkBackingFit::kApprox == fit) {
tex = resourceProvider->createApproxTexture(
dimensions,
format,
format.textureType(),
renderable,
renderTargetSampleCnt,
isProtected,
"InstantiatedProxyViaApproxTexture_Test");
} else {
tex = resourceProvider->createTexture(dimensions,
format,
format.textureType(),
renderable,
renderTargetSampleCnt,
skgpu::Mipmapped::kNo,
budgeted,
isProtected,
"InstantiatedProxyViaTexture_Test");
}
if (!tex) {
return nullptr;
}
return this->createWrapped(std::move(tex), UseAllocator::kYes);
}
sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createInstantiatedProxy(
SkISize dimensions,
GrColorType colorType,
GrRenderable renderable,
int renderTargetSampleCnt,
SkBackingFit fit,
skgpu::Budgeted budgeted,
GrProtected isProtected) {
ASSERT_SINGLE_OWNER
if (this->isAbandoned()) {
return nullptr;
}
auto format = this->caps()->getDefaultBackendFormat(colorType, renderable);
return this->testingOnly_createInstantiatedProxy(dimensions,
format,
renderable,
renderTargetSampleCnt,
fit,
budgeted,
isProtected);
}
sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createWrapped(sk_sp<GrTexture> tex) {
return this->createWrapped(std::move(tex), UseAllocator::kYes);
}
#endif
sk_sp<GrTextureProxy> GrProxyProvider::createWrapped(sk_sp<GrTexture> tex,
UseAllocator useAllocator) { … }
sk_sp<GrTextureProxy> GrProxyProvider::findOrCreateProxyByUniqueKey(const skgpu::UniqueKey& key,
UseAllocator useAllocator) { … }
GrSurfaceProxyView GrProxyProvider::findCachedProxyWithColorTypeFallback(
const skgpu::UniqueKey& key,
GrSurfaceOrigin origin,
GrColorType ct,
int sampleCnt) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createProxyFromBitmap(const SkBitmap& bitmap,
skgpu::Mipmapped mipmapped,
SkBackingFit fit,
skgpu::Budgeted budgeted) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createNonMippedProxyFromBitmap(const SkBitmap& bitmap,
SkBackingFit fit,
skgpu::Budgeted budgeted) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createMippedProxyFromBitmap(const SkBitmap& bitmap,
skgpu::Budgeted budgeted) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createProxy(const GrBackendFormat& format,
SkISize dimensions,
GrRenderable renderable,
int renderTargetSampleCnt,
skgpu::Mipmapped mipmapped,
SkBackingFit fit,
skgpu::Budgeted budgeted,
GrProtected isProtected,
std::string_view label,
GrInternalSurfaceFlags surfaceFlags,
GrSurfaceProxy::UseAllocator useAllocator) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createCompressedTextureProxy(
SkISize dimensions,
skgpu::Budgeted budgeted,
skgpu::Mipmapped mipmapped,
GrProtected isProtected,
SkTextureCompressionType compressionType,
sk_sp<SkData> data) { … }
sk_sp<GrTextureProxy> GrProxyProvider::wrapBackendTexture(
const GrBackendTexture& backendTex,
GrWrapOwnership ownership,
GrWrapCacheable cacheable,
GrIOType ioType,
sk_sp<skgpu::RefCntedCallback> releaseHelper) { … }
sk_sp<GrTextureProxy> GrProxyProvider::wrapCompressedBackendTexture(
const GrBackendTexture& beTex,
GrWrapOwnership ownership,
GrWrapCacheable cacheable,
sk_sp<skgpu::RefCntedCallback> releaseHelper) { … }
sk_sp<GrTextureProxy> GrProxyProvider::wrapRenderableBackendTexture(
const GrBackendTexture& backendTex,
int sampleCnt,
GrWrapOwnership ownership,
GrWrapCacheable cacheable,
sk_sp<skgpu::RefCntedCallback> releaseHelper) { … }
GrResourceProvider* GrProxyProvider::resourceProvider() const { … }
sk_sp<GrSurfaceProxy> GrProxyProvider::wrapBackendRenderTarget(
const GrBackendRenderTarget& backendRT,
sk_sp<skgpu::RefCntedCallback> releaseHelper) { … }
sk_sp<GrTextureProxy> GrProxyProvider::CreatePromiseProxy(GrContextThreadSafeProxy* threadSafeProxy,
LazyInstantiateCallback&& callback,
const GrBackendFormat& format,
SkISize dimensions,
skgpu::Mipmapped mipmapped) { … }
sk_sp<GrTextureProxy> GrProxyProvider::createLazyProxy(LazyInstantiateCallback&& callback,
const GrBackendFormat& format,
SkISize dimensions,
skgpu::Mipmapped mipmapped,
GrMipmapStatus mipmapStatus,
GrInternalSurfaceFlags surfaceFlags,
SkBackingFit fit,
skgpu::Budgeted budgeted,
GrProtected isProtected,
GrSurfaceProxy::UseAllocator useAllocator,
std::string_view label) { … }
sk_sp<GrRenderTargetProxy> GrProxyProvider::createLazyRenderTargetProxy(
LazyInstantiateCallback&& callback,
const GrBackendFormat& format,
SkISize dimensions,
int sampleCnt,
GrInternalSurfaceFlags surfaceFlags,
const TextureInfo* textureInfo,
GrMipmapStatus mipmapStatus,
SkBackingFit fit,
skgpu::Budgeted budgeted,
GrProtected isProtected,
bool wrapsVkSecondaryCB,
UseAllocator useAllocator) { … }
sk_sp<GrTextureProxy> GrProxyProvider::MakeFullyLazyProxy(LazyInstantiateCallback&& callback,
const GrBackendFormat& format,
GrRenderable renderable,
int renderTargetSampleCnt,
GrProtected isProtected,
const GrCaps& caps,
UseAllocator useAllocator) { … }
void GrProxyProvider::processInvalidUniqueKey(const skgpu::UniqueKey& key,
GrTextureProxy* proxy,
InvalidateGPUResource invalidateGPUResource) { … }
void GrProxyProvider::processInvalidUniqueKeyImpl(const skgpu::UniqueKey& key,
GrTextureProxy* proxy,
InvalidateGPUResource invalidateGPUResource,
RemoveTableEntry removeTableEntry) { … }
GrDDLProvider GrProxyProvider::isDDLProvider() const { … }
uint32_t GrProxyProvider::contextID() const { … }
const GrCaps* GrProxyProvider::caps() const { … }
sk_sp<const GrCaps> GrProxyProvider::refCaps() const { … }
bool GrProxyProvider::isAbandoned() const { … }
void GrProxyProvider::orphanAllUniqueKeys() { … }
void GrProxyProvider::removeAllUniqueKeys() { … }
bool GrProxyProvider::renderingDirectly() const { … }