1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 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/GrTextureRenderTargetProxy.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ResourceKey.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormat;
27*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider;
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker // Deferred version
30*c8dee2aaSAndroid Build Coastguard Worker // This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
31*c8dee2aaSAndroid Build Coastguard Worker // GrRenderTargetProxy) so its constructor must be explicitly called.
GrTextureRenderTargetProxy(const GrCaps & caps,const GrBackendFormat & format,SkISize dimensions,int sampleCnt,skgpu::Mipmapped mipmapped,GrMipmapStatus mipmapStatus,SkBackingFit fit,skgpu::Budgeted budgeted,GrProtected isProtected,GrInternalSurfaceFlags surfaceFlags,UseAllocator useAllocator,GrDDLProvider creatingProvider,std::string_view label)32*c8dee2aaSAndroid Build Coastguard Worker GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps,
33*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
34*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
35*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt,
36*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
37*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus,
38*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
39*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
40*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
41*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags,
42*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator,
43*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider creatingProvider,
44*c8dee2aaSAndroid Build Coastguard Worker std::string_view label)
45*c8dee2aaSAndroid Build Coastguard Worker : GrSurfaceProxy(
46*c8dee2aaSAndroid Build Coastguard Worker format, dimensions, fit, budgeted, isProtected, surfaceFlags, useAllocator, label)
47*c8dee2aaSAndroid Build Coastguard Worker // for now textures w/ data are always wrapped
48*c8dee2aaSAndroid Build Coastguard Worker , GrRenderTargetProxy(caps,
49*c8dee2aaSAndroid Build Coastguard Worker format,
50*c8dee2aaSAndroid Build Coastguard Worker dimensions,
51*c8dee2aaSAndroid Build Coastguard Worker sampleCnt,
52*c8dee2aaSAndroid Build Coastguard Worker fit,
53*c8dee2aaSAndroid Build Coastguard Worker budgeted,
54*c8dee2aaSAndroid Build Coastguard Worker isProtected,
55*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
56*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
57*c8dee2aaSAndroid Build Coastguard Worker label)
58*c8dee2aaSAndroid Build Coastguard Worker , GrTextureProxy(format,
59*c8dee2aaSAndroid Build Coastguard Worker dimensions,
60*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
61*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
62*c8dee2aaSAndroid Build Coastguard Worker fit,
63*c8dee2aaSAndroid Build Coastguard Worker budgeted,
64*c8dee2aaSAndroid Build Coastguard Worker isProtected,
65*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
66*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
67*c8dee2aaSAndroid Build Coastguard Worker creatingProvider,
68*c8dee2aaSAndroid Build Coastguard Worker label) {
69*c8dee2aaSAndroid Build Coastguard Worker this->initSurfaceFlags(caps);
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker // Lazy-callback version
GrTextureRenderTargetProxy(const GrCaps & caps,LazyInstantiateCallback && callback,const GrBackendFormat & format,SkISize dimensions,int sampleCnt,skgpu::Mipmapped mipmapped,GrMipmapStatus mipmapStatus,SkBackingFit fit,skgpu::Budgeted budgeted,GrProtected isProtected,GrInternalSurfaceFlags surfaceFlags,UseAllocator useAllocator,GrDDLProvider creatingProvider,std::string_view label)73*c8dee2aaSAndroid Build Coastguard Worker GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps,
74*c8dee2aaSAndroid Build Coastguard Worker LazyInstantiateCallback&& callback,
75*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format,
76*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
77*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt,
78*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
79*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus mipmapStatus,
80*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
81*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted,
82*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
83*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags,
84*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator,
85*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider creatingProvider,
86*c8dee2aaSAndroid Build Coastguard Worker std::string_view label)
87*c8dee2aaSAndroid Build Coastguard Worker : GrSurfaceProxy(std::move(callback),
88*c8dee2aaSAndroid Build Coastguard Worker format,
89*c8dee2aaSAndroid Build Coastguard Worker dimensions,
90*c8dee2aaSAndroid Build Coastguard Worker fit,
91*c8dee2aaSAndroid Build Coastguard Worker budgeted,
92*c8dee2aaSAndroid Build Coastguard Worker isProtected,
93*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
94*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
95*c8dee2aaSAndroid Build Coastguard Worker label)
96*c8dee2aaSAndroid Build Coastguard Worker // Since we have virtual inheritance, we initialize GrSurfaceProxy directly. Send null
97*c8dee2aaSAndroid Build Coastguard Worker // callbacks to the texture and RT proxies simply to route to the appropriate constructors.
98*c8dee2aaSAndroid Build Coastguard Worker , GrRenderTargetProxy(LazyInstantiateCallback(),
99*c8dee2aaSAndroid Build Coastguard Worker format,
100*c8dee2aaSAndroid Build Coastguard Worker dimensions,
101*c8dee2aaSAndroid Build Coastguard Worker sampleCnt,
102*c8dee2aaSAndroid Build Coastguard Worker fit,
103*c8dee2aaSAndroid Build Coastguard Worker budgeted,
104*c8dee2aaSAndroid Build Coastguard Worker isProtected,
105*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
106*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
107*c8dee2aaSAndroid Build Coastguard Worker WrapsVkSecondaryCB::kNo,
108*c8dee2aaSAndroid Build Coastguard Worker label)
109*c8dee2aaSAndroid Build Coastguard Worker , GrTextureProxy(LazyInstantiateCallback(),
110*c8dee2aaSAndroid Build Coastguard Worker format,
111*c8dee2aaSAndroid Build Coastguard Worker dimensions,
112*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
113*c8dee2aaSAndroid Build Coastguard Worker mipmapStatus,
114*c8dee2aaSAndroid Build Coastguard Worker fit,
115*c8dee2aaSAndroid Build Coastguard Worker budgeted,
116*c8dee2aaSAndroid Build Coastguard Worker isProtected,
117*c8dee2aaSAndroid Build Coastguard Worker surfaceFlags,
118*c8dee2aaSAndroid Build Coastguard Worker useAllocator,
119*c8dee2aaSAndroid Build Coastguard Worker creatingProvider,
120*c8dee2aaSAndroid Build Coastguard Worker label) {
121*c8dee2aaSAndroid Build Coastguard Worker this->initSurfaceFlags(caps);
122*c8dee2aaSAndroid Build Coastguard Worker }
123*c8dee2aaSAndroid Build Coastguard Worker
124*c8dee2aaSAndroid Build Coastguard Worker // Wrapped version
125*c8dee2aaSAndroid Build Coastguard Worker // This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
126*c8dee2aaSAndroid Build Coastguard Worker // GrRenderTargetProxy) so its constructor must be explicitly called.
GrTextureRenderTargetProxy(sk_sp<GrSurface> surf,UseAllocator useAllocator,GrDDLProvider creatingProvider)127*c8dee2aaSAndroid Build Coastguard Worker GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf,
128*c8dee2aaSAndroid Build Coastguard Worker UseAllocator useAllocator,
129*c8dee2aaSAndroid Build Coastguard Worker GrDDLProvider creatingProvider)
130*c8dee2aaSAndroid Build Coastguard Worker : GrSurfaceProxy(surf, SkBackingFit::kExact, useAllocator)
131*c8dee2aaSAndroid Build Coastguard Worker , GrRenderTargetProxy(surf, useAllocator)
132*c8dee2aaSAndroid Build Coastguard Worker , GrTextureProxy(surf, useAllocator, creatingProvider) {
133*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surf->asTexture());
134*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surf->asRenderTarget());
135*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fSurfaceFlags == fTarget->flags());
136*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((this->numSamples() <= 1 ||
137*c8dee2aaSAndroid Build Coastguard Worker fTarget->getContext()->priv().caps()->msaaResolvesAutomatically()) !=
138*c8dee2aaSAndroid Build Coastguard Worker this->requiresManualMSAAResolve());
139*c8dee2aaSAndroid Build Coastguard Worker }
140*c8dee2aaSAndroid Build Coastguard Worker
initSurfaceFlags(const GrCaps & caps)141*c8dee2aaSAndroid Build Coastguard Worker void GrTextureRenderTargetProxy::initSurfaceFlags(const GrCaps& caps) {
142*c8dee2aaSAndroid Build Coastguard Worker // FBO 0 should never be wrapped as a texture render target.
143*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->glRTFBOIDIs0());
144*c8dee2aaSAndroid Build Coastguard Worker if (this->numSamples() > 1 && !caps.msaaResolvesAutomatically()) {
145*c8dee2aaSAndroid Build Coastguard Worker // MSAA texture-render-targets always require manual resolve if we are not using a
146*c8dee2aaSAndroid Build Coastguard Worker // multisampled-render-to-texture extension.
147*c8dee2aaSAndroid Build Coastguard Worker //
148*c8dee2aaSAndroid Build Coastguard Worker // NOTE: This is the only instance where we need to set the manual resolve flag on a proxy.
149*c8dee2aaSAndroid Build Coastguard Worker // Any other proxies that require manual resolve (e.g., wrapRenderableBackendTexture() with
150*c8dee2aaSAndroid Build Coastguard Worker // a sample count) will be wrapped, and the wrapped version of the GrSurface constructor
151*c8dee2aaSAndroid Build Coastguard Worker // will automatically get the manual resolve flag when copying the target GrSurface's flags.
152*c8dee2aaSAndroid Build Coastguard Worker fSurfaceFlags |= GrInternalSurfaceFlags::kRequiresManualMSAAResolve;
153*c8dee2aaSAndroid Build Coastguard Worker }
154*c8dee2aaSAndroid Build Coastguard Worker }
155*c8dee2aaSAndroid Build Coastguard Worker
onUninstantiatedGpuMemorySize() const156*c8dee2aaSAndroid Build Coastguard Worker size_t GrTextureRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
157*c8dee2aaSAndroid Build Coastguard Worker int colorSamplesPerPixel = this->numSamples();
158*c8dee2aaSAndroid Build Coastguard Worker if (colorSamplesPerPixel > 1) {
159*c8dee2aaSAndroid Build Coastguard Worker // Add one to account for the resolve buffer.
160*c8dee2aaSAndroid Build Coastguard Worker ++colorSamplesPerPixel;
161*c8dee2aaSAndroid Build Coastguard Worker }
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Worker // TODO: do we have enough information to improve this worst case estimate?
164*c8dee2aaSAndroid Build Coastguard Worker return GrSurface::ComputeSize(this->backendFormat(), this->dimensions(),
165*c8dee2aaSAndroid Build Coastguard Worker colorSamplesPerPixel, this->proxyMipmapped(),
166*c8dee2aaSAndroid Build Coastguard Worker !this->priv().isExact());
167*c8dee2aaSAndroid Build Coastguard Worker }
168*c8dee2aaSAndroid Build Coastguard Worker
instantiate(GrResourceProvider * resourceProvider)169*c8dee2aaSAndroid Build Coastguard Worker bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
170*c8dee2aaSAndroid Build Coastguard Worker if (this->isLazy()) {
171*c8dee2aaSAndroid Build Coastguard Worker return false;
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker const skgpu::UniqueKey& key = this->getUniqueKey();
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker if (!this->instantiateImpl(resourceProvider, this->numSamples(), GrRenderable::kYes,
177*c8dee2aaSAndroid Build Coastguard Worker this->mipmapped(), key.isValid() ? &key : nullptr)) {
178*c8dee2aaSAndroid Build Coastguard Worker return false;
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker if (key.isValid()) {
181*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(key == this->getUniqueKey());
182*c8dee2aaSAndroid Build Coastguard Worker }
183*c8dee2aaSAndroid Build Coastguard Worker
184*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->peekRenderTarget());
185*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->peekTexture());
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker return true;
188*c8dee2aaSAndroid Build Coastguard Worker }
189*c8dee2aaSAndroid Build Coastguard Worker
createSurface(GrResourceProvider * resourceProvider) const190*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> GrTextureRenderTargetProxy::createSurface(
191*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider) const {
192*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, this->numSamples(),
193*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes, this->mipmapped());
194*c8dee2aaSAndroid Build Coastguard Worker if (!surface) {
195*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
196*c8dee2aaSAndroid Build Coastguard Worker }
197*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asRenderTarget());
198*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asTexture());
199*c8dee2aaSAndroid Build Coastguard Worker
200*c8dee2aaSAndroid Build Coastguard Worker return surface;
201*c8dee2aaSAndroid Build Coastguard Worker }
202*c8dee2aaSAndroid Build Coastguard Worker
callbackDesc() const203*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy::LazySurfaceDesc GrTextureRenderTargetProxy::callbackDesc() const {
204*c8dee2aaSAndroid Build Coastguard Worker SkISize dims;
205*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit;
206*c8dee2aaSAndroid Build Coastguard Worker if (this->isFullyLazy()) {
207*c8dee2aaSAndroid Build Coastguard Worker fit = SkBackingFit::kApprox;
208*c8dee2aaSAndroid Build Coastguard Worker dims = {-1, -1};
209*c8dee2aaSAndroid Build Coastguard Worker } else {
210*c8dee2aaSAndroid Build Coastguard Worker fit = this->isFunctionallyExact() ? SkBackingFit::kExact : SkBackingFit::kApprox;
211*c8dee2aaSAndroid Build Coastguard Worker dims = this->dimensions();
212*c8dee2aaSAndroid Build Coastguard Worker }
213*c8dee2aaSAndroid Build Coastguard Worker return {
214*c8dee2aaSAndroid Build Coastguard Worker dims,
215*c8dee2aaSAndroid Build Coastguard Worker fit,
216*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes,
217*c8dee2aaSAndroid Build Coastguard Worker this->mipmapped(),
218*c8dee2aaSAndroid Build Coastguard Worker this->numSamples(),
219*c8dee2aaSAndroid Build Coastguard Worker this->backendFormat(),
220*c8dee2aaSAndroid Build Coastguard Worker this->textureType(),
221*c8dee2aaSAndroid Build Coastguard Worker this->isProtected(),
222*c8dee2aaSAndroid Build Coastguard Worker this->isBudgeted(),
223*c8dee2aaSAndroid Build Coastguard Worker this->getLabel(),
224*c8dee2aaSAndroid Build Coastguard Worker };
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker
227*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
onValidateSurface(const GrSurface * surface)228*c8dee2aaSAndroid Build Coastguard Worker void GrTextureRenderTargetProxy::onValidateSurface(const GrSurface* surface) {
229*c8dee2aaSAndroid Build Coastguard Worker // Anything checked here should also be checking the GrTextureProxy version
230*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asTexture());
231*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(skgpu::Mipmapped::kNo == this->proxyMipmapped() ||
232*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kYes == surface->asTexture()->mipmapped());
233*c8dee2aaSAndroid Build Coastguard Worker
234*c8dee2aaSAndroid Build Coastguard Worker // Anything checked here should also be checking the GrRenderTargetProxy version
235*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asRenderTarget());
236*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asRenderTarget()->numSamples() == this->numSamples());
237*c8dee2aaSAndroid Build Coastguard Worker
238*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surface->asTexture()->textureType() == this->textureType());
239*c8dee2aaSAndroid Build Coastguard Worker
240*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags proxyFlags = fSurfaceFlags;
241*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags surfaceFlags = surface->flags();
242*c8dee2aaSAndroid Build Coastguard Worker
243*c8dee2aaSAndroid Build Coastguard Worker // Only non-RT textures can be read only.
244*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!(proxyFlags & GrInternalSurfaceFlags::kReadOnly));
245*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!(surfaceFlags & GrInternalSurfaceFlags::kReadOnly));
246*c8dee2aaSAndroid Build Coastguard Worker
247*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(((int)proxyFlags & kGrInternalTextureRenderTargetFlagsMask) ==
248*c8dee2aaSAndroid Build Coastguard Worker ((int)surfaceFlags & kGrInternalTextureRenderTargetFlagsMask));
249*c8dee2aaSAndroid Build Coastguard Worker
250*c8dee2aaSAndroid Build Coastguard Worker // We manually check the kVkRTSupportsInputAttachment since we only require it on the surface if
251*c8dee2aaSAndroid Build Coastguard Worker // the proxy has it set. If the proxy doesn't have the flag it is legal for the surface to
252*c8dee2aaSAndroid Build Coastguard Worker // have the flag.
253*c8dee2aaSAndroid Build Coastguard Worker if (proxyFlags & GrInternalSurfaceFlags::kVkRTSupportsInputAttachment) {
254*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(surfaceFlags & GrInternalSurfaceFlags::kVkRTSupportsInputAttachment);
255*c8dee2aaSAndroid Build Coastguard Worker }
256*c8dee2aaSAndroid Build Coastguard Worker }
257*c8dee2aaSAndroid Build Coastguard Worker #endif
258*c8dee2aaSAndroid Build Coastguard Worker
259