1 /*
2 * Copyright 2019 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "GrContextThreadSafeProxy.h"
9 #include "GrContextThreadSafeProxyPriv.h"
10
11 #include "GrBaseContextPriv.h"
12 #include "GrCaps.h"
13 #include "GrContext.h"
14 #include "GrSkSLFPFactoryCache.h"
15 #include "SkSurface_Gpu.h"
16 #include "SkSurfaceCharacterization.h"
17
GrContextThreadSafeProxy(sk_sp<const GrCaps> caps,uint32_t contextID,GrBackendApi backend,const GrContextOptions & options,sk_sp<GrSkSLFPFactoryCache> cache)18 GrContextThreadSafeProxy::GrContextThreadSafeProxy(sk_sp<const GrCaps> caps, uint32_t contextID,
19 GrBackendApi backend,
20 const GrContextOptions& options,
21 sk_sp<GrSkSLFPFactoryCache> cache)
22 : fCaps(std::move(caps))
23 , fContextID(contextID)
24 , fBackend(backend)
25 , fOptions(options)
26 , fFPFactoryCache(std::move(cache)) {}
27
28 GrContextThreadSafeProxy::~GrContextThreadSafeProxy() = default;
29
matches(GrContext_Base * context) const30 bool GrContextThreadSafeProxy::matches(GrContext_Base* context) const {
31 return context->priv().contextID() == fContextID;
32 }
33
createCharacterization(size_t cacheMaxResourceBytes,const SkImageInfo & ii,const GrBackendFormat & backendFormat,int sampleCnt,GrSurfaceOrigin origin,const SkSurfaceProps & surfaceProps,bool isMipMapped,bool willUseGLFBO0,bool isTextureable)34 SkSurfaceCharacterization GrContextThreadSafeProxy::createCharacterization(
35 size_t cacheMaxResourceBytes,
36 const SkImageInfo& ii, const GrBackendFormat& backendFormat,
37 int sampleCnt, GrSurfaceOrigin origin,
38 const SkSurfaceProps& surfaceProps,
39 bool isMipMapped, bool willUseGLFBO0, bool isTextureable) {
40 if (!backendFormat.isValid()) {
41 return SkSurfaceCharacterization(); // return an invalid characterization
42 }
43
44 if (GrBackendApi::kOpenGL != backendFormat.backend() && willUseGLFBO0) {
45 // The willUseGLFBO0 flags can only be used for a GL backend.
46 return SkSurfaceCharacterization(); // return an invalid characterization
47 }
48
49 if (!fCaps->mipMapSupport()) {
50 isMipMapped = false;
51 }
52
53 GrPixelConfig config = fCaps->getConfigFromBackendFormat(backendFormat, ii.colorType());
54 if (config == kUnknown_GrPixelConfig) {
55 return SkSurfaceCharacterization(); // return an invalid characterization
56 }
57
58 if (!SkSurface_Gpu::Valid(fCaps.get(), config, ii.colorSpace())) {
59 return SkSurfaceCharacterization(); // return an invalid characterization
60 }
61
62 sampleCnt = fCaps->getRenderTargetSampleCount(sampleCnt, config);
63 if (!sampleCnt) {
64 return SkSurfaceCharacterization(); // return an invalid characterization
65 }
66
67 GrFSAAType FSAAType = GrFSAAType::kNone;
68 if (sampleCnt > 1) {
69 FSAAType = fCaps->usesMixedSamples() ? GrFSAAType::kMixedSamples : GrFSAAType::kUnifiedMSAA;
70 }
71
72 if (willUseGLFBO0 && isTextureable) {
73 return SkSurfaceCharacterization(); // return an invalid characterization
74 }
75
76 if (isTextureable && !fCaps->isConfigTexturable(config)) {
77 // Skia doesn't agree that this is textureable.
78 return SkSurfaceCharacterization(); // return an invalid characterization
79 }
80
81 return SkSurfaceCharacterization(sk_ref_sp<GrContextThreadSafeProxy>(this),
82 cacheMaxResourceBytes, ii,
83 origin, config, FSAAType, sampleCnt,
84 SkSurfaceCharacterization::Textureable(isTextureable),
85 SkSurfaceCharacterization::MipMapped(isMipMapped),
86 SkSurfaceCharacterization::UsesGLFBO0(willUseGLFBO0),
87 SkSurfaceCharacterization::VulkanSecondaryCBCompatible(false),
88 surfaceProps);
89 }
90
91 ////////////////////////////////////////////////////////////////////////////////
fpFactoryCache() const92 sk_sp<GrSkSLFPFactoryCache> GrContextThreadSafeProxyPriv::fpFactoryCache() const {
93 return fProxy->fFPFactoryCache;
94 }
95