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