xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkMSAALoadManager.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 Google LLC
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/GrVkMSAALoadManager.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/GpuRefCnt.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAttachment.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrManagedResource.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkBuffer.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCommandBuffer.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSet.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSetManager.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkGpu.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkImage.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkPipeline.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUniformHandler.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUtil.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgram.h"
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker #include <stdint.h>
38*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
39*c8dee2aaSAndroid Build Coastguard Worker #include <string>
40*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker class GrGpuBuffer;
43*c8dee2aaSAndroid Build Coastguard Worker 
GrVkMSAALoadManager()44*c8dee2aaSAndroid Build Coastguard Worker GrVkMSAALoadManager::GrVkMSAALoadManager()
45*c8dee2aaSAndroid Build Coastguard Worker         : fVertShaderModule(VK_NULL_HANDLE)
46*c8dee2aaSAndroid Build Coastguard Worker         , fFragShaderModule(VK_NULL_HANDLE)
47*c8dee2aaSAndroid Build Coastguard Worker         , fPipelineLayout(VK_NULL_HANDLE) {}
48*c8dee2aaSAndroid Build Coastguard Worker 
~GrVkMSAALoadManager()49*c8dee2aaSAndroid Build Coastguard Worker GrVkMSAALoadManager::~GrVkMSAALoadManager() {}
50*c8dee2aaSAndroid Build Coastguard Worker 
createMSAALoadProgram(GrVkGpu * gpu)51*c8dee2aaSAndroid Build Coastguard Worker bool GrVkMSAALoadManager::createMSAALoadProgram(GrVkGpu* gpu) {
52*c8dee2aaSAndroid Build Coastguard Worker     TRACE_EVENT0("skia", TRACE_FUNC);
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     std::string vertShaderText;
55*c8dee2aaSAndroid Build Coastguard Worker     vertShaderText.append(
56*c8dee2aaSAndroid Build Coastguard Worker             "layout(vulkan, set=0, binding=0) uniform vertexUniformBuffer {"
57*c8dee2aaSAndroid Build Coastguard Worker             "half4 uPosXform;"
58*c8dee2aaSAndroid Build Coastguard Worker             "};"
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker             "// MSAA Load Program VS\n"
61*c8dee2aaSAndroid Build Coastguard Worker             "void main() {"
62*c8dee2aaSAndroid Build Coastguard Worker             "float2 position = float2(sk_VertexID >> 1, sk_VertexID & 1);"
63*c8dee2aaSAndroid Build Coastguard Worker             "sk_Position.xy = position * uPosXform.xy + uPosXform.zw;"
64*c8dee2aaSAndroid Build Coastguard Worker             "sk_Position.zw = half2(0, 1);"
65*c8dee2aaSAndroid Build Coastguard Worker             "}");
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     std::string fragShaderText;
68*c8dee2aaSAndroid Build Coastguard Worker     fragShaderText.append(
69*c8dee2aaSAndroid Build Coastguard Worker             "layout(vulkan, input_attachment_index=0, set=2, binding=0) subpassInput uInput;"
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker             "// MSAA Load Program FS\n"
72*c8dee2aaSAndroid Build Coastguard Worker             "void main() {"
73*c8dee2aaSAndroid Build Coastguard Worker             "sk_FragColor = subpassLoad(uInput);"
74*c8dee2aaSAndroid Build Coastguard Worker             "}");
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramSettings settings;
77*c8dee2aaSAndroid Build Coastguard Worker     std::string spirv;
78*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Program::Interface interface;
79*c8dee2aaSAndroid Build Coastguard Worker     if (!GrCompileVkShaderModule(gpu, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT,
80*c8dee2aaSAndroid Build Coastguard Worker                                  &fVertShaderModule, &fShaderStageInfo[0], settings, &spirv,
81*c8dee2aaSAndroid Build Coastguard Worker                                  &interface)) {
82*c8dee2aaSAndroid Build Coastguard Worker         this->destroyResources(gpu);
83*c8dee2aaSAndroid Build Coastguard Worker         return false;
84*c8dee2aaSAndroid Build Coastguard Worker     }
85*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(interface == SkSL::Program::Interface());
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker     if (!GrCompileVkShaderModule(gpu, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
88*c8dee2aaSAndroid Build Coastguard Worker                                  &fFragShaderModule, &fShaderStageInfo[1], settings, &spirv,
89*c8dee2aaSAndroid Build Coastguard Worker                                  &interface)) {
90*c8dee2aaSAndroid Build Coastguard Worker         this->destroyResources(gpu);
91*c8dee2aaSAndroid Build Coastguard Worker         return false;
92*c8dee2aaSAndroid Build Coastguard Worker     }
93*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(interface == SkSL::Program::Interface());
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     VkDescriptorSetLayout dsLayout[GrVkUniformHandler::kDescSetCount];
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider& resourceProvider = gpu->resourceProvider();
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     // Even though we don't have a sampler we need to put a valid handle here (of zero samplers)
102*c8dee2aaSAndroid Build Coastguard Worker     // since we set up our descriptor layout to be uniform, sampler, input.
103*c8dee2aaSAndroid Build Coastguard Worker     //
104*c8dee2aaSAndroid Build Coastguard Worker     // TODO: We should have a more general way for different pipelines to describe their descriptor
105*c8dee2aaSAndroid Build Coastguard Worker     // layouts so that we don't have to use the compile time constants for the sets.
106*c8dee2aaSAndroid Build Coastguard Worker     GrVkDescriptorSetManager::Handle samplerHandle;
107*c8dee2aaSAndroid Build Coastguard Worker     resourceProvider.getZeroSamplerDescriptorSetHandle(&samplerHandle);
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     dsLayout[GrVkUniformHandler::kSamplerDescSet] =
110*c8dee2aaSAndroid Build Coastguard Worker             resourceProvider.getSamplerDSLayout(samplerHandle);
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     dsLayout[GrVkUniformHandler::kInputDescSet] = resourceProvider.getInputDSLayout();
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     // Create the VkPipelineLayout
115*c8dee2aaSAndroid Build Coastguard Worker     VkPipelineLayoutCreateInfo layoutCreateInfo;
116*c8dee2aaSAndroid Build Coastguard Worker     memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
117*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
118*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pNext = nullptr;
119*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.flags = 0;
120*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.setLayoutCount = GrVkUniformHandler::kDescSetCount;
121*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pSetLayouts = dsLayout;
122*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pushConstantRangeCount = 0;
123*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pPushConstantRanges = nullptr;
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker     VkResult err = GR_VK_CALL(
126*c8dee2aaSAndroid Build Coastguard Worker             gpu->vkInterface(),
127*c8dee2aaSAndroid Build Coastguard Worker             CreatePipelineLayout(gpu->device(), &layoutCreateInfo, nullptr, &fPipelineLayout));
128*c8dee2aaSAndroid Build Coastguard Worker     if (err) {
129*c8dee2aaSAndroid Build Coastguard Worker         this->destroyResources(gpu);
130*c8dee2aaSAndroid Build Coastguard Worker         return false;
131*c8dee2aaSAndroid Build Coastguard Worker     }
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker     return true;
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker 
loadMSAAFromResolve(GrVkGpu * gpu,GrVkCommandBuffer * commandBuffer,const GrVkRenderPass & renderPass,GrAttachment * dst,GrVkImage * src,const SkIRect & rect)136*c8dee2aaSAndroid Build Coastguard Worker bool GrVkMSAALoadManager::loadMSAAFromResolve(GrVkGpu* gpu,
137*c8dee2aaSAndroid Build Coastguard Worker                                               GrVkCommandBuffer* commandBuffer,
138*c8dee2aaSAndroid Build Coastguard Worker                                               const GrVkRenderPass& renderPass,
139*c8dee2aaSAndroid Build Coastguard Worker                                               GrAttachment* dst,
140*c8dee2aaSAndroid Build Coastguard Worker                                               GrVkImage* src,
141*c8dee2aaSAndroid Build Coastguard Worker                                               const SkIRect& rect) {
142*c8dee2aaSAndroid Build Coastguard Worker     if (!dst) {
143*c8dee2aaSAndroid Build Coastguard Worker         return false;
144*c8dee2aaSAndroid Build Coastguard Worker     }
145*c8dee2aaSAndroid Build Coastguard Worker     if (!src || !src->supportsInputAttachmentUsage()) {
146*c8dee2aaSAndroid Build Coastguard Worker         return false;
147*c8dee2aaSAndroid Build Coastguard Worker     }
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     if (VK_NULL_HANDLE == fVertShaderModule) {
150*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fFragShaderModule == VK_NULL_HANDLE && fPipelineLayout == VK_NULL_HANDLE);
151*c8dee2aaSAndroid Build Coastguard Worker         if (!this->createMSAALoadProgram(gpu)) {
152*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("Failed to create copy program.\n");
153*c8dee2aaSAndroid Build Coastguard Worker             return false;
154*c8dee2aaSAndroid Build Coastguard Worker         }
155*c8dee2aaSAndroid Build Coastguard Worker     }
156*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fPipelineLayout != VK_NULL_HANDLE);
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider& resourceProv = gpu->resourceProvider();
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkPipeline> pipeline =
161*c8dee2aaSAndroid Build Coastguard Worker             resourceProv.findOrCreateMSAALoadPipeline(renderPass, dst->numSamples(),
162*c8dee2aaSAndroid Build Coastguard Worker                                                       fShaderStageInfo, fPipelineLayout);
163*c8dee2aaSAndroid Build Coastguard Worker     if (!pipeline) {
164*c8dee2aaSAndroid Build Coastguard Worker         return false;
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindPipeline(gpu, std::move(pipeline));
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker     // Set Dynamic viewport and stencil
169*c8dee2aaSAndroid Build Coastguard Worker     // We always use one viewport the size of the RT
170*c8dee2aaSAndroid Build Coastguard Worker     VkViewport viewport;
171*c8dee2aaSAndroid Build Coastguard Worker     viewport.x = 0.0f;
172*c8dee2aaSAndroid Build Coastguard Worker     viewport.y = 0.0f;
173*c8dee2aaSAndroid Build Coastguard Worker     viewport.width = SkIntToScalar(dst->width());
174*c8dee2aaSAndroid Build Coastguard Worker     viewport.height = SkIntToScalar(dst->height());
175*c8dee2aaSAndroid Build Coastguard Worker     viewport.minDepth = 0.0f;
176*c8dee2aaSAndroid Build Coastguard Worker     viewport.maxDepth = 1.0f;
177*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->setViewport(gpu, 0, 1, &viewport);
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker     // We assume the scissor is not enabled so just set it to the whole RT
180*c8dee2aaSAndroid Build Coastguard Worker     VkRect2D scissor;
181*c8dee2aaSAndroid Build Coastguard Worker     scissor.extent.width = dst->width();
182*c8dee2aaSAndroid Build Coastguard Worker     scissor.extent.height = dst->height();
183*c8dee2aaSAndroid Build Coastguard Worker     scissor.offset.x = 0;
184*c8dee2aaSAndroid Build Coastguard Worker     scissor.offset.y = 0;
185*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->setScissor(gpu, 0, 1, &scissor);
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     // Update and bind uniform descriptor set
188*c8dee2aaSAndroid Build Coastguard Worker     int w = rect.width();
189*c8dee2aaSAndroid Build Coastguard Worker     int h = rect.height();
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker     // dst rect edges in NDC (-1 to 1)
192*c8dee2aaSAndroid Build Coastguard Worker     int dw = dst->width();
193*c8dee2aaSAndroid Build Coastguard Worker     int dh = dst->height();
194*c8dee2aaSAndroid Build Coastguard Worker     float dx0 = 2.f * rect.fLeft / dw - 1.f;
195*c8dee2aaSAndroid Build Coastguard Worker     float dx1 = 2.f * (rect.fLeft + w) / dw - 1.f;
196*c8dee2aaSAndroid Build Coastguard Worker     float dy0 = 2.f * rect.fTop / dh - 1.f;
197*c8dee2aaSAndroid Build Coastguard Worker     float dy1 = 2.f * (rect.fTop + h) / dh - 1.f;
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker     float uniData[] = {dx1 - dx0, dy1 - dy0, dx0, dy0};  // posXform
200*c8dee2aaSAndroid Build Coastguard Worker 
201*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* resourceProvider = gpu->getContext()->priv().resourceProvider();
202*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Is it worth holding onto the last used uniform buffer and tracking the width, height,
203*c8dee2aaSAndroid Build Coastguard Worker     // dst width, and dst height so that we can use the buffer again without having to update the
204*c8dee2aaSAndroid Build Coastguard Worker     // data?
205*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrGpuBuffer> uniformBuffer = resourceProvider->createBuffer(uniData,
206*c8dee2aaSAndroid Build Coastguard Worker                                                                       sizeof(uniData),
207*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrGpuBufferType::kUniform,
208*c8dee2aaSAndroid Build Coastguard Worker                                                                       kDynamic_GrAccessPattern);
209*c8dee2aaSAndroid Build Coastguard Worker     if (!uniformBuffer) {
210*c8dee2aaSAndroid Build Coastguard Worker         return false;
211*c8dee2aaSAndroid Build Coastguard Worker     }
212*c8dee2aaSAndroid Build Coastguard Worker     GrVkBuffer* vkUniformBuffer = static_cast<GrVkBuffer*>(uniformBuffer.get());
213*c8dee2aaSAndroid Build Coastguard Worker     static_assert(GrVkUniformHandler::kUniformBufferDescSet < GrVkUniformHandler::kInputDescSet);
214*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindDescriptorSets(gpu, fPipelineLayout,
215*c8dee2aaSAndroid Build Coastguard Worker                                       GrVkUniformHandler::kUniformBufferDescSet,
216*c8dee2aaSAndroid Build Coastguard Worker                                       /*setCount=*/1, vkUniformBuffer->uniformDescriptorSet(),
217*c8dee2aaSAndroid Build Coastguard Worker                                       /*dynamicOffsetCount=*/0, /*dynamicOffsets=*/nullptr);
218*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->addGrBuffer(std::move(uniformBuffer));
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     // Update the input descriptor set
221*c8dee2aaSAndroid Build Coastguard Worker     gr_rp<const GrVkDescriptorSet> inputDS = src->inputDescSetForMSAALoad(gpu);
222*c8dee2aaSAndroid Build Coastguard Worker     if (!inputDS) {
223*c8dee2aaSAndroid Build Coastguard Worker         return false;
224*c8dee2aaSAndroid Build Coastguard Worker     }
225*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindDescriptorSets(gpu, fPipelineLayout,
226*c8dee2aaSAndroid Build Coastguard Worker                                       GrVkUniformHandler::kInputDescSet, /*setCount=*/1,
227*c8dee2aaSAndroid Build Coastguard Worker                                       inputDS->descriptorSet(),
228*c8dee2aaSAndroid Build Coastguard Worker                                       /*dynamicOffsetCount=*/0, /*dynamicOffsets=*/nullptr);
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker     // We don't need to add the src and dst resources here since those are all tracked by the main
231*c8dee2aaSAndroid Build Coastguard Worker     // render pass code out in GrVkOpsRenderPass and GrVkRenderTarget::adResources.
232*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->addRecycledResource(std::move(inputDS));
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->draw(gpu, 4, 1, 0, 0);
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker     return true;
237*c8dee2aaSAndroid Build Coastguard Worker }
238*c8dee2aaSAndroid Build Coastguard Worker 
destroyResources(GrVkGpu * gpu)239*c8dee2aaSAndroid Build Coastguard Worker void GrVkMSAALoadManager::destroyResources(GrVkGpu* gpu) {
240*c8dee2aaSAndroid Build Coastguard Worker     if (fVertShaderModule != VK_NULL_HANDLE) {
241*c8dee2aaSAndroid Build Coastguard Worker         GR_VK_CALL(gpu->vkInterface(),
242*c8dee2aaSAndroid Build Coastguard Worker                    DestroyShaderModule(gpu->device(), fVertShaderModule, nullptr));
243*c8dee2aaSAndroid Build Coastguard Worker         fVertShaderModule = VK_NULL_HANDLE;
244*c8dee2aaSAndroid Build Coastguard Worker     }
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker     if (fFragShaderModule != VK_NULL_HANDLE) {
247*c8dee2aaSAndroid Build Coastguard Worker         GR_VK_CALL(gpu->vkInterface(),
248*c8dee2aaSAndroid Build Coastguard Worker                    DestroyShaderModule(gpu->device(), fFragShaderModule, nullptr));
249*c8dee2aaSAndroid Build Coastguard Worker         fFragShaderModule = VK_NULL_HANDLE;
250*c8dee2aaSAndroid Build Coastguard Worker     }
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker     if (fPipelineLayout != VK_NULL_HANDLE) {
253*c8dee2aaSAndroid Build Coastguard Worker         GR_VK_CALL(gpu->vkInterface(),
254*c8dee2aaSAndroid Build Coastguard Worker                    DestroyPipelineLayout(gpu->device(), fPipelineLayout, nullptr));
255*c8dee2aaSAndroid Build Coastguard Worker         fPipelineLayout = VK_NULL_HANDLE;
256*c8dee2aaSAndroid Build Coastguard Worker     }
257*c8dee2aaSAndroid Build Coastguard Worker }
258*c8dee2aaSAndroid Build Coastguard Worker 
259