xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkPipelineState.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkPipelineState.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrFragmentProcessor.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGeometryProcessor.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrManagedResource.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPipeline.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/effects/GrTextureEffect.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkBuffer.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCommandBuffer.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSet.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkGpu.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkImage.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkImageView.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkPipeline.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkSampler.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkTexture.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUniformHandler.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUtil.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLCompiler.h"
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
42*c8dee2aaSAndroid Build Coastguard Worker #include <array>
43*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
44*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker class GrTexture;
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
49*c8dee2aaSAndroid Build Coastguard Worker 
GrVkPipelineState(GrVkGpu * gpu,sk_sp<const GrVkPipeline> pipeline,const GrVkDescriptorSetManager::Handle & samplerDSHandle,const GrGLSLBuiltinUniformHandles & builtinUniformHandles,const UniformInfoArray & uniforms,uint32_t uniformSize,bool usePushConstants,const UniformInfoArray & samplers,std::unique_ptr<GrGeometryProcessor::ProgramImpl> gpImpl,std::unique_ptr<GrXferProcessor::ProgramImpl> xpImpl,std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fpImpls)50*c8dee2aaSAndroid Build Coastguard Worker GrVkPipelineState::GrVkPipelineState(
51*c8dee2aaSAndroid Build Coastguard Worker         GrVkGpu* gpu,
52*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<const GrVkPipeline> pipeline,
53*c8dee2aaSAndroid Build Coastguard Worker         const GrVkDescriptorSetManager::Handle& samplerDSHandle,
54*c8dee2aaSAndroid Build Coastguard Worker         const GrGLSLBuiltinUniformHandles& builtinUniformHandles,
55*c8dee2aaSAndroid Build Coastguard Worker         const UniformInfoArray& uniforms,
56*c8dee2aaSAndroid Build Coastguard Worker         uint32_t uniformSize,
57*c8dee2aaSAndroid Build Coastguard Worker         bool usePushConstants,
58*c8dee2aaSAndroid Build Coastguard Worker         const UniformInfoArray& samplers,
59*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<GrGeometryProcessor::ProgramImpl> gpImpl,
60*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<GrXferProcessor::ProgramImpl> xpImpl,
61*c8dee2aaSAndroid Build Coastguard Worker         std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fpImpls)
62*c8dee2aaSAndroid Build Coastguard Worker         : fPipeline(std::move(pipeline))
63*c8dee2aaSAndroid Build Coastguard Worker         , fSamplerDSHandle(samplerDSHandle)
64*c8dee2aaSAndroid Build Coastguard Worker         , fBuiltinUniformHandles(builtinUniformHandles)
65*c8dee2aaSAndroid Build Coastguard Worker         , fGPImpl(std::move(gpImpl))
66*c8dee2aaSAndroid Build Coastguard Worker         , fXPImpl(std::move(xpImpl))
67*c8dee2aaSAndroid Build Coastguard Worker         , fFPImpls(std::move(fpImpls))
68*c8dee2aaSAndroid Build Coastguard Worker         , fDataManager(uniforms, uniformSize, usePushConstants) {
69*c8dee2aaSAndroid Build Coastguard Worker     fNumSamplers = samplers.count();
70*c8dee2aaSAndroid Build Coastguard Worker     for (const auto& sampler : samplers.items()) {
71*c8dee2aaSAndroid Build Coastguard Worker         // We store the immutable samplers here and take a ref on the sampler. Once we switch to
72*c8dee2aaSAndroid Build Coastguard Worker         // using sk_sps here we should just move the immutable samplers to save the extra ref/unref.
73*c8dee2aaSAndroid Build Coastguard Worker         if (sampler.fImmutableSampler) {
74*c8dee2aaSAndroid Build Coastguard Worker             sampler.fImmutableSampler->ref();
75*c8dee2aaSAndroid Build Coastguard Worker         }
76*c8dee2aaSAndroid Build Coastguard Worker         fImmutableSamplers.push_back(sampler.fImmutableSampler);
77*c8dee2aaSAndroid Build Coastguard Worker     }
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker 
~GrVkPipelineState()80*c8dee2aaSAndroid Build Coastguard Worker GrVkPipelineState::~GrVkPipelineState() {
81*c8dee2aaSAndroid Build Coastguard Worker     // Must have freed all GPU resources before this is destroyed
82*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fPipeline);
83*c8dee2aaSAndroid Build Coastguard Worker }
84*c8dee2aaSAndroid Build Coastguard Worker 
freeGPUResources(GrVkGpu * gpu)85*c8dee2aaSAndroid Build Coastguard Worker void GrVkPipelineState::freeGPUResources(GrVkGpu* gpu) {
86*c8dee2aaSAndroid Build Coastguard Worker     fPipeline.reset();
87*c8dee2aaSAndroid Build Coastguard Worker     fDataManager.releaseData();
88*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < fImmutableSamplers.size(); ++i) {
89*c8dee2aaSAndroid Build Coastguard Worker         if (fImmutableSamplers[i]) {
90*c8dee2aaSAndroid Build Coastguard Worker             fImmutableSamplers[i]->unref();
91*c8dee2aaSAndroid Build Coastguard Worker             fImmutableSamplers[i] = nullptr;
92*c8dee2aaSAndroid Build Coastguard Worker         }
93*c8dee2aaSAndroid Build Coastguard Worker     }
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker 
setAndBindUniforms(GrVkGpu * gpu,SkISize colorAttachmentDimensions,const GrProgramInfo & programInfo,GrVkCommandBuffer * commandBuffer)96*c8dee2aaSAndroid Build Coastguard Worker bool GrVkPipelineState::setAndBindUniforms(GrVkGpu* gpu,
97*c8dee2aaSAndroid Build Coastguard Worker                                            SkISize colorAttachmentDimensions,
98*c8dee2aaSAndroid Build Coastguard Worker                                            const GrProgramInfo& programInfo,
99*c8dee2aaSAndroid Build Coastguard Worker                                            GrVkCommandBuffer* commandBuffer) {
100*c8dee2aaSAndroid Build Coastguard Worker     this->setRenderTargetState(colorAttachmentDimensions, programInfo.origin());
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker     fGPImpl->setData(fDataManager, *gpu->caps()->shaderCaps(), programInfo.geomProc());
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < programInfo.pipeline().numFragmentProcessors(); ++i) {
105*c8dee2aaSAndroid Build Coastguard Worker         const auto& fp = programInfo.pipeline().getFragmentProcessor(i);
106*c8dee2aaSAndroid Build Coastguard Worker         fp.visitWithImpls([&](const GrFragmentProcessor& fp,
107*c8dee2aaSAndroid Build Coastguard Worker                               GrFragmentProcessor::ProgramImpl& impl) {
108*c8dee2aaSAndroid Build Coastguard Worker             impl.setData(fDataManager, fp);
109*c8dee2aaSAndroid Build Coastguard Worker         }, *fFPImpls[i]);
110*c8dee2aaSAndroid Build Coastguard Worker     }
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     programInfo.pipeline().setDstTextureUniforms(fDataManager, &fBuiltinUniformHandles);
113*c8dee2aaSAndroid Build Coastguard Worker     fXPImpl->setData(fDataManager, programInfo.pipeline().getXferProcessor());
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     // Upload uniform data and bind descriptor set.
116*c8dee2aaSAndroid Build Coastguard Worker     auto [uniformBuffer, success] = fDataManager.uploadUniforms(gpu, fPipeline->layout(),
117*c8dee2aaSAndroid Build Coastguard Worker                                                                 commandBuffer);
118*c8dee2aaSAndroid Build Coastguard Worker     if (!success) {
119*c8dee2aaSAndroid Build Coastguard Worker         return false;
120*c8dee2aaSAndroid Build Coastguard Worker     }
121*c8dee2aaSAndroid Build Coastguard Worker     if (uniformBuffer) {
122*c8dee2aaSAndroid Build Coastguard Worker         const GrVkBuffer* vkBuffer = static_cast<GrVkBuffer*>(uniformBuffer.get());
123*c8dee2aaSAndroid Build Coastguard Worker         static const int kUniformDSIdx = GrVkUniformHandler::kUniformBufferDescSet;
124*c8dee2aaSAndroid Build Coastguard Worker         commandBuffer->bindDescriptorSets(gpu, fPipeline->layout(), kUniformDSIdx, /*setCount=*/1,
125*c8dee2aaSAndroid Build Coastguard Worker                                           vkBuffer->uniformDescriptorSet(),
126*c8dee2aaSAndroid Build Coastguard Worker                                           /*dynamicOffsetCount=*/0, /*dynamicOffsets=*/nullptr);
127*c8dee2aaSAndroid Build Coastguard Worker         commandBuffer->addGrBuffer(std::move(uniformBuffer));
128*c8dee2aaSAndroid Build Coastguard Worker     }
129*c8dee2aaSAndroid Build Coastguard Worker     return true;
130*c8dee2aaSAndroid Build Coastguard Worker }
131*c8dee2aaSAndroid Build Coastguard Worker 
setAndBindTextures(GrVkGpu * gpu,const GrGeometryProcessor & geomProc,const GrPipeline & pipeline,const GrSurfaceProxy * const geomProcTextures[],GrVkCommandBuffer * commandBuffer)132*c8dee2aaSAndroid Build Coastguard Worker bool GrVkPipelineState::setAndBindTextures(GrVkGpu* gpu,
133*c8dee2aaSAndroid Build Coastguard Worker                                            const GrGeometryProcessor& geomProc,
134*c8dee2aaSAndroid Build Coastguard Worker                                            const GrPipeline& pipeline,
135*c8dee2aaSAndroid Build Coastguard Worker                                            const GrSurfaceProxy* const geomProcTextures[],
136*c8dee2aaSAndroid Build Coastguard Worker                                            GrVkCommandBuffer* commandBuffer) {
137*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(geomProcTextures || !geomProc.numTextureSamplers());
138*c8dee2aaSAndroid Build Coastguard Worker     if (!fNumSamplers) {
139*c8dee2aaSAndroid Build Coastguard Worker         return true;
140*c8dee2aaSAndroid Build Coastguard Worker     }
141*c8dee2aaSAndroid Build Coastguard Worker     struct SamplerBindings {
142*c8dee2aaSAndroid Build Coastguard Worker         GrSamplerState fState;
143*c8dee2aaSAndroid Build Coastguard Worker         GrVkTexture* fTexture;
144*c8dee2aaSAndroid Build Coastguard Worker     };
145*c8dee2aaSAndroid Build Coastguard Worker     AutoSTArray<8, SamplerBindings> samplerBindings(fNumSamplers);
146*c8dee2aaSAndroid Build Coastguard Worker     int currTextureBinding = 0;
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < geomProc.numTextureSamplers(); ++i) {
149*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(geomProcTextures[i]->asTextureProxy());
150*c8dee2aaSAndroid Build Coastguard Worker         const auto& sampler = geomProc.textureSampler(i);
151*c8dee2aaSAndroid Build Coastguard Worker         auto texture = static_cast<GrVkTexture*>(geomProcTextures[i]->peekTexture());
152*c8dee2aaSAndroid Build Coastguard Worker         samplerBindings[currTextureBinding++] = {sampler.samplerState(), texture};
153*c8dee2aaSAndroid Build Coastguard Worker     }
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     if (GrTexture* dstTexture = pipeline.peekDstTexture()) {
157*c8dee2aaSAndroid Build Coastguard Worker         samplerBindings[currTextureBinding++] = {GrSamplerState::Filter::kNearest,
158*c8dee2aaSAndroid Build Coastguard Worker                                                  static_cast<GrVkTexture*>(dstTexture)};
159*c8dee2aaSAndroid Build Coastguard Worker     }
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     pipeline.visitTextureEffects([&](const GrTextureEffect& te) {
162*c8dee2aaSAndroid Build Coastguard Worker         GrSamplerState samplerState = te.samplerState();
163*c8dee2aaSAndroid Build Coastguard Worker         auto* texture = static_cast<GrVkTexture*>(te.texture());
164*c8dee2aaSAndroid Build Coastguard Worker         samplerBindings[currTextureBinding++] = {samplerState, texture};
165*c8dee2aaSAndroid Build Coastguard Worker     });
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     // Get new descriptor set
168*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fNumSamplers == currTextureBinding);
169*c8dee2aaSAndroid Build Coastguard Worker     static const int kSamplerDSIdx = GrVkUniformHandler::kSamplerDescSet;
170*c8dee2aaSAndroid Build Coastguard Worker 
171*c8dee2aaSAndroid Build Coastguard Worker     if (fNumSamplers == 1) {
172*c8dee2aaSAndroid Build Coastguard Worker         auto texture = samplerBindings[0].fTexture;
173*c8dee2aaSAndroid Build Coastguard Worker         auto texAttachment = texture->textureImage();
174*c8dee2aaSAndroid Build Coastguard Worker         const auto& samplerState = samplerBindings[0].fState;
175*c8dee2aaSAndroid Build Coastguard Worker         const GrVkDescriptorSet* descriptorSet = texture->cachedSingleDescSet(samplerState);
176*c8dee2aaSAndroid Build Coastguard Worker         if (descriptorSet) {
177*c8dee2aaSAndroid Build Coastguard Worker             commandBuffer->addGrSurface(sk_ref_sp<const GrSurface>(texture));
178*c8dee2aaSAndroid Build Coastguard Worker             commandBuffer->addResource(texAttachment->textureView());
179*c8dee2aaSAndroid Build Coastguard Worker             commandBuffer->addResource(texAttachment->resource());
180*c8dee2aaSAndroid Build Coastguard Worker             commandBuffer->addRecycledResource(descriptorSet);
181*c8dee2aaSAndroid Build Coastguard Worker             commandBuffer->bindDescriptorSets(gpu, fPipeline->layout(), kSamplerDSIdx,
182*c8dee2aaSAndroid Build Coastguard Worker                                               /*setCount=*/1, descriptorSet->descriptorSet(),
183*c8dee2aaSAndroid Build Coastguard Worker                                               /*dynamicOffsetCount=*/0,
184*c8dee2aaSAndroid Build Coastguard Worker                                               /*dynamicOffsets=*/nullptr);
185*c8dee2aaSAndroid Build Coastguard Worker             return true;
186*c8dee2aaSAndroid Build Coastguard Worker         }
187*c8dee2aaSAndroid Build Coastguard Worker     }
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     const GrVkDescriptorSet* descriptorSet =
190*c8dee2aaSAndroid Build Coastguard Worker             gpu->resourceProvider().getSamplerDescriptorSet(fSamplerDSHandle);
191*c8dee2aaSAndroid Build Coastguard Worker     if (!descriptorSet) {
192*c8dee2aaSAndroid Build Coastguard Worker         return false;
193*c8dee2aaSAndroid Build Coastguard Worker     }
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < fNumSamplers; ++i) {
196*c8dee2aaSAndroid Build Coastguard Worker         GrSamplerState state = samplerBindings[i].fState;
197*c8dee2aaSAndroid Build Coastguard Worker         GrVkTexture* texture = samplerBindings[i].fTexture;
198*c8dee2aaSAndroid Build Coastguard Worker         auto texAttachment = texture->textureImage();
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker         const GrVkImageView* textureView = texAttachment->textureView();
201*c8dee2aaSAndroid Build Coastguard Worker         const GrVkSampler* sampler = nullptr;
202*c8dee2aaSAndroid Build Coastguard Worker         if (fImmutableSamplers[i]) {
203*c8dee2aaSAndroid Build Coastguard Worker             sampler = fImmutableSamplers[i];
204*c8dee2aaSAndroid Build Coastguard Worker         } else {
205*c8dee2aaSAndroid Build Coastguard Worker             sampler = gpu->resourceProvider().findOrCreateCompatibleSampler(
206*c8dee2aaSAndroid Build Coastguard Worker                     state, texAttachment->ycbcrConversionInfo());
207*c8dee2aaSAndroid Build Coastguard Worker             if (!sampler) {
208*c8dee2aaSAndroid Build Coastguard Worker                 descriptorSet->recycle();
209*c8dee2aaSAndroid Build Coastguard Worker                 return false;
210*c8dee2aaSAndroid Build Coastguard Worker             }
211*c8dee2aaSAndroid Build Coastguard Worker         }
212*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(sampler);
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker         VkDescriptorImageInfo imageInfo;
215*c8dee2aaSAndroid Build Coastguard Worker         memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
216*c8dee2aaSAndroid Build Coastguard Worker         imageInfo.sampler = fImmutableSamplers[i] ? VK_NULL_HANDLE : sampler->sampler();
217*c8dee2aaSAndroid Build Coastguard Worker         imageInfo.imageView = textureView->imageView();
218*c8dee2aaSAndroid Build Coastguard Worker         imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker         VkWriteDescriptorSet writeInfo;
221*c8dee2aaSAndroid Build Coastguard Worker         memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
222*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
223*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.pNext = nullptr;
224*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.dstSet = *descriptorSet->descriptorSet();
225*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.dstBinding = i;
226*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.dstArrayElement = 0;
227*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.descriptorCount = 1;
228*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
229*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.pImageInfo = &imageInfo;
230*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.pBufferInfo = nullptr;
231*c8dee2aaSAndroid Build Coastguard Worker         writeInfo.pTexelBufferView = nullptr;
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker         GR_VK_CALL(gpu->vkInterface(),
234*c8dee2aaSAndroid Build Coastguard Worker                    UpdateDescriptorSets(gpu->device(), 1, &writeInfo, 0, nullptr));
235*c8dee2aaSAndroid Build Coastguard Worker         commandBuffer->addResource(sampler);
236*c8dee2aaSAndroid Build Coastguard Worker         if (!fImmutableSamplers[i]) {
237*c8dee2aaSAndroid Build Coastguard Worker             sampler->unref();
238*c8dee2aaSAndroid Build Coastguard Worker         }
239*c8dee2aaSAndroid Build Coastguard Worker         commandBuffer->addResource(textureView);
240*c8dee2aaSAndroid Build Coastguard Worker         commandBuffer->addResource(texAttachment->resource());
241*c8dee2aaSAndroid Build Coastguard Worker     }
242*c8dee2aaSAndroid Build Coastguard Worker     if (fNumSamplers == 1) {
243*c8dee2aaSAndroid Build Coastguard Worker         GrSamplerState state = samplerBindings[0].fState;
244*c8dee2aaSAndroid Build Coastguard Worker         GrVkTexture* texture = samplerBindings[0].fTexture;
245*c8dee2aaSAndroid Build Coastguard Worker         texture->addDescriptorSetToCache(descriptorSet, state);
246*c8dee2aaSAndroid Build Coastguard Worker     }
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindDescriptorSets(gpu, fPipeline->layout(), kSamplerDSIdx, /*setCount=*/1,
249*c8dee2aaSAndroid Build Coastguard Worker                                       descriptorSet->descriptorSet(),
250*c8dee2aaSAndroid Build Coastguard Worker                                       /*dynamicOffsetCount=*/0, /*dynamicOffsets=*/nullptr);
251*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->addRecycledResource(descriptorSet);
252*c8dee2aaSAndroid Build Coastguard Worker     descriptorSet->recycle();
253*c8dee2aaSAndroid Build Coastguard Worker     return true;
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker 
setAndBindInputAttachment(GrVkGpu * gpu,gr_rp<const GrVkDescriptorSet> inputDescSet,GrVkCommandBuffer * commandBuffer)256*c8dee2aaSAndroid Build Coastguard Worker bool GrVkPipelineState::setAndBindInputAttachment(GrVkGpu* gpu,
257*c8dee2aaSAndroid Build Coastguard Worker                                                   gr_rp<const GrVkDescriptorSet> inputDescSet,
258*c8dee2aaSAndroid Build Coastguard Worker                                                   GrVkCommandBuffer* commandBuffer) {
259*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(inputDescSet);
260*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindDescriptorSets(gpu, fPipeline->layout(), GrVkUniformHandler::kInputDescSet,
261*c8dee2aaSAndroid Build Coastguard Worker                                       /*setCount=*/1, inputDescSet->descriptorSet(),
262*c8dee2aaSAndroid Build Coastguard Worker                                       /*dynamicOffsetCount=*/0, /*dynamicOffsets=*/nullptr);
263*c8dee2aaSAndroid Build Coastguard Worker     // We don't add the input resource to the command buffer to track since the input will be
264*c8dee2aaSAndroid Build Coastguard Worker     // the same as the color attachment which is already tracked on the command buffer.
265*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->addRecycledResource(std::move(inputDescSet));
266*c8dee2aaSAndroid Build Coastguard Worker     return true;
267*c8dee2aaSAndroid Build Coastguard Worker }
268*c8dee2aaSAndroid Build Coastguard Worker 
setRenderTargetState(SkISize colorAttachmentDimensions,GrSurfaceOrigin origin)269*c8dee2aaSAndroid Build Coastguard Worker void GrVkPipelineState::setRenderTargetState(SkISize colorAttachmentDimensions,
270*c8dee2aaSAndroid Build Coastguard Worker                                              GrSurfaceOrigin origin) {
271*c8dee2aaSAndroid Build Coastguard Worker     // Set RT adjustment and RT flip
272*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fBuiltinUniformHandles.fRTAdjustmentUni.isValid());
273*c8dee2aaSAndroid Build Coastguard Worker     if (fRenderTargetState.fRenderTargetOrigin != origin ||
274*c8dee2aaSAndroid Build Coastguard Worker         fRenderTargetState.fRenderTargetSize != colorAttachmentDimensions) {
275*c8dee2aaSAndroid Build Coastguard Worker         fRenderTargetState.fRenderTargetSize = colorAttachmentDimensions;
276*c8dee2aaSAndroid Build Coastguard Worker         fRenderTargetState.fRenderTargetOrigin = origin;
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker         // The client will mark a swap buffer as kTopLeft when making a SkSurface because
279*c8dee2aaSAndroid Build Coastguard Worker         // Vulkan's framebuffer space has (0, 0) at the top left. This agrees with Skia's device
280*c8dee2aaSAndroid Build Coastguard Worker         // coords and with Vulkan's NDC that has (-1, -1) in the top left. So a flip is needed when
281*c8dee2aaSAndroid Build Coastguard Worker         // surface origin is kBottomLeft rather than kTopLeft.
282*c8dee2aaSAndroid Build Coastguard Worker         bool flip = (origin == kBottomLeft_GrSurfaceOrigin);
283*c8dee2aaSAndroid Build Coastguard Worker         std::array<float, 4> v = SkSL::Compiler::GetRTAdjustVector(colorAttachmentDimensions, flip);
284*c8dee2aaSAndroid Build Coastguard Worker         fDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, v.data());
285*c8dee2aaSAndroid Build Coastguard Worker         if (fBuiltinUniformHandles.fRTFlipUni.isValid()) {
286*c8dee2aaSAndroid Build Coastguard Worker             std::array<float, 2> d =
287*c8dee2aaSAndroid Build Coastguard Worker                     SkSL::Compiler::GetRTFlipVector(colorAttachmentDimensions.height(), flip);
288*c8dee2aaSAndroid Build Coastguard Worker             fDataManager.set2fv(fBuiltinUniformHandles.fRTFlipUni, 1, d.data());
289*c8dee2aaSAndroid Build Coastguard Worker         }
290*c8dee2aaSAndroid Build Coastguard Worker     }
291*c8dee2aaSAndroid Build Coastguard Worker }
292*c8dee2aaSAndroid Build Coastguard Worker 
bindPipeline(const GrVkGpu * gpu,GrVkCommandBuffer * commandBuffer)293*c8dee2aaSAndroid Build Coastguard Worker void GrVkPipelineState::bindPipeline(const GrVkGpu* gpu, GrVkCommandBuffer* commandBuffer) {
294*c8dee2aaSAndroid Build Coastguard Worker     commandBuffer->bindPipeline(gpu, fPipeline);
295*c8dee2aaSAndroid Build Coastguard Worker }
296