/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrContextThreadSafeProxy.h" #include "GrContextThreadSafeProxyPriv.h" #include "GrBaseContextPriv.h" #include "GrCaps.h" #include "GrContext.h" #include "GrSkSLFPFactoryCache.h" #include "SkSurface_Gpu.h" #include "SkSurfaceCharacterization.h" GrContextThreadSafeProxy::GrContextThreadSafeProxy(sk_sp<const GrCaps> caps, uint32_t contextID, GrBackendApi backend, const GrContextOptions& options, sk_sp<GrSkSLFPFactoryCache> cache) : fCaps(std::move(caps)) , fContextID(contextID) , fBackend(backend) , fOptions(options) , fFPFactoryCache(std::move(cache)) {} GrContextThreadSafeProxy::~GrContextThreadSafeProxy() = default; bool GrContextThreadSafeProxy::matches(GrContext_Base* context) const { return context->priv().contextID() == fContextID; } SkSurfaceCharacterization GrContextThreadSafeProxy::createCharacterization( size_t cacheMaxResourceBytes, const SkImageInfo& ii, const GrBackendFormat& backendFormat, int sampleCnt, GrSurfaceOrigin origin, const SkSurfaceProps& surfaceProps, bool isMipMapped, bool willUseGLFBO0, bool isTextureable) { if (!backendFormat.isValid()) { return SkSurfaceCharacterization(); // return an invalid characterization } if (GrBackendApi::kOpenGL != backendFormat.backend() && willUseGLFBO0) { // The willUseGLFBO0 flags can only be used for a GL backend. return SkSurfaceCharacterization(); // return an invalid characterization } if (!fCaps->mipMapSupport()) { isMipMapped = false; } GrPixelConfig config = fCaps->getConfigFromBackendFormat(backendFormat, ii.colorType()); if (config == kUnknown_GrPixelConfig) { return SkSurfaceCharacterization(); // return an invalid characterization } if (!SkSurface_Gpu::Valid(fCaps.get(), config, ii.colorSpace())) { return SkSurfaceCharacterization(); // return an invalid characterization } sampleCnt = fCaps->getRenderTargetSampleCount(sampleCnt, config); if (!sampleCnt) { return SkSurfaceCharacterization(); // return an invalid characterization } GrFSAAType FSAAType = GrFSAAType::kNone; if (sampleCnt > 1) { FSAAType = fCaps->usesMixedSamples() ? GrFSAAType::kMixedSamples : GrFSAAType::kUnifiedMSAA; } if (willUseGLFBO0 && isTextureable) { return SkSurfaceCharacterization(); // return an invalid characterization } if (isTextureable && !fCaps->isConfigTexturable(config)) { // Skia doesn't agree that this is textureable. return SkSurfaceCharacterization(); // return an invalid characterization } return SkSurfaceCharacterization(sk_ref_sp<GrContextThreadSafeProxy>(this), cacheMaxResourceBytes, ii, origin, config, FSAAType, sampleCnt, SkSurfaceCharacterization::Textureable(isTextureable), SkSurfaceCharacterization::MipMapped(isMipMapped), SkSurfaceCharacterization::UsesGLFBO0(willUseGLFBO0), SkSurfaceCharacterization::VulkanSecondaryCBCompatible(false), surfaceProps); } //////////////////////////////////////////////////////////////////////////////// sk_sp<GrSkSLFPFactoryCache> GrContextThreadSafeProxyPriv::fpFactoryCache() const { return fProxy->fFPFactoryCache; }