1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextThreadSafeProxy.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SingleOwner.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrImageContext.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkImageInfoPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMipmap.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResource.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResourcePriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageContextPriv.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceCache.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyPriv.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxyCacheAccess.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureRenderTargetProxy.h"
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
44*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
45*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
46*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker #define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(fImageContext->priv().singleOwner())
49*c8dee2aaSAndroid Build Coastguard Worker
GrProxyProvider(GrImageContext * imageContext)50*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider::GrProxyProvider(GrImageContext* imageContext) : fImageContext(imageContext) {}
51*c8dee2aaSAndroid Build Coastguard Worker
~GrProxyProvider()52*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider::~GrProxyProvider() {
53*c8dee2aaSAndroid Build Coastguard Worker if (this->renderingDirectly()) {
54*c8dee2aaSAndroid Build Coastguard Worker // In DDL-mode a proxy provider can still have extant uniquely keyed proxies (since
55*c8dee2aaSAndroid Build Coastguard Worker // they need their unique keys to, potentially, find a cached resource when the
56*c8dee2aaSAndroid Build Coastguard Worker // DDL is played) but, in non-DDL-mode they should all have been cleaned up by this point.
57*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fUniquelyKeyedProxies.count());
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker
assignUniqueKeyToProxy(const skgpu::UniqueKey & key,GrTextureProxy * proxy)61*c8dee2aaSAndroid Build Coastguard Worker bool GrProxyProvider::assignUniqueKeyToProxy(const skgpu::UniqueKey& key, GrTextureProxy* proxy) {
62*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
63*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(key.isValid());
64*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned() || !proxy) {
65*c8dee2aaSAndroid Build Coastguard Worker return false;
66*c8dee2aaSAndroid Build Coastguard Worker }
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker // Only the proxyProvider that created a proxy should be assigning unique keys to it.
69*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->isDDLProvider() == proxy->creatingProvider());
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
72*c8dee2aaSAndroid Build Coastguard Worker {
73*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
74*c8dee2aaSAndroid Build Coastguard Worker if (direct) {
75*c8dee2aaSAndroid Build Coastguard Worker GrResourceCache* resourceCache = direct->priv().getResourceCache();
76*c8dee2aaSAndroid Build Coastguard Worker // If there is already a GrResource with this key then the caller has violated the
77*c8dee2aaSAndroid Build Coastguard Worker // normal usage pattern of uniquely keyed resources (e.g., they have created one w/o
78*c8dee2aaSAndroid Build Coastguard Worker // first seeing if it already existed in the cache).
79*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!resourceCache->findAndRefUniqueResource(key));
80*c8dee2aaSAndroid Build Coastguard Worker }
81*c8dee2aaSAndroid Build Coastguard Worker }
82*c8dee2aaSAndroid Build Coastguard Worker #endif
83*c8dee2aaSAndroid Build Coastguard Worker
84*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fUniquelyKeyedProxies.find(key)); // multiple proxies can't get the same key
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker proxy->cacheAccess().setUniqueKey(this, key);
87*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy->getUniqueKey() == key);
88*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.add(proxy);
89*c8dee2aaSAndroid Build Coastguard Worker return true;
90*c8dee2aaSAndroid Build Coastguard Worker }
91*c8dee2aaSAndroid Build Coastguard Worker
adoptUniqueKeyFromSurface(GrTextureProxy * proxy,const GrSurface * surf)92*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::adoptUniqueKeyFromSurface(GrTextureProxy* proxy, const GrSurface* surf) {
93*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surf->getUniqueKey().isValid());
94*c8dee2aaSAndroid Build Coastguard Worker proxy->cacheAccess().setUniqueKey(this, surf->getUniqueKey());
95*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy->getUniqueKey() == surf->getUniqueKey());
96*c8dee2aaSAndroid Build Coastguard Worker // multiple proxies can't get the same key
97*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fUniquelyKeyedProxies.find(surf->getUniqueKey()));
98*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.add(proxy);
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker
removeUniqueKeyFromProxy(GrTextureProxy * proxy)101*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::removeUniqueKeyFromProxy(GrTextureProxy* proxy) {
102*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
103*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy);
104*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy->getUniqueKey().isValid());
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
107*c8dee2aaSAndroid Build Coastguard Worker return;
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker this->processInvalidUniqueKey(proxy->getUniqueKey(), proxy, InvalidateGPUResource::kYes);
111*c8dee2aaSAndroid Build Coastguard Worker }
112*c8dee2aaSAndroid Build Coastguard Worker
findProxyByUniqueKey(const skgpu::UniqueKey & key)113*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::findProxyByUniqueKey(const skgpu::UniqueKey& key) {
114*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
117*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
118*c8dee2aaSAndroid Build Coastguard Worker }
119*c8dee2aaSAndroid Build Coastguard Worker
120*c8dee2aaSAndroid Build Coastguard Worker GrTextureProxy* proxy = fUniquelyKeyedProxies.find(key);
121*c8dee2aaSAndroid Build Coastguard Worker if (proxy) {
122*c8dee2aaSAndroid Build Coastguard Worker return sk_ref_sp(proxy);
123*c8dee2aaSAndroid Build Coastguard Worker }
124*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
125*c8dee2aaSAndroid Build Coastguard Worker }
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
testingOnly_createInstantiatedProxy(SkISize dimensions,const GrBackendFormat & format,GrRenderable renderable,int renderTargetSampleCnt,SkBackingFit fit,skgpu::Budgeted budgeted,GrProtected isProtected)130*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createInstantiatedProxy(
131*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
132*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
133*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
134*c8dee2aaSAndroid Build Coastguard Worker int renderTargetSampleCnt,
135*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
136*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
137*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected) {
138*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
139*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
140*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
141*c8dee2aaSAndroid Build Coastguard Worker }
142*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
143*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
144*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
145*c8dee2aaSAndroid Build Coastguard Worker }
146*c8dee2aaSAndroid Build Coastguard Worker
147*c8dee2aaSAndroid Build Coastguard Worker if (this->caps()->isFormatCompressed(format)) {
148*c8dee2aaSAndroid Build Coastguard Worker // TODO: Allow this to go to GrResourceProvider::createCompressedTexture() once we no longer
149*c8dee2aaSAndroid Build Coastguard Worker // rely on GrColorType to get a swizzle for the proxy.
150*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
151*c8dee2aaSAndroid Build Coastguard Worker }
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
154*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> tex;
155*c8dee2aaSAndroid Build Coastguard Worker
156*c8dee2aaSAndroid Build Coastguard Worker if (SkBackingFit::kApprox == fit) {
157*c8dee2aaSAndroid Build Coastguard Worker tex = resourceProvider->createApproxTexture(
158*c8dee2aaSAndroid Build Coastguard Worker dimensions,
159*c8dee2aaSAndroid Build Coastguard Worker format,
160*c8dee2aaSAndroid Build Coastguard Worker format.textureType(),
161*c8dee2aaSAndroid Build Coastguard Worker renderable,
162*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
163*c8dee2aaSAndroid Build Coastguard Worker isProtected,
164*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"InstantiatedProxyViaApproxTexture_Test");
165*c8dee2aaSAndroid Build Coastguard Worker } else {
166*c8dee2aaSAndroid Build Coastguard Worker tex = resourceProvider->createTexture(dimensions,
167*c8dee2aaSAndroid Build Coastguard Worker format,
168*c8dee2aaSAndroid Build Coastguard Worker format.textureType(),
169*c8dee2aaSAndroid Build Coastguard Worker renderable,
170*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
171*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
172*c8dee2aaSAndroid Build Coastguard Worker budgeted,
173*c8dee2aaSAndroid Build Coastguard Worker isProtected,
174*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"InstantiatedProxyViaTexture_Test");
175*c8dee2aaSAndroid Build Coastguard Worker }
176*c8dee2aaSAndroid Build Coastguard Worker if (!tex) {
177*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker return this->createWrapped(std::move(tex), UseAllocator::kYes);
181*c8dee2aaSAndroid Build Coastguard Worker }
182*c8dee2aaSAndroid Build Coastguard Worker
testingOnly_createInstantiatedProxy(SkISize dimensions,GrColorType colorType,GrRenderable renderable,int renderTargetSampleCnt,SkBackingFit fit,skgpu::Budgeted budgeted,GrProtected isProtected)183*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createInstantiatedProxy(
184*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
185*c8dee2aaSAndroid Build Coastguard Worker GrColorType colorType,
186*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
187*c8dee2aaSAndroid Build Coastguard Worker int renderTargetSampleCnt,
188*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
189*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
190*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected) {
191*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
192*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
193*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
194*c8dee2aaSAndroid Build Coastguard Worker }
195*c8dee2aaSAndroid Build Coastguard Worker auto format = this->caps()->getDefaultBackendFormat(colorType, renderable);
196*c8dee2aaSAndroid Build Coastguard Worker return this->testingOnly_createInstantiatedProxy(dimensions,
197*c8dee2aaSAndroid Build Coastguard Worker format,
198*c8dee2aaSAndroid Build Coastguard Worker renderable,
199*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
200*c8dee2aaSAndroid Build Coastguard Worker fit,
201*c8dee2aaSAndroid Build Coastguard Worker budgeted,
202*c8dee2aaSAndroid Build Coastguard Worker isProtected);
203*c8dee2aaSAndroid Build Coastguard Worker }
204*c8dee2aaSAndroid Build Coastguard Worker
testingOnly_createWrapped(sk_sp<GrTexture> tex)205*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::testingOnly_createWrapped(sk_sp<GrTexture> tex) {
206*c8dee2aaSAndroid Build Coastguard Worker return this->createWrapped(std::move(tex), UseAllocator::kYes);
207*c8dee2aaSAndroid Build Coastguard Worker }
208*c8dee2aaSAndroid Build Coastguard Worker #endif
209*c8dee2aaSAndroid Build Coastguard Worker
createWrapped(sk_sp<GrTexture> tex,UseAllocator useAllocator)210*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createWrapped(sk_sp<GrTexture> tex,
211*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator) {
212*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
213*c8dee2aaSAndroid Build Coastguard Worker if (tex->getUniqueKey().isValid()) {
214*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->findProxyByUniqueKey(tex->getUniqueKey()));
215*c8dee2aaSAndroid Build Coastguard Worker }
216*c8dee2aaSAndroid Build Coastguard Worker #endif
217*c8dee2aaSAndroid Build Coastguard Worker
218*c8dee2aaSAndroid Build Coastguard Worker if (tex->asRenderTarget()) {
219*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureRenderTargetProxy(
220*c8dee2aaSAndroid Build Coastguard Worker std::move(tex), useAllocator, this->isDDLProvider()));
221*c8dee2aaSAndroid Build Coastguard Worker } else {
222*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(
223*c8dee2aaSAndroid Build Coastguard Worker new GrTextureProxy(std::move(tex), useAllocator, this->isDDLProvider()));
224*c8dee2aaSAndroid Build Coastguard Worker }
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker
findOrCreateProxyByUniqueKey(const skgpu::UniqueKey & key,UseAllocator useAllocator)227*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::findOrCreateProxyByUniqueKey(const skgpu::UniqueKey& key,
228*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator) {
229*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
230*c8dee2aaSAndroid Build Coastguard Worker
231*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
232*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
233*c8dee2aaSAndroid Build Coastguard Worker }
234*c8dee2aaSAndroid Build Coastguard Worker
235*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> result = this->findProxyByUniqueKey(key);
236*c8dee2aaSAndroid Build Coastguard Worker if (result) {
237*c8dee2aaSAndroid Build Coastguard Worker return result;
238*c8dee2aaSAndroid Build Coastguard Worker }
239*c8dee2aaSAndroid Build Coastguard Worker
240*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
241*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
242*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
243*c8dee2aaSAndroid Build Coastguard Worker }
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard Worker GrResourceCache* resourceCache = direct->priv().getResourceCache();
246*c8dee2aaSAndroid Build Coastguard Worker
247*c8dee2aaSAndroid Build Coastguard Worker GrGpuResource* resource = resourceCache->findAndRefUniqueResource(key);
248*c8dee2aaSAndroid Build Coastguard Worker if (!resource) {
249*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
250*c8dee2aaSAndroid Build Coastguard Worker }
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> texture(static_cast<GrSurface*>(resource)->asTexture());
253*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(texture);
254*c8dee2aaSAndroid Build Coastguard Worker
255*c8dee2aaSAndroid Build Coastguard Worker result = this->createWrapped(std::move(texture), useAllocator);
256*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(result->getUniqueKey() == key);
257*c8dee2aaSAndroid Build Coastguard Worker // createWrapped should've added this for us
258*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fUniquelyKeyedProxies.find(key));
259*c8dee2aaSAndroid Build Coastguard Worker return result;
260*c8dee2aaSAndroid Build Coastguard Worker }
261*c8dee2aaSAndroid Build Coastguard Worker
findCachedProxyWithColorTypeFallback(const skgpu::UniqueKey & key,GrSurfaceOrigin origin,GrColorType ct,int sampleCnt)262*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView GrProxyProvider::findCachedProxyWithColorTypeFallback(
263*c8dee2aaSAndroid Build Coastguard Worker const skgpu::UniqueKey& key,
264*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin,
265*c8dee2aaSAndroid Build Coastguard Worker GrColorType ct,
266*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt) {
267*c8dee2aaSAndroid Build Coastguard Worker auto proxy = this->findOrCreateProxyByUniqueKey(key);
268*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
269*c8dee2aaSAndroid Build Coastguard Worker return {};
270*c8dee2aaSAndroid Build Coastguard Worker }
271*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = fImageContext->priv().caps();
272*c8dee2aaSAndroid Build Coastguard Worker
273*c8dee2aaSAndroid Build Coastguard Worker // Assume that we used a fallback color type if and only if the proxy is renderable.
274*c8dee2aaSAndroid Build Coastguard Worker if (proxy->asRenderTargetProxy()) {
275*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat expectedFormat;
276*c8dee2aaSAndroid Build Coastguard Worker std::tie(ct, expectedFormat) = caps->getFallbackColorTypeAndFormat(ct, sampleCnt);
277*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(expectedFormat == proxy->backendFormat());
278*c8dee2aaSAndroid Build Coastguard Worker }
279*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle swizzle = caps->getReadSwizzle(proxy->backendFormat(), ct);
280*c8dee2aaSAndroid Build Coastguard Worker return {std::move(proxy), origin, swizzle};
281*c8dee2aaSAndroid Build Coastguard Worker }
282*c8dee2aaSAndroid Build Coastguard Worker
createProxyFromBitmap(const SkBitmap & bitmap,skgpu::Mipmapped mipmapped,SkBackingFit fit,skgpu::Budgeted budgeted)283*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createProxyFromBitmap(const SkBitmap& bitmap,
284*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
285*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
286*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted) {
287*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
288*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fit == SkBackingFit::kExact || mipmapped == skgpu::Mipmapped::kNo);
289*c8dee2aaSAndroid Build Coastguard Worker
290*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
291*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
292*c8dee2aaSAndroid Build Coastguard Worker }
293*c8dee2aaSAndroid Build Coastguard Worker
294*c8dee2aaSAndroid Build Coastguard Worker if (!SkImageInfoIsValid(bitmap.info())) {
295*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
296*c8dee2aaSAndroid Build Coastguard Worker }
297*c8dee2aaSAndroid Build Coastguard Worker
298*c8dee2aaSAndroid Build Coastguard Worker ATRACE_ANDROID_FRAMEWORK("Upload %sTexture [%dx%d]",
299*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kYes == mipmapped ? "MipMap " : "",
300*c8dee2aaSAndroid Build Coastguard Worker bitmap.width(),
301*c8dee2aaSAndroid Build Coastguard Worker bitmap.height());
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker // In non-ddl we will always instantiate right away. Thus we never want to copy the SkBitmap
304*c8dee2aaSAndroid Build Coastguard Worker // even if its mutable. In ddl, if the bitmap is mutable then we must make a copy since the
305*c8dee2aaSAndroid Build Coastguard Worker // upload of the data to the gpu can happen at anytime and the bitmap may change by then.
306*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copyBitmap = bitmap;
307*c8dee2aaSAndroid Build Coastguard Worker if (!this->renderingDirectly() && !bitmap.isImmutable()) {
308*c8dee2aaSAndroid Build Coastguard Worker copyBitmap.allocPixels();
309*c8dee2aaSAndroid Build Coastguard Worker if (!bitmap.readPixels(copyBitmap.pixmap())) {
310*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
311*c8dee2aaSAndroid Build Coastguard Worker }
312*c8dee2aaSAndroid Build Coastguard Worker if (mipmapped == skgpu::Mipmapped::kYes && bitmap.fMips) {
313*c8dee2aaSAndroid Build Coastguard Worker copyBitmap.fMips = sk_sp<SkMipmap>(SkMipmap::Build(copyBitmap.pixmap(),
314*c8dee2aaSAndroid Build Coastguard Worker /* factoryProc= */ nullptr,
315*c8dee2aaSAndroid Build Coastguard Worker /* computeContents= */ false));
316*c8dee2aaSAndroid Build Coastguard Worker if (copyBitmap.fMips) {
317*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < copyBitmap.fMips->countLevels(); ++i) {
318*c8dee2aaSAndroid Build Coastguard Worker SkMipmap::Level src, dst;
319*c8dee2aaSAndroid Build Coastguard Worker bitmap.fMips->getLevel(i, &src);
320*c8dee2aaSAndroid Build Coastguard Worker copyBitmap.fMips->getLevel(i, &dst);
321*c8dee2aaSAndroid Build Coastguard Worker src.fPixmap.readPixels(dst.fPixmap);
322*c8dee2aaSAndroid Build Coastguard Worker }
323*c8dee2aaSAndroid Build Coastguard Worker }
324*c8dee2aaSAndroid Build Coastguard Worker }
325*c8dee2aaSAndroid Build Coastguard Worker copyBitmap.setImmutable();
326*c8dee2aaSAndroid Build Coastguard Worker }
327*c8dee2aaSAndroid Build Coastguard Worker
328*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy;
329*c8dee2aaSAndroid Build Coastguard Worker if (mipmapped == skgpu::Mipmapped::kNo ||
330*c8dee2aaSAndroid Build Coastguard Worker !SkMipmap::ComputeLevelCount(copyBitmap.dimensions())) {
331*c8dee2aaSAndroid Build Coastguard Worker proxy = this->createNonMippedProxyFromBitmap(copyBitmap, fit, budgeted);
332*c8dee2aaSAndroid Build Coastguard Worker } else {
333*c8dee2aaSAndroid Build Coastguard Worker proxy = this->createMippedProxyFromBitmap(copyBitmap, budgeted);
334*c8dee2aaSAndroid Build Coastguard Worker }
335*c8dee2aaSAndroid Build Coastguard Worker
336*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
337*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker
340*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
341*c8dee2aaSAndroid Build Coastguard Worker if (direct) {
342*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
343*c8dee2aaSAndroid Build Coastguard Worker
344*c8dee2aaSAndroid Build Coastguard Worker // In order to reuse code we always create a lazy proxy. When we aren't in DDL mode however
345*c8dee2aaSAndroid Build Coastguard Worker // we're better off instantiating the proxy immediately here.
346*c8dee2aaSAndroid Build Coastguard Worker if (!proxy->priv().doLazyInstantiation(resourceProvider)) {
347*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
348*c8dee2aaSAndroid Build Coastguard Worker }
349*c8dee2aaSAndroid Build Coastguard Worker }
350*c8dee2aaSAndroid Build Coastguard Worker return proxy;
351*c8dee2aaSAndroid Build Coastguard Worker }
352*c8dee2aaSAndroid Build Coastguard Worker
createNonMippedProxyFromBitmap(const SkBitmap & bitmap,SkBackingFit fit,skgpu::Budgeted budgeted)353*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createNonMippedProxyFromBitmap(const SkBitmap& bitmap,
354*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
355*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted) {
356*c8dee2aaSAndroid Build Coastguard Worker auto dims = bitmap.dimensions();
357*c8dee2aaSAndroid Build Coastguard Worker
358*c8dee2aaSAndroid Build Coastguard Worker auto colorType = SkColorTypeToGrColorType(bitmap.colorType());
359*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->caps()->getDefaultBackendFormat(colorType, GrRenderable::kNo);
360*c8dee2aaSAndroid Build Coastguard Worker if (!format.isValid()) {
361*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
362*c8dee2aaSAndroid Build Coastguard Worker }
363*c8dee2aaSAndroid Build Coastguard Worker
364*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy = this->createLazyProxy(
365*c8dee2aaSAndroid Build Coastguard Worker [bitmap](GrResourceProvider* resourceProvider, const LazySurfaceDesc& desc) {
366*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(desc.fMipmapped == skgpu::Mipmapped::kNo);
367*c8dee2aaSAndroid Build Coastguard Worker GrMipLevel mipLevel = {bitmap.getPixels(), bitmap.rowBytes(), nullptr};
368*c8dee2aaSAndroid Build Coastguard Worker auto colorType = SkColorTypeToGrColorType(bitmap.colorType());
369*c8dee2aaSAndroid Build Coastguard Worker return LazyCallbackResult(resourceProvider->createTexture(desc.fDimensions,
370*c8dee2aaSAndroid Build Coastguard Worker desc.fFormat,
371*c8dee2aaSAndroid Build Coastguard Worker desc.fTextureType,
372*c8dee2aaSAndroid Build Coastguard Worker colorType,
373*c8dee2aaSAndroid Build Coastguard Worker desc.fRenderable,
374*c8dee2aaSAndroid Build Coastguard Worker desc.fSampleCnt,
375*c8dee2aaSAndroid Build Coastguard Worker desc.fBudgeted,
376*c8dee2aaSAndroid Build Coastguard Worker desc.fFit,
377*c8dee2aaSAndroid Build Coastguard Worker desc.fProtected,
378*c8dee2aaSAndroid Build Coastguard Worker mipLevel,
379*c8dee2aaSAndroid Build Coastguard Worker desc.fLabel));
380*c8dee2aaSAndroid Build Coastguard Worker },
381*c8dee2aaSAndroid Build Coastguard Worker format,
382*c8dee2aaSAndroid Build Coastguard Worker dims,
383*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
384*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus::kNotAllocated,
385*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags::kNone,
386*c8dee2aaSAndroid Build Coastguard Worker fit,
387*c8dee2aaSAndroid Build Coastguard Worker budgeted,
388*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
389*c8dee2aaSAndroid Build Coastguard Worker UseAllocator::kYes,
390*c8dee2aaSAndroid Build Coastguard Worker "ProxyProvider_CreateNonMippedProxyFromBitmap");
391*c8dee2aaSAndroid Build Coastguard Worker
392*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
393*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
394*c8dee2aaSAndroid Build Coastguard Worker }
395*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy->dimensions() == bitmap.dimensions());
396*c8dee2aaSAndroid Build Coastguard Worker return proxy;
397*c8dee2aaSAndroid Build Coastguard Worker }
398*c8dee2aaSAndroid Build Coastguard Worker
createMippedProxyFromBitmap(const SkBitmap & bitmap,skgpu::Budgeted budgeted)399*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createMippedProxyFromBitmap(const SkBitmap& bitmap,
400*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted) {
401*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->caps()->mipmapSupport());
402*c8dee2aaSAndroid Build Coastguard Worker
403*c8dee2aaSAndroid Build Coastguard Worker auto colorType = SkColorTypeToGrColorType(bitmap.colorType());
404*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->caps()->getDefaultBackendFormat(colorType, GrRenderable::kNo);
405*c8dee2aaSAndroid Build Coastguard Worker if (!format.isValid()) {
406*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
407*c8dee2aaSAndroid Build Coastguard Worker }
408*c8dee2aaSAndroid Build Coastguard Worker
409*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkMipmap> mipmaps = bitmap.fMips;
410*c8dee2aaSAndroid Build Coastguard Worker if (!mipmaps) {
411*c8dee2aaSAndroid Build Coastguard Worker mipmaps.reset(SkMipmap::Build(bitmap.pixmap(), /* factoryProc= */ nullptr));
412*c8dee2aaSAndroid Build Coastguard Worker if (!mipmaps) {
413*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
414*c8dee2aaSAndroid Build Coastguard Worker }
415*c8dee2aaSAndroid Build Coastguard Worker }
416*c8dee2aaSAndroid Build Coastguard Worker
417*c8dee2aaSAndroid Build Coastguard Worker auto dims = bitmap.dimensions();
418*c8dee2aaSAndroid Build Coastguard Worker
419*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy = this->createLazyProxy(
420*c8dee2aaSAndroid Build Coastguard Worker [bitmap, mipmaps](GrResourceProvider* resourceProvider, const LazySurfaceDesc& desc) {
421*c8dee2aaSAndroid Build Coastguard Worker const int mipLevelCount = mipmaps->countLevels() + 1;
422*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrMipLevel[]> texels(new GrMipLevel[mipLevelCount]);
423*c8dee2aaSAndroid Build Coastguard Worker auto colorType = SkColorTypeToGrColorType(bitmap.colorType());
424*c8dee2aaSAndroid Build Coastguard Worker
425*c8dee2aaSAndroid Build Coastguard Worker texels[0].fPixels = bitmap.getPixels();
426*c8dee2aaSAndroid Build Coastguard Worker texels[0].fRowBytes = bitmap.rowBytes();
427*c8dee2aaSAndroid Build Coastguard Worker
428*c8dee2aaSAndroid Build Coastguard Worker for (int i = 1; i < mipLevelCount; ++i) {
429*c8dee2aaSAndroid Build Coastguard Worker SkMipmap::Level generatedMipLevel;
430*c8dee2aaSAndroid Build Coastguard Worker mipmaps->getLevel(i - 1, &generatedMipLevel);
431*c8dee2aaSAndroid Build Coastguard Worker texels[i].fPixels = generatedMipLevel.fPixmap.addr();
432*c8dee2aaSAndroid Build Coastguard Worker texels[i].fRowBytes = generatedMipLevel.fPixmap.rowBytes();
433*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(texels[i].fPixels);
434*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(generatedMipLevel.fPixmap.colorType() == bitmap.colorType());
435*c8dee2aaSAndroid Build Coastguard Worker }
436*c8dee2aaSAndroid Build Coastguard Worker return LazyCallbackResult(resourceProvider->createTexture(desc.fDimensions,
437*c8dee2aaSAndroid Build Coastguard Worker desc.fFormat,
438*c8dee2aaSAndroid Build Coastguard Worker desc.fTextureType,
439*c8dee2aaSAndroid Build Coastguard Worker colorType,
440*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
441*c8dee2aaSAndroid Build Coastguard Worker 1,
442*c8dee2aaSAndroid Build Coastguard Worker desc.fBudgeted,
443*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kYes,
444*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
445*c8dee2aaSAndroid Build Coastguard Worker texels.get(),
446*c8dee2aaSAndroid Build Coastguard Worker desc.fLabel));
447*c8dee2aaSAndroid Build Coastguard Worker },
448*c8dee2aaSAndroid Build Coastguard Worker format,
449*c8dee2aaSAndroid Build Coastguard Worker dims,
450*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kYes,
451*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus::kValid,
452*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags::kNone,
453*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact,
454*c8dee2aaSAndroid Build Coastguard Worker budgeted,
455*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
456*c8dee2aaSAndroid Build Coastguard Worker UseAllocator::kYes,
457*c8dee2aaSAndroid Build Coastguard Worker "ProxyProvider_CreateMippedProxyFromBitmap");
458*c8dee2aaSAndroid Build Coastguard Worker
459*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
460*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
461*c8dee2aaSAndroid Build Coastguard Worker }
462*c8dee2aaSAndroid Build Coastguard Worker
463*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(proxy->dimensions() == bitmap.dimensions());
464*c8dee2aaSAndroid Build Coastguard Worker
465*c8dee2aaSAndroid Build Coastguard Worker return proxy;
466*c8dee2aaSAndroid Build Coastguard Worker }
467*c8dee2aaSAndroid Build Coastguard Worker
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)468*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createProxy(const GrBackendFormat& format,
469*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
470*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
471*c8dee2aaSAndroid Build Coastguard Worker int renderTargetSampleCnt,
472*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
473*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
474*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
475*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
476*c8dee2aaSAndroid Build Coastguard Worker std::string_view label,
477*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags,
478*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy::UseAllocator useAllocator) {
479*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
480*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
481*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
482*c8dee2aaSAndroid Build Coastguard Worker }
483*c8dee2aaSAndroid Build Coastguard Worker
484*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = this->caps();
485*c8dee2aaSAndroid Build Coastguard Worker
486*c8dee2aaSAndroid Build Coastguard Worker if (caps->isFormatCompressed(format)) {
487*c8dee2aaSAndroid Build Coastguard Worker // Deferred proxies for compressed textures are not supported.
488*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
489*c8dee2aaSAndroid Build Coastguard Worker }
490*c8dee2aaSAndroid Build Coastguard Worker
491*c8dee2aaSAndroid Build Coastguard Worker if (skgpu::Mipmapped::kYes == mipmapped) {
492*c8dee2aaSAndroid Build Coastguard Worker // SkMipmap doesn't include the base level in the level count so we have to add 1
493*c8dee2aaSAndroid Build Coastguard Worker int mipCount = SkMipmap::ComputeLevelCount(dimensions.fWidth, dimensions.fHeight) + 1;
494*c8dee2aaSAndroid Build Coastguard Worker if (1 == mipCount) {
495*c8dee2aaSAndroid Build Coastguard Worker mipmapped = skgpu::Mipmapped::kNo;
496*c8dee2aaSAndroid Build Coastguard Worker }
497*c8dee2aaSAndroid Build Coastguard Worker }
498*c8dee2aaSAndroid Build Coastguard Worker
499*c8dee2aaSAndroid Build Coastguard Worker if (!caps->validateSurfaceParams(dimensions,
500*c8dee2aaSAndroid Build Coastguard Worker format,
501*c8dee2aaSAndroid Build Coastguard Worker renderable,
502*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
503*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
504*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D)) {
505*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
506*c8dee2aaSAndroid Build Coastguard Worker }
507*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus = (skgpu::Mipmapped::kYes == mipmapped)
508*c8dee2aaSAndroid Build Coastguard Worker ? GrMipmapStatus::kDirty
509*c8dee2aaSAndroid Build Coastguard Worker : GrMipmapStatus::kNotAllocated;
510*c8dee2aaSAndroid Build Coastguard Worker if (renderable == GrRenderable::kYes) {
511*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt = caps->getRenderTargetSampleCount(renderTargetSampleCnt, format);
512*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(renderTargetSampleCnt);
513*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags extraFlags = caps->getExtraSurfaceFlagsForDeferredRT();
514*c8dee2aaSAndroid Build Coastguard Worker // We know anything we instantiate later from this deferred path will be
515*c8dee2aaSAndroid Build Coastguard Worker // both texturable and renderable
516*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureRenderTargetProxy(*caps,
517*c8dee2aaSAndroid Build Coastguard Worker format,
518*c8dee2aaSAndroid Build Coastguard Worker dimensions,
519*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
520*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
521*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
522*c8dee2aaSAndroid Build Coastguard Worker fit,
523*c8dee2aaSAndroid Build Coastguard Worker budgeted,
524*c8dee2aaSAndroid Build Coastguard Worker isProtected,
525*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags | extraFlags,
526*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
527*c8dee2aaSAndroid Build Coastguard Worker this->isDDLProvider(),
528*c8dee2aaSAndroid Build Coastguard Worker label));
529*c8dee2aaSAndroid Build Coastguard Worker }
530*c8dee2aaSAndroid Build Coastguard Worker
531*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureProxy(format,
532*c8dee2aaSAndroid Build Coastguard Worker dimensions,
533*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
534*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
535*c8dee2aaSAndroid Build Coastguard Worker fit,
536*c8dee2aaSAndroid Build Coastguard Worker budgeted,
537*c8dee2aaSAndroid Build Coastguard Worker isProtected,
538*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
539*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
540*c8dee2aaSAndroid Build Coastguard Worker this->isDDLProvider(),
541*c8dee2aaSAndroid Build Coastguard Worker label));
542*c8dee2aaSAndroid Build Coastguard Worker }
543*c8dee2aaSAndroid Build Coastguard Worker
createCompressedTextureProxy(SkISize dimensions,skgpu::Budgeted budgeted,skgpu::Mipmapped mipmapped,GrProtected isProtected,SkTextureCompressionType compressionType,sk_sp<SkData> data)544*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createCompressedTextureProxy(
545*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
546*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
547*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
548*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
549*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compressionType,
550*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data) {
551*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
552*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
553*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
554*c8dee2aaSAndroid Build Coastguard Worker }
555*c8dee2aaSAndroid Build Coastguard Worker
556*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->caps()->getBackendFormatFromCompressionType(compressionType);
557*c8dee2aaSAndroid Build Coastguard Worker
558*c8dee2aaSAndroid Build Coastguard Worker if (!this->caps()->isFormatTexturable(format, GrTextureType::k2D)) {
559*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
560*c8dee2aaSAndroid Build Coastguard Worker }
561*c8dee2aaSAndroid Build Coastguard Worker
562*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus = (skgpu::Mipmapped::kYes == mipmapped)
563*c8dee2aaSAndroid Build Coastguard Worker ? GrMipmapStatus::kValid
564*c8dee2aaSAndroid Build Coastguard Worker : GrMipmapStatus::kNotAllocated;
565*c8dee2aaSAndroid Build Coastguard Worker
566*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy = this->createLazyProxy(
567*c8dee2aaSAndroid Build Coastguard Worker [data](GrResourceProvider* resourceProvider, const LazySurfaceDesc& desc) {
568*c8dee2aaSAndroid Build Coastguard Worker return LazyCallbackResult(
569*c8dee2aaSAndroid Build Coastguard Worker resourceProvider->createCompressedTexture(desc.fDimensions,
570*c8dee2aaSAndroid Build Coastguard Worker desc.fFormat,
571*c8dee2aaSAndroid Build Coastguard Worker desc.fBudgeted,
572*c8dee2aaSAndroid Build Coastguard Worker desc.fMipmapped,
573*c8dee2aaSAndroid Build Coastguard Worker desc.fProtected,
574*c8dee2aaSAndroid Build Coastguard Worker data.get(),
575*c8dee2aaSAndroid Build Coastguard Worker desc.fLabel));
576*c8dee2aaSAndroid Build Coastguard Worker },
577*c8dee2aaSAndroid Build Coastguard Worker format,
578*c8dee2aaSAndroid Build Coastguard Worker dimensions,
579*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
580*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
581*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags::kReadOnly,
582*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact,
583*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes,
584*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
585*c8dee2aaSAndroid Build Coastguard Worker UseAllocator::kYes,
586*c8dee2aaSAndroid Build Coastguard Worker "ProxyProvider_CreateCompressedTextureProxy");
587*c8dee2aaSAndroid Build Coastguard Worker
588*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
589*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
590*c8dee2aaSAndroid Build Coastguard Worker }
591*c8dee2aaSAndroid Build Coastguard Worker
592*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
593*c8dee2aaSAndroid Build Coastguard Worker if (direct) {
594*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
595*c8dee2aaSAndroid Build Coastguard Worker // In order to reuse code we always create a lazy proxy. When we aren't in DDL mode however
596*c8dee2aaSAndroid Build Coastguard Worker // we're better off instantiating the proxy immediately here.
597*c8dee2aaSAndroid Build Coastguard Worker if (!proxy->priv().doLazyInstantiation(resourceProvider)) {
598*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
599*c8dee2aaSAndroid Build Coastguard Worker }
600*c8dee2aaSAndroid Build Coastguard Worker }
601*c8dee2aaSAndroid Build Coastguard Worker return proxy;
602*c8dee2aaSAndroid Build Coastguard Worker }
603*c8dee2aaSAndroid Build Coastguard Worker
wrapBackendTexture(const GrBackendTexture & backendTex,GrWrapOwnership ownership,GrWrapCacheable cacheable,GrIOType ioType,sk_sp<skgpu::RefCntedCallback> releaseHelper)604*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::wrapBackendTexture(
605*c8dee2aaSAndroid Build Coastguard Worker const GrBackendTexture& backendTex,
606*c8dee2aaSAndroid Build Coastguard Worker GrWrapOwnership ownership,
607*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable cacheable,
608*c8dee2aaSAndroid Build Coastguard Worker GrIOType ioType,
609*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> releaseHelper) {
610*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(ioType != kWrite_GrIOType);
611*c8dee2aaSAndroid Build Coastguard Worker
612*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
613*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
614*c8dee2aaSAndroid Build Coastguard Worker }
615*c8dee2aaSAndroid Build Coastguard Worker
616*c8dee2aaSAndroid Build Coastguard Worker // This is only supported on a direct GrContext.
617*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
618*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
619*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
620*c8dee2aaSAndroid Build Coastguard Worker }
621*c8dee2aaSAndroid Build Coastguard Worker
622*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
623*c8dee2aaSAndroid Build Coastguard Worker
624*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> tex =
625*c8dee2aaSAndroid Build Coastguard Worker resourceProvider->wrapBackendTexture(backendTex, ownership, cacheable, ioType);
626*c8dee2aaSAndroid Build Coastguard Worker if (!tex) {
627*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
628*c8dee2aaSAndroid Build Coastguard Worker }
629*c8dee2aaSAndroid Build Coastguard Worker
630*c8dee2aaSAndroid Build Coastguard Worker if (releaseHelper) {
631*c8dee2aaSAndroid Build Coastguard Worker tex->setRelease(std::move(releaseHelper));
632*c8dee2aaSAndroid Build Coastguard Worker }
633*c8dee2aaSAndroid Build Coastguard Worker
634*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!tex->asRenderTarget()); // Strictly a GrTexture
635*c8dee2aaSAndroid Build Coastguard Worker // Make sure we match how we created the proxy with skgpu::Budgeted::kNo
636*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(GrBudgetedType::kBudgeted != tex->resourcePriv().budgetedType());
637*c8dee2aaSAndroid Build Coastguard Worker
638*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(
639*c8dee2aaSAndroid Build Coastguard Worker new GrTextureProxy(std::move(tex), UseAllocator::kNo, this->isDDLProvider()));
640*c8dee2aaSAndroid Build Coastguard Worker }
641*c8dee2aaSAndroid Build Coastguard Worker
wrapCompressedBackendTexture(const GrBackendTexture & beTex,GrWrapOwnership ownership,GrWrapCacheable cacheable,sk_sp<skgpu::RefCntedCallback> releaseHelper)642*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::wrapCompressedBackendTexture(
643*c8dee2aaSAndroid Build Coastguard Worker const GrBackendTexture& beTex,
644*c8dee2aaSAndroid Build Coastguard Worker GrWrapOwnership ownership,
645*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable cacheable,
646*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> releaseHelper) {
647*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
648*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
649*c8dee2aaSAndroid Build Coastguard Worker }
650*c8dee2aaSAndroid Build Coastguard Worker
651*c8dee2aaSAndroid Build Coastguard Worker // This is only supported on a direct GrContext.
652*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
653*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
654*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
655*c8dee2aaSAndroid Build Coastguard Worker }
656*c8dee2aaSAndroid Build Coastguard Worker
657*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
658*c8dee2aaSAndroid Build Coastguard Worker
659*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> tex = resourceProvider->wrapCompressedBackendTexture(beTex, ownership,
660*c8dee2aaSAndroid Build Coastguard Worker cacheable);
661*c8dee2aaSAndroid Build Coastguard Worker if (!tex) {
662*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
663*c8dee2aaSAndroid Build Coastguard Worker }
664*c8dee2aaSAndroid Build Coastguard Worker
665*c8dee2aaSAndroid Build Coastguard Worker if (releaseHelper) {
666*c8dee2aaSAndroid Build Coastguard Worker tex->setRelease(std::move(releaseHelper));
667*c8dee2aaSAndroid Build Coastguard Worker }
668*c8dee2aaSAndroid Build Coastguard Worker
669*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!tex->asRenderTarget()); // Strictly a GrTexture
670*c8dee2aaSAndroid Build Coastguard Worker // Make sure we match how we created the proxy with skgpu::Budgeted::kNo
671*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(GrBudgetedType::kBudgeted != tex->resourcePriv().budgetedType());
672*c8dee2aaSAndroid Build Coastguard Worker
673*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(
674*c8dee2aaSAndroid Build Coastguard Worker new GrTextureProxy(std::move(tex), UseAllocator::kNo, this->isDDLProvider()));
675*c8dee2aaSAndroid Build Coastguard Worker }
676*c8dee2aaSAndroid Build Coastguard Worker
wrapRenderableBackendTexture(const GrBackendTexture & backendTex,int sampleCnt,GrWrapOwnership ownership,GrWrapCacheable cacheable,sk_sp<skgpu::RefCntedCallback> releaseHelper)677*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::wrapRenderableBackendTexture(
678*c8dee2aaSAndroid Build Coastguard Worker const GrBackendTexture& backendTex,
679*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt,
680*c8dee2aaSAndroid Build Coastguard Worker GrWrapOwnership ownership,
681*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable cacheable,
682*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> releaseHelper) {
683*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
684*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
685*c8dee2aaSAndroid Build Coastguard Worker }
686*c8dee2aaSAndroid Build Coastguard Worker
687*c8dee2aaSAndroid Build Coastguard Worker // This is only supported on a direct GrContext.
688*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
689*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
690*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
691*c8dee2aaSAndroid Build Coastguard Worker }
692*c8dee2aaSAndroid Build Coastguard Worker
693*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = this->caps();
694*c8dee2aaSAndroid Build Coastguard Worker
695*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
696*c8dee2aaSAndroid Build Coastguard Worker
697*c8dee2aaSAndroid Build Coastguard Worker sampleCnt = caps->getRenderTargetSampleCount(sampleCnt, backendTex.getBackendFormat());
698*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(sampleCnt);
699*c8dee2aaSAndroid Build Coastguard Worker
700*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> tex = resourceProvider->wrapRenderableBackendTexture(
701*c8dee2aaSAndroid Build Coastguard Worker backendTex, sampleCnt, ownership, cacheable);
702*c8dee2aaSAndroid Build Coastguard Worker if (!tex) {
703*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
704*c8dee2aaSAndroid Build Coastguard Worker }
705*c8dee2aaSAndroid Build Coastguard Worker
706*c8dee2aaSAndroid Build Coastguard Worker if (releaseHelper) {
707*c8dee2aaSAndroid Build Coastguard Worker tex->setRelease(std::move(releaseHelper));
708*c8dee2aaSAndroid Build Coastguard Worker }
709*c8dee2aaSAndroid Build Coastguard Worker
710*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(tex->asRenderTarget()); // A GrTextureRenderTarget
711*c8dee2aaSAndroid Build Coastguard Worker // Make sure we match how we created the proxy with skgpu::Budgeted::kNo
712*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(GrBudgetedType::kBudgeted != tex->resourcePriv().budgetedType());
713*c8dee2aaSAndroid Build Coastguard Worker
714*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureRenderTargetProxy(
715*c8dee2aaSAndroid Build Coastguard Worker std::move(tex), UseAllocator::kNo, this->isDDLProvider()));
716*c8dee2aaSAndroid Build Coastguard Worker }
717*c8dee2aaSAndroid Build Coastguard Worker
resourceProvider() const718*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* GrProxyProvider::resourceProvider() const {
719*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* direct = fImageContext->asDirectContext();
720*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
721*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
722*c8dee2aaSAndroid Build Coastguard Worker }
723*c8dee2aaSAndroid Build Coastguard Worker
724*c8dee2aaSAndroid Build Coastguard Worker return direct->priv().resourceProvider();
725*c8dee2aaSAndroid Build Coastguard Worker }
726*c8dee2aaSAndroid Build Coastguard Worker
wrapBackendRenderTarget(const GrBackendRenderTarget & backendRT,sk_sp<skgpu::RefCntedCallback> releaseHelper)727*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy> GrProxyProvider::wrapBackendRenderTarget(
728*c8dee2aaSAndroid Build Coastguard Worker const GrBackendRenderTarget& backendRT,
729*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> releaseHelper) {
730*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
731*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
732*c8dee2aaSAndroid Build Coastguard Worker }
733*c8dee2aaSAndroid Build Coastguard Worker
734*c8dee2aaSAndroid Build Coastguard Worker // This is only supported on a direct GrContext.
735*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
736*c8dee2aaSAndroid Build Coastguard Worker if (!direct) {
737*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
738*c8dee2aaSAndroid Build Coastguard Worker }
739*c8dee2aaSAndroid Build Coastguard Worker
740*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
741*c8dee2aaSAndroid Build Coastguard Worker
742*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTarget> rt = resourceProvider->wrapBackendRenderTarget(backendRT);
743*c8dee2aaSAndroid Build Coastguard Worker if (!rt) {
744*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
745*c8dee2aaSAndroid Build Coastguard Worker }
746*c8dee2aaSAndroid Build Coastguard Worker
747*c8dee2aaSAndroid Build Coastguard Worker if (releaseHelper) {
748*c8dee2aaSAndroid Build Coastguard Worker rt->setRelease(std::move(releaseHelper));
749*c8dee2aaSAndroid Build Coastguard Worker }
750*c8dee2aaSAndroid Build Coastguard Worker
751*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!rt->asTexture()); // A GrRenderTarget that's not textureable
752*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!rt->getUniqueKey().isValid());
753*c8dee2aaSAndroid Build Coastguard Worker // Make sure we match how we created the proxy with skgpu::Budgeted::kNo
754*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(GrBudgetedType::kBudgeted != rt->resourcePriv().budgetedType());
755*c8dee2aaSAndroid Build Coastguard Worker
756*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrRenderTargetProxy>(
757*c8dee2aaSAndroid Build Coastguard Worker new GrRenderTargetProxy(std::move(rt), UseAllocator::kNo, {}));
758*c8dee2aaSAndroid Build Coastguard Worker }
759*c8dee2aaSAndroid Build Coastguard Worker
CreatePromiseProxy(GrContextThreadSafeProxy * threadSafeProxy,LazyInstantiateCallback && callback,const GrBackendFormat & format,SkISize dimensions,skgpu::Mipmapped mipmapped)760*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::CreatePromiseProxy(GrContextThreadSafeProxy* threadSafeProxy,
761*c8dee2aaSAndroid Build Coastguard Worker LazyInstantiateCallback&& callback,
762*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
763*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
764*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped) {
765*c8dee2aaSAndroid Build Coastguard Worker if (threadSafeProxy->priv().abandoned()) {
766*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
767*c8dee2aaSAndroid Build Coastguard Worker }
768*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((dimensions.fWidth <= 0 && dimensions.fHeight <= 0) ||
769*c8dee2aaSAndroid Build Coastguard Worker (dimensions.fWidth > 0 && dimensions.fHeight > 0));
770*c8dee2aaSAndroid Build Coastguard Worker
771*c8dee2aaSAndroid Build Coastguard Worker if (dimensions.fWidth > threadSafeProxy->priv().caps()->maxTextureSize() ||
772*c8dee2aaSAndroid Build Coastguard Worker dimensions.fHeight > threadSafeProxy->priv().caps()->maxTextureSize()) {
773*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
774*c8dee2aaSAndroid Build Coastguard Worker }
775*c8dee2aaSAndroid Build Coastguard Worker if (!threadSafeProxy->priv().caps()->isFormatTexturable(format, format.textureType())) {
776*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
777*c8dee2aaSAndroid Build Coastguard Worker }
778*c8dee2aaSAndroid Build Coastguard Worker // Ganesh assumes that, when wrapping a mipmapped backend texture from a client, that its
779*c8dee2aaSAndroid Build Coastguard Worker // mipmaps are fully fleshed out.
780*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus = (skgpu::Mipmapped::kYes == mipmapped)
781*c8dee2aaSAndroid Build Coastguard Worker ? GrMipmapStatus::kValid
782*c8dee2aaSAndroid Build Coastguard Worker : GrMipmapStatus::kNotAllocated;
783*c8dee2aaSAndroid Build Coastguard Worker
784*c8dee2aaSAndroid Build Coastguard Worker // We pass kReadOnly here since we should treat content of the client's texture as immutable.
785*c8dee2aaSAndroid Build Coastguard Worker // The promise API provides no way for the client to indicate that the texture is protected.
786*c8dee2aaSAndroid Build Coastguard Worker auto proxy = sk_sp<GrTextureProxy>(new GrTextureProxy(std::move(callback),
787*c8dee2aaSAndroid Build Coastguard Worker format,
788*c8dee2aaSAndroid Build Coastguard Worker dimensions,
789*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
790*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
791*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact,
792*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
793*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
794*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags::kReadOnly,
795*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy::UseAllocator::kYes,
796*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider::kYes,
797*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"PromiseProxy"));
798*c8dee2aaSAndroid Build Coastguard Worker proxy->priv().setIsPromiseProxy();
799*c8dee2aaSAndroid Build Coastguard Worker return proxy;
800*c8dee2aaSAndroid Build Coastguard Worker }
801*c8dee2aaSAndroid Build Coastguard Worker
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)802*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::createLazyProxy(LazyInstantiateCallback&& callback,
803*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
804*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
805*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
806*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus,
807*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags,
808*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
809*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
810*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
811*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy::UseAllocator useAllocator,
812*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
813*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
814*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
815*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
816*c8dee2aaSAndroid Build Coastguard Worker }
817*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((dimensions.fWidth <= 0 && dimensions.fHeight <= 0) ||
818*c8dee2aaSAndroid Build Coastguard Worker (dimensions.fWidth > 0 && dimensions.fHeight > 0));
819*c8dee2aaSAndroid Build Coastguard Worker
820*c8dee2aaSAndroid Build Coastguard Worker if (!format.isValid() || format.backend() != fImageContext->backend()) {
821*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
822*c8dee2aaSAndroid Build Coastguard Worker }
823*c8dee2aaSAndroid Build Coastguard Worker
824*c8dee2aaSAndroid Build Coastguard Worker if (dimensions.fWidth > this->caps()->maxTextureSize() ||
825*c8dee2aaSAndroid Build Coastguard Worker dimensions.fHeight > this->caps()->maxTextureSize()) {
826*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
827*c8dee2aaSAndroid Build Coastguard Worker }
828*c8dee2aaSAndroid Build Coastguard Worker
829*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureProxy(std::move(callback),
830*c8dee2aaSAndroid Build Coastguard Worker format,
831*c8dee2aaSAndroid Build Coastguard Worker dimensions,
832*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
833*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
834*c8dee2aaSAndroid Build Coastguard Worker fit,
835*c8dee2aaSAndroid Build Coastguard Worker budgeted,
836*c8dee2aaSAndroid Build Coastguard Worker isProtected,
837*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
838*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
839*c8dee2aaSAndroid Build Coastguard Worker this->isDDLProvider(),
840*c8dee2aaSAndroid Build Coastguard Worker label));
841*c8dee2aaSAndroid Build Coastguard Worker }
842*c8dee2aaSAndroid Build Coastguard Worker
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)843*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTargetProxy> GrProxyProvider::createLazyRenderTargetProxy(
844*c8dee2aaSAndroid Build Coastguard Worker LazyInstantiateCallback&& callback,
845*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
846*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
847*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt,
848*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags,
849*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo* textureInfo,
850*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus,
851*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
852*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
853*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
854*c8dee2aaSAndroid Build Coastguard Worker bool wrapsVkSecondaryCB,
855*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator) {
856*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
857*c8dee2aaSAndroid Build Coastguard Worker if (this->isAbandoned()) {
858*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
859*c8dee2aaSAndroid Build Coastguard Worker }
860*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((dimensions.fWidth <= 0 && dimensions.fHeight <= 0) ||
861*c8dee2aaSAndroid Build Coastguard Worker (dimensions.fWidth > 0 && dimensions.fHeight > 0));
862*c8dee2aaSAndroid Build Coastguard Worker
863*c8dee2aaSAndroid Build Coastguard Worker if (dimensions.fWidth > this->caps()->maxRenderTargetSize() ||
864*c8dee2aaSAndroid Build Coastguard Worker dimensions.fHeight > this->caps()->maxRenderTargetSize()) {
865*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
866*c8dee2aaSAndroid Build Coastguard Worker }
867*c8dee2aaSAndroid Build Coastguard Worker
868*c8dee2aaSAndroid Build Coastguard Worker if (textureInfo) {
869*c8dee2aaSAndroid Build Coastguard Worker // Wrapped vulkan secondary command buffers don't support texturing since we won't have an
870*c8dee2aaSAndroid Build Coastguard Worker // actual VkImage to texture from.
871*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!wrapsVkSecondaryCB);
872*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrRenderTargetProxy>(new GrTextureRenderTargetProxy(
873*c8dee2aaSAndroid Build Coastguard Worker *this->caps(),
874*c8dee2aaSAndroid Build Coastguard Worker std::move(callback),
875*c8dee2aaSAndroid Build Coastguard Worker format,
876*c8dee2aaSAndroid Build Coastguard Worker dimensions,
877*c8dee2aaSAndroid Build Coastguard Worker sampleCnt,
878*c8dee2aaSAndroid Build Coastguard Worker textureInfo->fMipmapped,
879*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
880*c8dee2aaSAndroid Build Coastguard Worker fit,
881*c8dee2aaSAndroid Build Coastguard Worker budgeted,
882*c8dee2aaSAndroid Build Coastguard Worker isProtected,
883*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
884*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
885*c8dee2aaSAndroid Build Coastguard Worker this->isDDLProvider(),
886*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"TextureRenderTarget_LazyRenderTargetProxy"));
887*c8dee2aaSAndroid Build Coastguard Worker }
888*c8dee2aaSAndroid Build Coastguard Worker
889*c8dee2aaSAndroid Build Coastguard Worker GrRenderTargetProxy::WrapsVkSecondaryCB vkSCB =
890*c8dee2aaSAndroid Build Coastguard Worker wrapsVkSecondaryCB ? GrRenderTargetProxy::WrapsVkSecondaryCB::kYes
891*c8dee2aaSAndroid Build Coastguard Worker : GrRenderTargetProxy::WrapsVkSecondaryCB::kNo;
892*c8dee2aaSAndroid Build Coastguard Worker
893*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrRenderTargetProxy>(
894*c8dee2aaSAndroid Build Coastguard Worker new GrRenderTargetProxy(std::move(callback),
895*c8dee2aaSAndroid Build Coastguard Worker format,
896*c8dee2aaSAndroid Build Coastguard Worker dimensions,
897*c8dee2aaSAndroid Build Coastguard Worker sampleCnt,
898*c8dee2aaSAndroid Build Coastguard Worker fit,
899*c8dee2aaSAndroid Build Coastguard Worker budgeted,
900*c8dee2aaSAndroid Build Coastguard Worker isProtected,
901*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
902*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
903*c8dee2aaSAndroid Build Coastguard Worker vkSCB,
904*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"RenderTargetProxy_LazyRenderTargetProxy"));
905*c8dee2aaSAndroid Build Coastguard Worker }
906*c8dee2aaSAndroid Build Coastguard Worker
MakeFullyLazyProxy(LazyInstantiateCallback && callback,const GrBackendFormat & format,GrRenderable renderable,int renderTargetSampleCnt,GrProtected isProtected,const GrCaps & caps,UseAllocator useAllocator)907*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> GrProxyProvider::MakeFullyLazyProxy(LazyInstantiateCallback&& callback,
908*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
909*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
910*c8dee2aaSAndroid Build Coastguard Worker int renderTargetSampleCnt,
911*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
912*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps,
913*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator) {
914*c8dee2aaSAndroid Build Coastguard Worker if (!format.isValid()) {
915*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
916*c8dee2aaSAndroid Build Coastguard Worker }
917*c8dee2aaSAndroid Build Coastguard Worker
918*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(renderTargetSampleCnt == 1 || renderable == GrRenderable::kYes);
919*c8dee2aaSAndroid Build Coastguard Worker // TODO: If we ever have callers requesting specific surface flags then we shouldn't use the
920*c8dee2aaSAndroid Build Coastguard Worker // extra deferred flags here. Instead those callers should all pass in exactly what they want.
921*c8dee2aaSAndroid Build Coastguard Worker // However, as of today all uses of this essentially create a deferred proxy in the end.
922*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags = caps.getExtraSurfaceFlagsForDeferredRT();
923*c8dee2aaSAndroid Build Coastguard Worker
924*c8dee2aaSAndroid Build Coastguard Worker // MakeFullyLazyProxy is only called at flush time so we know these texture proxies are
925*c8dee2aaSAndroid Build Coastguard Worker // not being created by a DDL provider.
926*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkISize kLazyDims = {-1, -1};
927*c8dee2aaSAndroid Build Coastguard Worker if (GrRenderable::kYes == renderable) {
928*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(
929*c8dee2aaSAndroid Build Coastguard Worker new GrTextureRenderTargetProxy(caps,
930*c8dee2aaSAndroid Build Coastguard Worker std::move(callback),
931*c8dee2aaSAndroid Build Coastguard Worker format,
932*c8dee2aaSAndroid Build Coastguard Worker kLazyDims,
933*c8dee2aaSAndroid Build Coastguard Worker renderTargetSampleCnt,
934*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
935*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus::kNotAllocated,
936*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kApprox,
937*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes,
938*c8dee2aaSAndroid Build Coastguard Worker isProtected,
939*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
940*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
941*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider::kNo,
942*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"TextureRenderTarget_FullyLazyProxy"));
943*c8dee2aaSAndroid Build Coastguard Worker } else {
944*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrTextureProxy>(new GrTextureProxy(std::move(callback),
945*c8dee2aaSAndroid Build Coastguard Worker format,
946*c8dee2aaSAndroid Build Coastguard Worker kLazyDims,
947*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
948*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus::kNotAllocated,
949*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kApprox,
950*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes,
951*c8dee2aaSAndroid Build Coastguard Worker isProtected,
952*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
953*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
954*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider::kNo,
955*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"Texture_FullyLazyProxy"));
956*c8dee2aaSAndroid Build Coastguard Worker }
957*c8dee2aaSAndroid Build Coastguard Worker }
958*c8dee2aaSAndroid Build Coastguard Worker
processInvalidUniqueKey(const skgpu::UniqueKey & key,GrTextureProxy * proxy,InvalidateGPUResource invalidateGPUResource)959*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::processInvalidUniqueKey(const skgpu::UniqueKey& key,
960*c8dee2aaSAndroid Build Coastguard Worker GrTextureProxy* proxy,
961*c8dee2aaSAndroid Build Coastguard Worker InvalidateGPUResource invalidateGPUResource) {
962*c8dee2aaSAndroid Build Coastguard Worker this->processInvalidUniqueKeyImpl(key, proxy, invalidateGPUResource, RemoveTableEntry::kYes);
963*c8dee2aaSAndroid Build Coastguard Worker }
964*c8dee2aaSAndroid Build Coastguard Worker
processInvalidUniqueKeyImpl(const skgpu::UniqueKey & key,GrTextureProxy * proxy,InvalidateGPUResource invalidateGPUResource,RemoveTableEntry removeTableEntry)965*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::processInvalidUniqueKeyImpl(const skgpu::UniqueKey& key,
966*c8dee2aaSAndroid Build Coastguard Worker GrTextureProxy* proxy,
967*c8dee2aaSAndroid Build Coastguard Worker InvalidateGPUResource invalidateGPUResource,
968*c8dee2aaSAndroid Build Coastguard Worker RemoveTableEntry removeTableEntry) {
969*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(key.isValid());
970*c8dee2aaSAndroid Build Coastguard Worker
971*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
972*c8dee2aaSAndroid Build Coastguard Worker proxy = fUniquelyKeyedProxies.find(key);
973*c8dee2aaSAndroid Build Coastguard Worker }
974*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!proxy || proxy->getUniqueKey() == key);
975*c8dee2aaSAndroid Build Coastguard Worker
976*c8dee2aaSAndroid Build Coastguard Worker // Locate the corresponding GrGpuResource (if it needs to be invalidated) before clearing the
977*c8dee2aaSAndroid Build Coastguard Worker // proxy's unique key. We must do it in this order because 'key' may alias the proxy's key.
978*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuResource> invalidGpuResource;
979*c8dee2aaSAndroid Build Coastguard Worker if (InvalidateGPUResource::kYes == invalidateGPUResource) {
980*c8dee2aaSAndroid Build Coastguard Worker auto direct = fImageContext->asDirectContext();
981*c8dee2aaSAndroid Build Coastguard Worker if (direct) {
982*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = direct->priv().resourceProvider();
983*c8dee2aaSAndroid Build Coastguard Worker invalidGpuResource = resourceProvider->findByUniqueKey<GrGpuResource>(key);
984*c8dee2aaSAndroid Build Coastguard Worker }
985*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!invalidGpuResource || invalidGpuResource->getUniqueKey() == key);
986*c8dee2aaSAndroid Build Coastguard Worker }
987*c8dee2aaSAndroid Build Coastguard Worker
988*c8dee2aaSAndroid Build Coastguard Worker // Note: this method is called for the whole variety of GrGpuResources so often 'key'
989*c8dee2aaSAndroid Build Coastguard Worker // will not be in 'fUniquelyKeyedProxies'.
990*c8dee2aaSAndroid Build Coastguard Worker if (proxy) {
991*c8dee2aaSAndroid Build Coastguard Worker if (removeTableEntry == RemoveTableEntry::kYes) {
992*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.remove(key);
993*c8dee2aaSAndroid Build Coastguard Worker }
994*c8dee2aaSAndroid Build Coastguard Worker proxy->cacheAccess().clearUniqueKey();
995*c8dee2aaSAndroid Build Coastguard Worker }
996*c8dee2aaSAndroid Build Coastguard Worker
997*c8dee2aaSAndroid Build Coastguard Worker if (invalidGpuResource) {
998*c8dee2aaSAndroid Build Coastguard Worker invalidGpuResource->resourcePriv().removeUniqueKey();
999*c8dee2aaSAndroid Build Coastguard Worker }
1000*c8dee2aaSAndroid Build Coastguard Worker }
1001*c8dee2aaSAndroid Build Coastguard Worker
isDDLProvider() const1002*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider GrProxyProvider::isDDLProvider() const {
1003*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->asDirectContext() ? GrDDLProvider::kNo : GrDDLProvider::kYes;
1004*c8dee2aaSAndroid Build Coastguard Worker }
1005*c8dee2aaSAndroid Build Coastguard Worker
contextID() const1006*c8dee2aaSAndroid Build Coastguard Worker uint32_t GrProxyProvider::contextID() const {
1007*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->priv().contextID();
1008*c8dee2aaSAndroid Build Coastguard Worker }
1009*c8dee2aaSAndroid Build Coastguard Worker
caps() const1010*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* GrProxyProvider::caps() const {
1011*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->priv().caps();
1012*c8dee2aaSAndroid Build Coastguard Worker }
1013*c8dee2aaSAndroid Build Coastguard Worker
refCaps() const1014*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrCaps> GrProxyProvider::refCaps() const {
1015*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->priv().refCaps();
1016*c8dee2aaSAndroid Build Coastguard Worker }
1017*c8dee2aaSAndroid Build Coastguard Worker
isAbandoned() const1018*c8dee2aaSAndroid Build Coastguard Worker bool GrProxyProvider::isAbandoned() const {
1019*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->priv().abandoned();
1020*c8dee2aaSAndroid Build Coastguard Worker }
1021*c8dee2aaSAndroid Build Coastguard Worker
orphanAllUniqueKeys()1022*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::orphanAllUniqueKeys() {
1023*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.foreach([&](GrTextureProxy* proxy){
1024*c8dee2aaSAndroid Build Coastguard Worker proxy->fProxyProvider = nullptr;
1025*c8dee2aaSAndroid Build Coastguard Worker });
1026*c8dee2aaSAndroid Build Coastguard Worker }
1027*c8dee2aaSAndroid Build Coastguard Worker
removeAllUniqueKeys()1028*c8dee2aaSAndroid Build Coastguard Worker void GrProxyProvider::removeAllUniqueKeys() {
1029*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.foreach([&](GrTextureProxy* proxy){
1030*c8dee2aaSAndroid Build Coastguard Worker // It's not safe to remove table entries while iterating with foreach(),
1031*c8dee2aaSAndroid Build Coastguard Worker // but since we're going to remove them all anyway, simply save that for the end.
1032*c8dee2aaSAndroid Build Coastguard Worker this->processInvalidUniqueKeyImpl(proxy->getUniqueKey(), proxy,
1033*c8dee2aaSAndroid Build Coastguard Worker InvalidateGPUResource::kNo,
1034*c8dee2aaSAndroid Build Coastguard Worker RemoveTableEntry::kNo);
1035*c8dee2aaSAndroid Build Coastguard Worker });
1036*c8dee2aaSAndroid Build Coastguard Worker // Removing all those table entries is safe now.
1037*c8dee2aaSAndroid Build Coastguard Worker fUniquelyKeyedProxies.reset();
1038*c8dee2aaSAndroid Build Coastguard Worker }
1039*c8dee2aaSAndroid Build Coastguard Worker
renderingDirectly() const1040*c8dee2aaSAndroid Build Coastguard Worker bool GrProxyProvider::renderingDirectly() const {
1041*c8dee2aaSAndroid Build Coastguard Worker return fImageContext->asDirectContext();
1042*c8dee2aaSAndroid Build Coastguard Worker }
1043