xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkRenderTarget.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 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 
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkRenderTarget.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/MutableTextureState.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/vk/GrVkBackendSurface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/vk/GrVkTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanMutableTextureState.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAttachment.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceHandle.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkBackendSurfacePriv.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCaps.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCommandBuffer.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSet.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkFramebuffer.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkGpu.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUtil.h"
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
40*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
43*c8dee2aaSAndroid Build Coastguard Worker 
renderpass_features_to_index(bool hasResolve,bool hasStencil,GrVkRenderPass::SelfDependencyFlags selfDepFlags,GrVkRenderPass::LoadFromResolve loadFromReslove)44*c8dee2aaSAndroid Build Coastguard Worker static int renderpass_features_to_index(bool hasResolve, bool hasStencil,
45*c8dee2aaSAndroid Build Coastguard Worker                                         GrVkRenderPass::SelfDependencyFlags selfDepFlags,
46*c8dee2aaSAndroid Build Coastguard Worker                                         GrVkRenderPass::LoadFromResolve loadFromReslove) {
47*c8dee2aaSAndroid Build Coastguard Worker     int index = 0;
48*c8dee2aaSAndroid Build Coastguard Worker     if (hasResolve) {
49*c8dee2aaSAndroid Build Coastguard Worker         index += 1;
50*c8dee2aaSAndroid Build Coastguard Worker     }
51*c8dee2aaSAndroid Build Coastguard Worker     if (hasStencil) {
52*c8dee2aaSAndroid Build Coastguard Worker         index += 2;
53*c8dee2aaSAndroid Build Coastguard Worker     }
54*c8dee2aaSAndroid Build Coastguard Worker     if (selfDepFlags & GrVkRenderPass::SelfDependencyFlags::kForInputAttachment) {
55*c8dee2aaSAndroid Build Coastguard Worker         index += 4;
56*c8dee2aaSAndroid Build Coastguard Worker     }
57*c8dee2aaSAndroid Build Coastguard Worker     if (selfDepFlags & GrVkRenderPass::SelfDependencyFlags::kForNonCoherentAdvBlend) {
58*c8dee2aaSAndroid Build Coastguard Worker         index += 8;
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker     if (loadFromReslove == GrVkRenderPass::LoadFromResolve::kLoad) {
61*c8dee2aaSAndroid Build Coastguard Worker         index += 16;
62*c8dee2aaSAndroid Build Coastguard Worker     }
63*c8dee2aaSAndroid Build Coastguard Worker     return index;
64*c8dee2aaSAndroid Build Coastguard Worker }
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker // We're virtually derived from GrSurface (via GrRenderTarget) so its
67*c8dee2aaSAndroid Build Coastguard Worker // constructor must be explicitly called.
GrVkRenderTarget(GrVkGpu * gpu,SkISize dimensions,sk_sp<GrVkImage> colorAttachment,sk_sp<GrVkImage> resolveAttachment,CreateType createType,std::string_view label)68*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
69*c8dee2aaSAndroid Build Coastguard Worker                                    SkISize dimensions,
70*c8dee2aaSAndroid Build Coastguard Worker                                    sk_sp<GrVkImage> colorAttachment,
71*c8dee2aaSAndroid Build Coastguard Worker                                    sk_sp<GrVkImage> resolveAttachment,
72*c8dee2aaSAndroid Build Coastguard Worker                                    CreateType createType,
73*c8dee2aaSAndroid Build Coastguard Worker                                    std::string_view label)
74*c8dee2aaSAndroid Build Coastguard Worker         : GrSurface(gpu,
75*c8dee2aaSAndroid Build Coastguard Worker                     dimensions,
76*c8dee2aaSAndroid Build Coastguard Worker                     colorAttachment->isProtected() ? GrProtected::kYes : GrProtected::kNo,
77*c8dee2aaSAndroid Build Coastguard Worker                     label)
78*c8dee2aaSAndroid Build Coastguard Worker         // for the moment we only support 1:1 color to stencil
79*c8dee2aaSAndroid Build Coastguard Worker         , GrRenderTarget(gpu,
80*c8dee2aaSAndroid Build Coastguard Worker                          dimensions,
81*c8dee2aaSAndroid Build Coastguard Worker                          colorAttachment->numSamples(),
82*c8dee2aaSAndroid Build Coastguard Worker                          colorAttachment->isProtected() ? GrProtected::kYes : GrProtected::kNo,
83*c8dee2aaSAndroid Build Coastguard Worker                          label)
84*c8dee2aaSAndroid Build Coastguard Worker         , fColorAttachment(std::move(colorAttachment))
85*c8dee2aaSAndroid Build Coastguard Worker         , fResolveAttachment(std::move(resolveAttachment))
86*c8dee2aaSAndroid Build Coastguard Worker         , fCachedFramebuffers() {
87*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fColorAttachment);
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     if (fColorAttachment->numSamples() == 1 && fColorAttachment->supportsInputAttachmentUsage()) {
90*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!fResolveAttachment);
91*c8dee2aaSAndroid Build Coastguard Worker         // When we have a single sampled color attachment, we set both the color and resolve
92*c8dee2aaSAndroid Build Coastguard Worker         // to the same attachment. This way if we use DMAA on this render target we will resolve
93*c8dee2aaSAndroid Build Coastguard Worker         // to the single target attachment.
94*c8dee2aaSAndroid Build Coastguard Worker         fResolveAttachment = fColorAttachment;
95*c8dee2aaSAndroid Build Coastguard Worker     }
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fResolveAttachment ||
98*c8dee2aaSAndroid Build Coastguard Worker              (fResolveAttachment->isProtected() == fColorAttachment->isProtected()));
99*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(SkToBool(fColorAttachment->vkUsageFlags() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT));
100*c8dee2aaSAndroid Build Coastguard Worker     this->setFlags();
101*c8dee2aaSAndroid Build Coastguard Worker     if (createType == CreateType::kDirectlyWrapped) {
102*c8dee2aaSAndroid Build Coastguard Worker         this->registerWithCacheWrapped(GrWrapCacheable::kNo);
103*c8dee2aaSAndroid Build Coastguard Worker     }
104*c8dee2aaSAndroid Build Coastguard Worker }
105*c8dee2aaSAndroid Build Coastguard Worker 
GrVkRenderTarget(GrVkGpu * gpu,SkISize dimensions,sk_sp<GrVkFramebuffer> externalFramebuffer,std::string_view label)106*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
107*c8dee2aaSAndroid Build Coastguard Worker                                    SkISize dimensions,
108*c8dee2aaSAndroid Build Coastguard Worker                                    sk_sp<GrVkFramebuffer> externalFramebuffer,
109*c8dee2aaSAndroid Build Coastguard Worker                                    std::string_view label)
110*c8dee2aaSAndroid Build Coastguard Worker         : GrSurface(gpu,
111*c8dee2aaSAndroid Build Coastguard Worker                     dimensions,
112*c8dee2aaSAndroid Build Coastguard Worker                     externalFramebuffer->colorAttachment()->isProtected() ? GrProtected::kYes
113*c8dee2aaSAndroid Build Coastguard Worker                                                                           : GrProtected::kNo,
114*c8dee2aaSAndroid Build Coastguard Worker                     label)
115*c8dee2aaSAndroid Build Coastguard Worker         , GrRenderTarget(gpu,
116*c8dee2aaSAndroid Build Coastguard Worker                          dimensions,
117*c8dee2aaSAndroid Build Coastguard Worker                          1,
118*c8dee2aaSAndroid Build Coastguard Worker                          externalFramebuffer->colorAttachment()->isProtected() ? GrProtected::kYes
119*c8dee2aaSAndroid Build Coastguard Worker                                                                                : GrProtected::kNo,
120*c8dee2aaSAndroid Build Coastguard Worker                          label)
121*c8dee2aaSAndroid Build Coastguard Worker         , fCachedFramebuffers()
122*c8dee2aaSAndroid Build Coastguard Worker         , fExternalFramebuffer(externalFramebuffer) {
123*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fExternalFramebuffer);
124*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fColorAttachment);
125*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(auto colorAttachment = fExternalFramebuffer->colorAttachment());
126*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(colorAttachment);
127*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(colorAttachment->numSamples() == 1);
128*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(SkToBool(colorAttachment->vkUsageFlags() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT));
129*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!SkToBool(colorAttachment->vkUsageFlags() & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT));
130*c8dee2aaSAndroid Build Coastguard Worker     this->setFlags();
131*c8dee2aaSAndroid Build Coastguard Worker     this->registerWithCacheWrapped(GrWrapCacheable::kNo);
132*c8dee2aaSAndroid Build Coastguard Worker }
133*c8dee2aaSAndroid Build Coastguard Worker 
setFlags()134*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::setFlags() {
135*c8dee2aaSAndroid Build Coastguard Worker     if (this->wrapsSecondaryCommandBuffer()) {
136*c8dee2aaSAndroid Build Coastguard Worker         return;
137*c8dee2aaSAndroid Build Coastguard Worker     }
138*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage* nonMSAAAttachment = this->nonMSAAAttachment();
139*c8dee2aaSAndroid Build Coastguard Worker     if (nonMSAAAttachment && nonMSAAAttachment->supportsInputAttachmentUsage()) {
140*c8dee2aaSAndroid Build Coastguard Worker         this->setVkRTSupportsInputAttachment();
141*c8dee2aaSAndroid Build Coastguard Worker     }
142*c8dee2aaSAndroid Build Coastguard Worker }
143*c8dee2aaSAndroid Build Coastguard Worker 
MakeWrappedRenderTarget(GrVkGpu * gpu,SkISize dimensions,int sampleCnt,const GrVkImageInfo & info,sk_sp<skgpu::MutableTextureState> mutableState)144*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeWrappedRenderTarget(
145*c8dee2aaSAndroid Build Coastguard Worker         GrVkGpu* gpu,
146*c8dee2aaSAndroid Build Coastguard Worker         SkISize dimensions,
147*c8dee2aaSAndroid Build Coastguard Worker         int sampleCnt,
148*c8dee2aaSAndroid Build Coastguard Worker         const GrVkImageInfo& info,
149*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<skgpu::MutableTextureState> mutableState) {
150*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(VK_NULL_HANDLE != info.fImage);
151*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(1 == info.fLevelCount);
152*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(sampleCnt >= 1 && info.fSampleCount >= 1);
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker     int wrappedImageSampleCnt = static_cast<int>(info.fSampleCount);
155*c8dee2aaSAndroid Build Coastguard Worker     if (sampleCnt != wrappedImageSampleCnt && wrappedImageSampleCnt != 1) {
156*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
157*c8dee2aaSAndroid Build Coastguard Worker     }
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrVkImage> wrappedAttachment =
160*c8dee2aaSAndroid Build Coastguard Worker             GrVkImage::MakeWrapped(gpu,
161*c8dee2aaSAndroid Build Coastguard Worker                                    dimensions,
162*c8dee2aaSAndroid Build Coastguard Worker                                    info,
163*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(mutableState),
164*c8dee2aaSAndroid Build Coastguard Worker                                    GrAttachment::UsageFlags::kColorAttachment,
165*c8dee2aaSAndroid Build Coastguard Worker                                    kBorrow_GrWrapOwnership,
166*c8dee2aaSAndroid Build Coastguard Worker                                    GrWrapCacheable::kNo,
167*c8dee2aaSAndroid Build Coastguard Worker                                    /*label=*/"VkImage_WrappedAttachment");
168*c8dee2aaSAndroid Build Coastguard Worker     if (!wrappedAttachment) {
169*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
170*c8dee2aaSAndroid Build Coastguard Worker     }
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrVkImage> colorAttachment;
173*c8dee2aaSAndroid Build Coastguard Worker     colorAttachment = std::move(wrappedAttachment);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     if (!colorAttachment) {
176*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
177*c8dee2aaSAndroid Build Coastguard Worker     }
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker     GrVkRenderTarget* vkRT = new GrVkRenderTarget(gpu,
180*c8dee2aaSAndroid Build Coastguard Worker                                                   dimensions,
181*c8dee2aaSAndroid Build Coastguard Worker                                                   std::move(colorAttachment),
182*c8dee2aaSAndroid Build Coastguard Worker                                                   nullptr,
183*c8dee2aaSAndroid Build Coastguard Worker                                                   CreateType::kDirectlyWrapped,
184*c8dee2aaSAndroid Build Coastguard Worker                                                   /*label=*/"Vk_MakeWrappedRenderTarget");
185*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrVkRenderTarget>(vkRT);
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker 
MakeSecondaryCBRenderTarget(GrVkGpu * gpu,SkISize dimensions,const GrVkDrawableInfo & vkInfo)188*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeSecondaryCBRenderTarget(
189*c8dee2aaSAndroid Build Coastguard Worker         GrVkGpu* gpu, SkISize dimensions, const GrVkDrawableInfo& vkInfo) {
190*c8dee2aaSAndroid Build Coastguard Worker     const GrVkRenderPass* rp = gpu->resourceProvider().findCompatibleExternalRenderPass(
191*c8dee2aaSAndroid Build Coastguard Worker             vkInfo.fCompatibleRenderPass, vkInfo.fColorAttachmentIndex);
192*c8dee2aaSAndroid Build Coastguard Worker     if (!rp) {
193*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
194*c8dee2aaSAndroid Build Coastguard Worker     }
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     if (vkInfo.fSecondaryCommandBuffer == VK_NULL_HANDLE) {
197*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
198*c8dee2aaSAndroid Build Coastguard Worker     }
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     // We only set the few properties of the GrVkImageInfo that we know like layout and format. The
201*c8dee2aaSAndroid Build Coastguard Worker     // others we keep at the default "null" values.
202*c8dee2aaSAndroid Build Coastguard Worker     GrVkImageInfo info;
203*c8dee2aaSAndroid Build Coastguard Worker     info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
204*c8dee2aaSAndroid Build Coastguard Worker     info.fFormat = vkInfo.fFormat;
205*c8dee2aaSAndroid Build Coastguard Worker     info.fImageUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
206*c8dee2aaSAndroid Build Coastguard Worker                             VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker     auto mutableState =
209*c8dee2aaSAndroid Build Coastguard Worker             sk_make_sp<skgpu::MutableTextureState>(skgpu::MutableTextureStates::MakeVulkan(
210*c8dee2aaSAndroid Build Coastguard Worker                     VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_QUEUE_FAMILY_IGNORED));
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrVkImage> colorAttachment =
213*c8dee2aaSAndroid Build Coastguard Worker             GrVkImage::MakeWrapped(gpu,
214*c8dee2aaSAndroid Build Coastguard Worker                                    dimensions,
215*c8dee2aaSAndroid Build Coastguard Worker                                    info,
216*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(mutableState),
217*c8dee2aaSAndroid Build Coastguard Worker                                    GrAttachment::UsageFlags::kColorAttachment,
218*c8dee2aaSAndroid Build Coastguard Worker                                    kBorrow_GrWrapOwnership,
219*c8dee2aaSAndroid Build Coastguard Worker                                    GrWrapCacheable::kNo,
220*c8dee2aaSAndroid Build Coastguard Worker                                    "VkImage_ColorAttachment",
221*c8dee2aaSAndroid Build Coastguard Worker                                    true);
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrVkSecondaryCommandBuffer> scb(
224*c8dee2aaSAndroid Build Coastguard Worker             GrVkSecondaryCommandBuffer::Create(vkInfo.fSecondaryCommandBuffer, rp));
225*c8dee2aaSAndroid Build Coastguard Worker     if (!scb) {
226*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
227*c8dee2aaSAndroid Build Coastguard Worker     }
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrVkFramebuffer> framebuffer(new GrVkFramebuffer(
230*c8dee2aaSAndroid Build Coastguard Worker             gpu, std::move(colorAttachment), sk_sp<const GrVkRenderPass>(rp),
231*c8dee2aaSAndroid Build Coastguard Worker             std::move(scb)));
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     GrVkRenderTarget* vkRT =
234*c8dee2aaSAndroid Build Coastguard Worker             new GrVkRenderTarget(gpu, dimensions, std::move(framebuffer),
235*c8dee2aaSAndroid Build Coastguard Worker                                  /*label=*/"Vk_MakeSecondaryCBRenderTarget");
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrVkRenderTarget>(vkRT);
238*c8dee2aaSAndroid Build Coastguard Worker }
239*c8dee2aaSAndroid Build Coastguard Worker 
backendFormat() const240*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat GrVkRenderTarget::backendFormat() const {
241*c8dee2aaSAndroid Build Coastguard Worker     if (this->wrapsSecondaryCommandBuffer()) {
242*c8dee2aaSAndroid Build Coastguard Worker         return fExternalFramebuffer->colorAttachment()->backendFormat();
243*c8dee2aaSAndroid Build Coastguard Worker     }
244*c8dee2aaSAndroid Build Coastguard Worker     return fColorAttachment->backendFormat();
245*c8dee2aaSAndroid Build Coastguard Worker }
246*c8dee2aaSAndroid Build Coastguard Worker 
nonMSAAAttachment() const247*c8dee2aaSAndroid Build Coastguard Worker GrVkImage* GrVkRenderTarget::nonMSAAAttachment() const {
248*c8dee2aaSAndroid Build Coastguard Worker     if (fColorAttachment->numSamples() == 1) {
249*c8dee2aaSAndroid Build Coastguard Worker         return fColorAttachment.get();
250*c8dee2aaSAndroid Build Coastguard Worker     } else {
251*c8dee2aaSAndroid Build Coastguard Worker         return fResolveAttachment.get();
252*c8dee2aaSAndroid Build Coastguard Worker     }
253*c8dee2aaSAndroid Build Coastguard Worker }
254*c8dee2aaSAndroid Build Coastguard Worker 
dynamicMSAAAttachment()255*c8dee2aaSAndroid Build Coastguard Worker GrVkImage* GrVkRenderTarget::dynamicMSAAAttachment() {
256*c8dee2aaSAndroid Build Coastguard Worker     if (fDynamicMSAAAttachment) {
257*c8dee2aaSAndroid Build Coastguard Worker         return fDynamicMSAAAttachment.get();
258*c8dee2aaSAndroid Build Coastguard Worker     }
259*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImage* nonMSAAColorAttachment = this->colorAttachment();
260*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(nonMSAAColorAttachment->numSamples() == 1);
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker     GrVkGpu* gpu = this->getVkGpu();
263*c8dee2aaSAndroid Build Coastguard Worker     auto rp = gpu->getContext()->priv().resourceProvider();
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker     const GrBackendFormat& format = nonMSAAColorAttachment->backendFormat();
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     GrMemoryless memoryless =
268*c8dee2aaSAndroid Build Coastguard Worker             gpu->vkCaps().supportsMemorylessAttachments() ? GrMemoryless::kYes : GrMemoryless::kNo;
269*c8dee2aaSAndroid Build Coastguard Worker 
270*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrAttachment> msaaAttachment =
271*c8dee2aaSAndroid Build Coastguard Worker             rp->getDiscardableMSAAAttachment(nonMSAAColorAttachment->dimensions(),
272*c8dee2aaSAndroid Build Coastguard Worker                                              format,
273*c8dee2aaSAndroid Build Coastguard Worker                                              gpu->caps()->internalMultisampleCount(format),
274*c8dee2aaSAndroid Build Coastguard Worker                                              GrProtected(nonMSAAColorAttachment->isProtected()),
275*c8dee2aaSAndroid Build Coastguard Worker                                              memoryless);
276*c8dee2aaSAndroid Build Coastguard Worker     if (!msaaAttachment) {
277*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
278*c8dee2aaSAndroid Build Coastguard Worker     }
279*c8dee2aaSAndroid Build Coastguard Worker     fDynamicMSAAAttachment = sk_sp<GrVkImage>(static_cast<GrVkImage*>(msaaAttachment.release()));
280*c8dee2aaSAndroid Build Coastguard Worker     return fDynamicMSAAAttachment.get();
281*c8dee2aaSAndroid Build Coastguard Worker }
282*c8dee2aaSAndroid Build Coastguard Worker 
msaaAttachment()283*c8dee2aaSAndroid Build Coastguard Worker GrVkImage* GrVkRenderTarget::msaaAttachment() {
284*c8dee2aaSAndroid Build Coastguard Worker     return this->colorAttachment()->numSamples() == 1 ? this->dynamicMSAAAttachment()
285*c8dee2aaSAndroid Build Coastguard Worker                                                       : this->colorAttachment();
286*c8dee2aaSAndroid Build Coastguard Worker }
287*c8dee2aaSAndroid Build Coastguard Worker 
canAttemptStencilAttachment(bool useMSAASurface) const288*c8dee2aaSAndroid Build Coastguard Worker bool GrVkRenderTarget::canAttemptStencilAttachment(bool useMSAASurface) const {
289*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!useMSAASurface || this->numSamples() > 1 ||
290*c8dee2aaSAndroid Build Coastguard Worker              this->getVkGpu()->vkCaps().supportsDiscardableMSAAForDMSAA());
291*c8dee2aaSAndroid Build Coastguard Worker     if (!useMSAASurface && this->numSamples() > 1) {
292*c8dee2aaSAndroid Build Coastguard Worker         return false;
293*c8dee2aaSAndroid Build Coastguard Worker     }
294*c8dee2aaSAndroid Build Coastguard Worker     bool validMSAA = true;
295*c8dee2aaSAndroid Build Coastguard Worker     if (useMSAASurface) {
296*c8dee2aaSAndroid Build Coastguard Worker         validMSAA = this->numSamples() > 1 ||
297*c8dee2aaSAndroid Build Coastguard Worker                     (this->getVkGpu()->vkCaps().supportsDiscardableMSAAForDMSAA() &&
298*c8dee2aaSAndroid Build Coastguard Worker                      this->colorAttachment()->supportsInputAttachmentUsage());
299*c8dee2aaSAndroid Build Coastguard Worker     }
300*c8dee2aaSAndroid Build Coastguard Worker     // We don't know the status of the stencil attachment for wrapped external secondary command
301*c8dee2aaSAndroid Build Coastguard Worker     // buffers so we just assume we don't have one.
302*c8dee2aaSAndroid Build Coastguard Worker     return validMSAA && !this->wrapsSecondaryCommandBuffer();
303*c8dee2aaSAndroid Build Coastguard Worker }
304*c8dee2aaSAndroid Build Coastguard Worker 
completeStencilAttachment(GrAttachment * stencil,bool useMSAASurface)305*c8dee2aaSAndroid Build Coastguard Worker bool GrVkRenderTarget::completeStencilAttachment(GrAttachment* stencil, bool useMSAASurface) {
306*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
307*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!useMSAASurface ||
308*c8dee2aaSAndroid Build Coastguard Worker              this->numSamples() > 1 ||
309*c8dee2aaSAndroid Build Coastguard Worker              this->getVkGpu()->vkCaps().supportsDiscardableMSAAForDMSAA());
310*c8dee2aaSAndroid Build Coastguard Worker     return true;
311*c8dee2aaSAndroid Build Coastguard Worker }
312*c8dee2aaSAndroid Build Coastguard Worker 
externalFramebuffer() const313*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkFramebuffer> GrVkRenderTarget::externalFramebuffer() const {
314*c8dee2aaSAndroid Build Coastguard Worker     return fExternalFramebuffer;
315*c8dee2aaSAndroid Build Coastguard Worker }
316*c8dee2aaSAndroid Build Coastguard Worker 
compatibleRenderPassHandle(bool withResolve,bool withStencil,SelfDependencyFlags selfDepFlags,LoadFromResolve loadFromResolve)317*c8dee2aaSAndroid Build Coastguard Worker GrVkResourceProvider::CompatibleRPHandle GrVkRenderTarget::compatibleRenderPassHandle(
318*c8dee2aaSAndroid Build Coastguard Worker         bool withResolve,
319*c8dee2aaSAndroid Build Coastguard Worker         bool withStencil,
320*c8dee2aaSAndroid Build Coastguard Worker         SelfDependencyFlags selfDepFlags,
321*c8dee2aaSAndroid Build Coastguard Worker         LoadFromResolve loadFromResolve) {
322*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
323*c8dee2aaSAndroid Build Coastguard Worker 
324*c8dee2aaSAndroid Build Coastguard Worker     const GrVkFramebuffer* fb =
325*c8dee2aaSAndroid Build Coastguard Worker             this->getFramebuffer(withResolve, withStencil, selfDepFlags, loadFromResolve);
326*c8dee2aaSAndroid Build Coastguard Worker     if (!fb) {
327*c8dee2aaSAndroid Build Coastguard Worker         return {};
328*c8dee2aaSAndroid Build Coastguard Worker     }
329*c8dee2aaSAndroid Build Coastguard Worker 
330*c8dee2aaSAndroid Build Coastguard Worker     return fb->compatibleRenderPassHandle();
331*c8dee2aaSAndroid Build Coastguard Worker }
332*c8dee2aaSAndroid Build Coastguard Worker 
getSimpleRenderPass(bool withResolve,bool withStencil,SelfDependencyFlags selfDepFlags,LoadFromResolve loadFromResolve)333*c8dee2aaSAndroid Build Coastguard Worker const GrVkRenderPass* GrVkRenderTarget::getSimpleRenderPass(bool withResolve,
334*c8dee2aaSAndroid Build Coastguard Worker                                                             bool withStencil,
335*c8dee2aaSAndroid Build Coastguard Worker                                                             SelfDependencyFlags selfDepFlags,
336*c8dee2aaSAndroid Build Coastguard Worker                                                             LoadFromResolve loadFromResolve) {
337*c8dee2aaSAndroid Build Coastguard Worker     if (this->wrapsSecondaryCommandBuffer()) {
338*c8dee2aaSAndroid Build Coastguard Worker          return fExternalFramebuffer->externalRenderPass();
339*c8dee2aaSAndroid Build Coastguard Worker     }
340*c8dee2aaSAndroid Build Coastguard Worker 
341*c8dee2aaSAndroid Build Coastguard Worker     const GrVkFramebuffer* fb =
342*c8dee2aaSAndroid Build Coastguard Worker             this->getFramebuffer(withResolve, withStencil, selfDepFlags, loadFromResolve);
343*c8dee2aaSAndroid Build Coastguard Worker     if (!fb) {
344*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
345*c8dee2aaSAndroid Build Coastguard Worker     }
346*c8dee2aaSAndroid Build Coastguard Worker 
347*c8dee2aaSAndroid Build Coastguard Worker     return fb->compatibleRenderPass();
348*c8dee2aaSAndroid Build Coastguard Worker }
349*c8dee2aaSAndroid Build Coastguard Worker 
350*c8dee2aaSAndroid Build Coastguard Worker std::pair<const GrVkRenderPass*, GrVkResourceProvider::CompatibleRPHandle>
createSimpleRenderPass(bool withResolve,bool withStencil,SelfDependencyFlags selfDepFlags,LoadFromResolve loadFromResolve)351*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderTarget::createSimpleRenderPass(bool withResolve,
352*c8dee2aaSAndroid Build Coastguard Worker                                          bool withStencil,
353*c8dee2aaSAndroid Build Coastguard Worker                                          SelfDependencyFlags selfDepFlags,
354*c8dee2aaSAndroid Build Coastguard Worker                                          LoadFromResolve loadFromResolve) {
355*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider& rp = this->getVkGpu()->resourceProvider();
358*c8dee2aaSAndroid Build Coastguard Worker 
359*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider::CompatibleRPHandle handle;
360*c8dee2aaSAndroid Build Coastguard Worker     const GrVkRenderPass* renderPass = rp.findCompatibleRenderPass(
361*c8dee2aaSAndroid Build Coastguard Worker             this, &handle, withResolve, withStencil, selfDepFlags,
362*c8dee2aaSAndroid Build Coastguard Worker             loadFromResolve);
363*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!renderPass || handle.isValid());
364*c8dee2aaSAndroid Build Coastguard Worker     return {renderPass, handle};
365*c8dee2aaSAndroid Build Coastguard Worker }
366*c8dee2aaSAndroid Build Coastguard Worker 
getFramebuffer(bool withResolve,bool withStencil,SelfDependencyFlags selfDepFlags,LoadFromResolve loadFromResolve)367*c8dee2aaSAndroid Build Coastguard Worker const GrVkFramebuffer* GrVkRenderTarget::getFramebuffer(bool withResolve,
368*c8dee2aaSAndroid Build Coastguard Worker                                                         bool withStencil,
369*c8dee2aaSAndroid Build Coastguard Worker                                                         SelfDependencyFlags selfDepFlags,
370*c8dee2aaSAndroid Build Coastguard Worker                                                         LoadFromResolve loadFromResolve) {
371*c8dee2aaSAndroid Build Coastguard Worker     int cacheIndex =
372*c8dee2aaSAndroid Build Coastguard Worker             renderpass_features_to_index(withResolve, withStencil, selfDepFlags, loadFromResolve);
373*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(cacheIndex < GrVkRenderTarget::kNumCachedFramebuffers);
374*c8dee2aaSAndroid Build Coastguard Worker     if (auto fb = fCachedFramebuffers[cacheIndex]) {
375*c8dee2aaSAndroid Build Coastguard Worker         return fb.get();
376*c8dee2aaSAndroid Build Coastguard Worker     }
377*c8dee2aaSAndroid Build Coastguard Worker 
378*c8dee2aaSAndroid Build Coastguard Worker     this->createFramebuffer(withResolve, withStencil, selfDepFlags, loadFromResolve);
379*c8dee2aaSAndroid Build Coastguard Worker     return fCachedFramebuffers[cacheIndex].get();
380*c8dee2aaSAndroid Build Coastguard Worker }
381*c8dee2aaSAndroid Build Coastguard Worker 
createFramebuffer(bool withResolve,bool withStencil,SelfDependencyFlags selfDepFlags,LoadFromResolve loadFromResolve)382*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::createFramebuffer(bool withResolve,
383*c8dee2aaSAndroid Build Coastguard Worker                                          bool withStencil,
384*c8dee2aaSAndroid Build Coastguard Worker                                          SelfDependencyFlags selfDepFlags,
385*c8dee2aaSAndroid Build Coastguard Worker                                          LoadFromResolve loadFromResolve) {
386*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
387*c8dee2aaSAndroid Build Coastguard Worker     GrVkGpu* gpu = this->getVkGpu();
388*c8dee2aaSAndroid Build Coastguard Worker 
389*c8dee2aaSAndroid Build Coastguard Worker     auto[renderPass, compatibleHandle] =
390*c8dee2aaSAndroid Build Coastguard Worker             this->createSimpleRenderPass(withResolve, withStencil, selfDepFlags, loadFromResolve);
391*c8dee2aaSAndroid Build Coastguard Worker     if (!renderPass) {
392*c8dee2aaSAndroid Build Coastguard Worker         return;
393*c8dee2aaSAndroid Build Coastguard Worker     }
394*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(compatibleHandle.isValid());
395*c8dee2aaSAndroid Build Coastguard Worker 
396*c8dee2aaSAndroid Build Coastguard Worker     int cacheIndex =
397*c8dee2aaSAndroid Build Coastguard Worker             renderpass_features_to_index(withResolve, withStencil, selfDepFlags, loadFromResolve);
398*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(cacheIndex < GrVkRenderTarget::kNumCachedFramebuffers);
399*c8dee2aaSAndroid Build Coastguard Worker 
400*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage* resolve = withResolve ? this->resolveAttachment() : nullptr;
401*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage* colorAttachment = withResolve ? this->msaaAttachment() : this->colorAttachment();
402*c8dee2aaSAndroid Build Coastguard Worker 
403*c8dee2aaSAndroid Build Coastguard Worker     // Stencil attachment view is stored in the base RT stencil attachment
404*c8dee2aaSAndroid Build Coastguard Worker     bool useMSAA = this->numSamples() > 1 || withResolve;
405*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage* stencil =  withStencil ? static_cast<GrVkImage*>(this->getStencilAttachment(useMSAA))
406*c8dee2aaSAndroid Build Coastguard Worker                                       : nullptr;
407*c8dee2aaSAndroid Build Coastguard Worker     fCachedFramebuffers[cacheIndex] =
408*c8dee2aaSAndroid Build Coastguard Worker             GrVkFramebuffer::Make(gpu, this->dimensions(),
409*c8dee2aaSAndroid Build Coastguard Worker                                   sk_sp<const GrVkRenderPass>(renderPass),
410*c8dee2aaSAndroid Build Coastguard Worker                                   colorAttachment, resolve, stencil, compatibleHandle);
411*c8dee2aaSAndroid Build Coastguard Worker }
412*c8dee2aaSAndroid Build Coastguard Worker 
getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor * desc,GrVkRenderPass::AttachmentFlags * attachmentFlags,bool withResolve,bool withStencil)413*c8dee2aaSAndroid Build Coastguard Worker bool GrVkRenderTarget::getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
414*c8dee2aaSAndroid Build Coastguard Worker                                                 GrVkRenderPass::AttachmentFlags* attachmentFlags,
415*c8dee2aaSAndroid Build Coastguard Worker                                                 bool withResolve,
416*c8dee2aaSAndroid Build Coastguard Worker                                                 bool withStencil) {
417*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
418*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImage* colorAttachment =
419*c8dee2aaSAndroid Build Coastguard Worker             withResolve ? this->msaaAttachment() : this->colorAttachment();
420*c8dee2aaSAndroid Build Coastguard Worker     if (!colorAttachment) {
421*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("WARNING: Invalid color attachment -- possibly dmsaa attachment creation failed?");
422*c8dee2aaSAndroid Build Coastguard Worker         return false;
423*c8dee2aaSAndroid Build Coastguard Worker     }
424*c8dee2aaSAndroid Build Coastguard Worker 
425*c8dee2aaSAndroid Build Coastguard Worker     desc->fColor.fFormat = colorAttachment->imageFormat();
426*c8dee2aaSAndroid Build Coastguard Worker     desc->fColor.fSamples = colorAttachment->numSamples();
427*c8dee2aaSAndroid Build Coastguard Worker     *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
428*c8dee2aaSAndroid Build Coastguard Worker     uint32_t attachmentCount = 1;
429*c8dee2aaSAndroid Build Coastguard Worker 
430*c8dee2aaSAndroid Build Coastguard Worker     if (withResolve) {
431*c8dee2aaSAndroid Build Coastguard Worker         desc->fResolve.fFormat = desc->fColor.fFormat;
432*c8dee2aaSAndroid Build Coastguard Worker         desc->fResolve.fSamples = 1;
433*c8dee2aaSAndroid Build Coastguard Worker         *attachmentFlags |= GrVkRenderPass::kResolve_AttachmentFlag;
434*c8dee2aaSAndroid Build Coastguard Worker         ++attachmentCount;
435*c8dee2aaSAndroid Build Coastguard Worker     }
436*c8dee2aaSAndroid Build Coastguard Worker 
437*c8dee2aaSAndroid Build Coastguard Worker     if (withStencil) {
438*c8dee2aaSAndroid Build Coastguard Worker         bool useMSAA = this->numSamples() > 1 || withResolve;
439*c8dee2aaSAndroid Build Coastguard Worker         const GrAttachment* stencil = this->getStencilAttachment(useMSAA);
440*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(stencil);
441*c8dee2aaSAndroid Build Coastguard Worker         const GrVkImage* vkStencil = static_cast<const GrVkImage*>(stencil);
442*c8dee2aaSAndroid Build Coastguard Worker         desc->fStencil.fFormat = vkStencil->imageFormat();
443*c8dee2aaSAndroid Build Coastguard Worker         desc->fStencil.fSamples = vkStencil->numSamples();
444*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(desc->fStencil.fSamples == desc->fColor.fSamples);
445*c8dee2aaSAndroid Build Coastguard Worker         *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
446*c8dee2aaSAndroid Build Coastguard Worker         ++attachmentCount;
447*c8dee2aaSAndroid Build Coastguard Worker     }
448*c8dee2aaSAndroid Build Coastguard Worker     desc->fAttachmentCount = attachmentCount;
449*c8dee2aaSAndroid Build Coastguard Worker 
450*c8dee2aaSAndroid Build Coastguard Worker     return true;
451*c8dee2aaSAndroid Build Coastguard Worker }
452*c8dee2aaSAndroid Build Coastguard Worker 
ReconstructAttachmentsDescriptor(const GrVkCaps & vkCaps,const GrProgramInfo & programInfo,GrVkRenderPass::AttachmentsDescriptor * desc,GrVkRenderPass::AttachmentFlags * flags)453*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::ReconstructAttachmentsDescriptor(const GrVkCaps& vkCaps,
454*c8dee2aaSAndroid Build Coastguard Worker                                                         const GrProgramInfo& programInfo,
455*c8dee2aaSAndroid Build Coastguard Worker                                                         GrVkRenderPass::AttachmentsDescriptor* desc,
456*c8dee2aaSAndroid Build Coastguard Worker                                                         GrVkRenderPass::AttachmentFlags* flags) {
457*c8dee2aaSAndroid Build Coastguard Worker     VkFormat format;
458*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(GrBackendFormats::AsVkFormat(programInfo.backendFormat(), &format));
459*c8dee2aaSAndroid Build Coastguard Worker 
460*c8dee2aaSAndroid Build Coastguard Worker     desc->fColor.fFormat = format;
461*c8dee2aaSAndroid Build Coastguard Worker     desc->fColor.fSamples = programInfo.numSamples();
462*c8dee2aaSAndroid Build Coastguard Worker     *flags = GrVkRenderPass::kColor_AttachmentFlag;
463*c8dee2aaSAndroid Build Coastguard Worker     uint32_t attachmentCount = 1;
464*c8dee2aaSAndroid Build Coastguard Worker 
465*c8dee2aaSAndroid Build Coastguard Worker     if (vkCaps.programInfoWillUseDiscardableMSAA(programInfo)) {
466*c8dee2aaSAndroid Build Coastguard Worker         desc->fResolve.fFormat = desc->fColor.fFormat;
467*c8dee2aaSAndroid Build Coastguard Worker         desc->fResolve.fSamples = 1;
468*c8dee2aaSAndroid Build Coastguard Worker         *flags |= GrVkRenderPass::kResolve_AttachmentFlag;
469*c8dee2aaSAndroid Build Coastguard Worker         ++attachmentCount;
470*c8dee2aaSAndroid Build Coastguard Worker     }
471*c8dee2aaSAndroid Build Coastguard Worker 
472*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!programInfo.isStencilEnabled() || programInfo.needsStencil());
473*c8dee2aaSAndroid Build Coastguard Worker     if (programInfo.needsStencil()) {
474*c8dee2aaSAndroid Build Coastguard Worker         VkFormat stencilFormat = vkCaps.preferredStencilFormat();
475*c8dee2aaSAndroid Build Coastguard Worker         desc->fStencil.fFormat = stencilFormat;
476*c8dee2aaSAndroid Build Coastguard Worker         desc->fStencil.fSamples = programInfo.numSamples();
477*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(desc->fStencil.fSamples == desc->fColor.fSamples);
478*c8dee2aaSAndroid Build Coastguard Worker         *flags |= GrVkRenderPass::kStencil_AttachmentFlag;
479*c8dee2aaSAndroid Build Coastguard Worker         ++attachmentCount;
480*c8dee2aaSAndroid Build Coastguard Worker     }
481*c8dee2aaSAndroid Build Coastguard Worker     desc->fAttachmentCount = attachmentCount;
482*c8dee2aaSAndroid Build Coastguard Worker }
483*c8dee2aaSAndroid Build Coastguard Worker 
~GrVkRenderTarget()484*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderTarget::~GrVkRenderTarget() {
485*c8dee2aaSAndroid Build Coastguard Worker     // either release or abandon should have been called by the owner of this object.
486*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fColorAttachment);
487*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fResolveAttachment);
488*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fDynamicMSAAAttachment);
489*c8dee2aaSAndroid Build Coastguard Worker 
490*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < kNumCachedFramebuffers; ++i) {
491*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!fCachedFramebuffers[i]);
492*c8dee2aaSAndroid Build Coastguard Worker     }
493*c8dee2aaSAndroid Build Coastguard Worker 
494*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fCachedInputDescriptorSet);
495*c8dee2aaSAndroid Build Coastguard Worker }
496*c8dee2aaSAndroid Build Coastguard Worker 
releaseInternalObjects()497*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::releaseInternalObjects() {
498*c8dee2aaSAndroid Build Coastguard Worker     fColorAttachment.reset();
499*c8dee2aaSAndroid Build Coastguard Worker     fResolveAttachment.reset();
500*c8dee2aaSAndroid Build Coastguard Worker     fDynamicMSAAAttachment.reset();
501*c8dee2aaSAndroid Build Coastguard Worker 
502*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < kNumCachedFramebuffers; ++i) {
503*c8dee2aaSAndroid Build Coastguard Worker         if (fCachedFramebuffers[i]) {
504*c8dee2aaSAndroid Build Coastguard Worker             fCachedFramebuffers[i].reset();
505*c8dee2aaSAndroid Build Coastguard Worker         }
506*c8dee2aaSAndroid Build Coastguard Worker     }
507*c8dee2aaSAndroid Build Coastguard Worker 
508*c8dee2aaSAndroid Build Coastguard Worker     if (fCachedInputDescriptorSet) {
509*c8dee2aaSAndroid Build Coastguard Worker         fCachedInputDescriptorSet->recycle();
510*c8dee2aaSAndroid Build Coastguard Worker         fCachedInputDescriptorSet = nullptr;
511*c8dee2aaSAndroid Build Coastguard Worker     }
512*c8dee2aaSAndroid Build Coastguard Worker 
513*c8dee2aaSAndroid Build Coastguard Worker     fExternalFramebuffer.reset();
514*c8dee2aaSAndroid Build Coastguard Worker }
515*c8dee2aaSAndroid Build Coastguard Worker 
onRelease()516*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::onRelease() {
517*c8dee2aaSAndroid Build Coastguard Worker     this->releaseInternalObjects();
518*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTarget::onRelease();
519*c8dee2aaSAndroid Build Coastguard Worker }
520*c8dee2aaSAndroid Build Coastguard Worker 
onAbandon()521*c8dee2aaSAndroid Build Coastguard Worker void GrVkRenderTarget::onAbandon() {
522*c8dee2aaSAndroid Build Coastguard Worker     this->releaseInternalObjects();
523*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTarget::onAbandon();
524*c8dee2aaSAndroid Build Coastguard Worker }
525*c8dee2aaSAndroid Build Coastguard Worker 
getBackendRenderTarget() const526*c8dee2aaSAndroid Build Coastguard Worker GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
527*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wrapsSecondaryCommandBuffer());
528*c8dee2aaSAndroid Build Coastguard Worker     // This should only get called with a non-released GrVkRenderTargets.
529*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wasDestroyed());
530*c8dee2aaSAndroid Build Coastguard Worker     // If we have a resolve attachment that is what we return for the backend render target
531*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImage* beAttachment = this->externalAttachment();
532*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendRenderTargets::MakeVk(beAttachment->width(),
533*c8dee2aaSAndroid Build Coastguard Worker                                           beAttachment->height(),
534*c8dee2aaSAndroid Build Coastguard Worker                                           beAttachment->vkImageInfo(),
535*c8dee2aaSAndroid Build Coastguard Worker                                           beAttachment->getMutableState());
536*c8dee2aaSAndroid Build Coastguard Worker }
537*c8dee2aaSAndroid Build Coastguard Worker 
getVkGpu() const538*c8dee2aaSAndroid Build Coastguard Worker GrVkGpu* GrVkRenderTarget::getVkGpu() const {
539*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wasDestroyed());
540*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<GrVkGpu*>(this->getGpu());
541*c8dee2aaSAndroid Build Coastguard Worker }
542