blob: 84aa68248c83c9ef27f1be3a10ec549b09c6d1eb [file] [log] [blame]
jvanverth992ad362016-02-26 09:21:02 -08001/*
2* Copyright 2016 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
egdaniel22281c12016-03-23 13:49:40 -07008#include "GrVkPipelineState.h"
Robert Phillips9bee2e52017-05-29 12:37:20 -04009#include "GrContext.h"
Robert Phillips6be756b2018-01-16 15:07:54 -050010#include "GrContextPriv.h"
jvanverth992ad362016-02-26 09:21:02 -080011#include "GrPipeline.h"
Brian Salomon1471df92018-06-08 10:49:00 -040012#include "GrRenderTarget.h"
jvanverth62340062016-04-26 08:01:44 -070013#include "GrTexturePriv.h"
Greg Daniel31ec1442017-05-08 10:30:59 -040014#include "GrVkBufferView.h"
jvanverth992ad362016-02-26 09:21:02 -080015#include "GrVkCommandBuffer.h"
16#include "GrVkDescriptorPool.h"
egdaniela95220d2016-07-21 11:50:37 -070017#include "GrVkDescriptorSet.h"
jvanverth992ad362016-02-26 09:21:02 -080018#include "GrVkGpu.h"
19#include "GrVkImageView.h"
20#include "GrVkMemory.h"
21#include "GrVkPipeline.h"
Greg Daniel7d918fd2018-06-19 15:22:01 -040022#include "GrVkPipelineLayout.h"
jvanverth992ad362016-02-26 09:21:02 -080023#include "GrVkSampler.h"
Greg Daniel31ec1442017-05-08 10:30:59 -040024#include "GrVkTexelBuffer.h"
jvanverth992ad362016-02-26 09:21:02 -080025#include "GrVkTexture.h"
26#include "GrVkUniformBuffer.h"
Brian Salomon1471df92018-06-08 10:49:00 -040027#include "SkMipMap.h"
jvanverth992ad362016-02-26 09:21:02 -080028#include "glsl/GrGLSLFragmentProcessor.h"
29#include "glsl/GrGLSLGeometryProcessor.h"
30#include "glsl/GrGLSLXferProcessor.h"
31
Brian Salomon1471df92018-06-08 10:49:00 -040032GrVkPipelineState::GrVkPipelineState(
33 GrVkGpu* gpu,
Brian Salomon4d3f5172018-06-07 14:42:52 -040034 GrVkPipeline* pipeline,
35 VkPipelineLayout layout,
36 const GrVkDescriptorSetManager::Handle& samplerDSHandle,
37 const GrVkDescriptorSetManager::Handle& texelBufferDSHandle,
Brian Salomon1471df92018-06-08 10:49:00 -040038 const GrGLSLBuiltinUniformHandles& builtinUniformHandles,
Brian Salomon4d3f5172018-06-07 14:42:52 -040039 const UniformInfoArray& uniforms,
40 uint32_t geometryUniformSize,
41 uint32_t fragmentUniformSize,
42 uint32_t numSamplers,
43 uint32_t numTexelBuffers,
44 std::unique_ptr<GrGLSLPrimitiveProcessor> geometryProcessor,
45 std::unique_ptr<GrGLSLXferProcessor> xferProcessor,
46 std::unique_ptr<std::unique_ptr<GrGLSLFragmentProcessor>[]> fragmentProcessors,
47 int fragmentProcessorCnt)
48 : fPipeline(pipeline)
Greg Daniel7d918fd2018-06-19 15:22:01 -040049 , fPipelineLayout(new GrVkPipelineLayout(layout))
Brian Salomon4d3f5172018-06-07 14:42:52 -040050 , fUniformDescriptorSet(nullptr)
51 , fSamplerDescriptorSet(nullptr)
52 , fTexelBufferDescriptorSet(nullptr)
53 , fSamplerDSHandle(samplerDSHandle)
54 , fTexelBufferDSHandle(texelBufferDSHandle)
55 , fBuiltinUniformHandles(builtinUniformHandles)
56 , fGeometryProcessor(std::move(geometryProcessor))
57 , fXferProcessor(std::move(xferProcessor))
58 , fFragmentProcessors(std::move(fragmentProcessors))
59 , fFragmentProcessorCnt(fragmentProcessorCnt)
Brian Salomon4d3f5172018-06-07 14:42:52 -040060 , fDataManager(uniforms, geometryUniformSize, fragmentUniformSize) {
jvanverth992ad362016-02-26 09:21:02 -080061 fSamplers.setReserve(numSamplers);
62 fTextureViews.setReserve(numSamplers);
63 fTextures.setReserve(numSamplers);
Greg Daniel31ec1442017-05-08 10:30:59 -040064 fBufferViews.setReserve(numTexelBuffers);
65 fTexelBuffers.setReserve(numTexelBuffers);
jvanverth992ad362016-02-26 09:21:02 -080066
egdanielc2dc1b22016-03-18 13:18:23 -070067 fDescriptorSets[0] = VK_NULL_HANDLE;
68 fDescriptorSets[1] = VK_NULL_HANDLE;
Greg Daniel31ec1442017-05-08 10:30:59 -040069 fDescriptorSets[2] = VK_NULL_HANDLE;
jvanverth992ad362016-02-26 09:21:02 -080070
Greg Daniel18f96022017-05-04 15:09:03 -040071 fGeometryUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, geometryUniformSize));
jvanverth4c6e47a2016-07-22 10:34:52 -070072 fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformSize));
jvanverth992ad362016-02-26 09:21:02 -080073
jvanverth992ad362016-02-26 09:21:02 -080074 fNumSamplers = numSamplers;
Greg Daniel31ec1442017-05-08 10:30:59 -040075 fNumTexelBuffers = numTexelBuffers;
jvanverth992ad362016-02-26 09:21:02 -080076}
77
egdaniel22281c12016-03-23 13:49:40 -070078GrVkPipelineState::~GrVkPipelineState() {
Ethan Nicholas87f340e2017-01-03 14:32:01 -050079 // Must have freed all GPU resources before this is destroyed
jvanverth992ad362016-02-26 09:21:02 -080080 SkASSERT(!fPipeline);
jvanverth992ad362016-02-26 09:21:02 -080081 SkASSERT(!fPipelineLayout);
jvanverth992ad362016-02-26 09:21:02 -080082 SkASSERT(!fSamplers.count());
83 SkASSERT(!fTextureViews.count());
84 SkASSERT(!fTextures.count());
Greg Daniel31ec1442017-05-08 10:30:59 -040085 SkASSERT(!fBufferViews.count());
86 SkASSERT(!fTexelBuffers.count());
jvanverth992ad362016-02-26 09:21:02 -080087}
88
egdaniel22281c12016-03-23 13:49:40 -070089void GrVkPipelineState::freeTempResources(const GrVkGpu* gpu) {
jvanverth992ad362016-02-26 09:21:02 -080090 for (int i = 0; i < fSamplers.count(); ++i) {
91 fSamplers[i]->unref(gpu);
92 }
93 fSamplers.rewind();
94
95 for (int i = 0; i < fTextureViews.count(); ++i) {
Greg Daniel31ec1442017-05-08 10:30:59 -040096 fTextureViews[i]->unref(gpu);
jvanverth992ad362016-02-26 09:21:02 -080097 }
98 fTextureViews.rewind();
99
100 for (int i = 0; i < fTextures.count(); ++i) {
Greg Daniel31ec1442017-05-08 10:30:59 -0400101 fTextures[i]->unref(gpu);
jvanverth992ad362016-02-26 09:21:02 -0800102 }
103 fTextures.rewind();
Greg Daniel31ec1442017-05-08 10:30:59 -0400104
105 for (int i = 0; i < fBufferViews.count(); ++i) {
106 fBufferViews[i]->unref(gpu);
107 }
108 fBufferViews.rewind();
109
110 for (int i = 0; i < fTexelBuffers.count(); ++i) {
111 fTexelBuffers[i]->unref(gpu);
112 }
113 fTexelBuffers.rewind();
jvanverth992ad362016-02-26 09:21:02 -0800114}
115
egdaniel22281c12016-03-23 13:49:40 -0700116void GrVkPipelineState::freeGPUResources(const GrVkGpu* gpu) {
jvanverth992ad362016-02-26 09:21:02 -0800117 if (fPipeline) {
118 fPipeline->unref(gpu);
119 fPipeline = nullptr;
120 }
egdanielc2dc1b22016-03-18 13:18:23 -0700121
jvanverth992ad362016-02-26 09:21:02 -0800122 if (fPipelineLayout) {
Greg Daniel7d918fd2018-06-19 15:22:01 -0400123 fPipelineLayout->unref(gpu);
124 fPipelineLayout = nullptr;
jvanverth992ad362016-02-26 09:21:02 -0800125 }
126
Greg Daniel18f96022017-05-04 15:09:03 -0400127 if (fGeometryUniformBuffer) {
128 fGeometryUniformBuffer->release(gpu);
jvanverth992ad362016-02-26 09:21:02 -0800129 }
130
131 if (fFragmentUniformBuffer) {
132 fFragmentUniformBuffer->release(gpu);
133 }
egdanielc2dc1b22016-03-18 13:18:23 -0700134
egdaniela95220d2016-07-21 11:50:37 -0700135 if (fUniformDescriptorSet) {
136 fUniformDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu));
137 fUniformDescriptorSet = nullptr;
egdaniel778555c2016-05-02 06:50:36 -0700138 }
egdanielc2dc1b22016-03-18 13:18:23 -0700139
egdaniel707bbd62016-07-26 07:19:47 -0700140 if (fSamplerDescriptorSet) {
141 fSamplerDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu));
142 fSamplerDescriptorSet = nullptr;
143 }
144
Greg Daniel31ec1442017-05-08 10:30:59 -0400145 if (fTexelBufferDescriptorSet) {
146 fTexelBufferDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu));
147 fTexelBufferDescriptorSet = nullptr;
148 }
149
150
jvanverth992ad362016-02-26 09:21:02 -0800151 this->freeTempResources(gpu);
152}
153
egdaniel22281c12016-03-23 13:49:40 -0700154void GrVkPipelineState::abandonGPUResources() {
Greg Daniel7d918fd2018-06-19 15:22:01 -0400155 if (fPipeline) {
156 fPipeline->unrefAndAbandon();
157 fPipeline = nullptr;
158 }
egdanielc2dc1b22016-03-18 13:18:23 -0700159
Greg Daniel7d918fd2018-06-19 15:22:01 -0400160 if (fPipelineLayout) {
161 fPipelineLayout->unrefAndAbandon();
162 fPipelineLayout = nullptr;
163 }
jvanverth992ad362016-02-26 09:21:02 -0800164
Greg Daniel18f96022017-05-04 15:09:03 -0400165 fGeometryUniformBuffer->abandon();
jvanverth992ad362016-02-26 09:21:02 -0800166 fFragmentUniformBuffer->abandon();
167
168 for (int i = 0; i < fSamplers.count(); ++i) {
169 fSamplers[i]->unrefAndAbandon();
170 }
171 fSamplers.rewind();
172
173 for (int i = 0; i < fTextureViews.count(); ++i) {
174 fTextureViews[i]->unrefAndAbandon();
175 }
176 fTextureViews.rewind();
177
178 for (int i = 0; i < fTextures.count(); ++i) {
179 fTextures[i]->unrefAndAbandon();
180 }
181 fTextures.rewind();
egdanielc2dc1b22016-03-18 13:18:23 -0700182
Greg Daniel31ec1442017-05-08 10:30:59 -0400183 for (int i = 0; i < fBufferViews.count(); ++i) {
184 fBufferViews[i]->unrefAndAbandon();
185 }
186 fBufferViews.rewind();
187
188 for (int i = 0; i < fTexelBuffers.count(); ++i) {
189 fTexelBuffers[i]->unrefAndAbandon();
190 }
191
192 fTexelBuffers.rewind();
egdaniela95220d2016-07-21 11:50:37 -0700193 if (fUniformDescriptorSet) {
194 fUniformDescriptorSet->unrefAndAbandon();
195 fUniformDescriptorSet = nullptr;
egdaniel778555c2016-05-02 06:50:36 -0700196 }
egdaniel707bbd62016-07-26 07:19:47 -0700197
198 if (fSamplerDescriptorSet) {
199 fSamplerDescriptorSet->unrefAndAbandon();
200 fSamplerDescriptorSet = nullptr;
201 }
Greg Daniel31ec1442017-05-08 10:30:59 -0400202
203 if (fTexelBufferDescriptorSet) {
204 fTexelBufferDescriptorSet->unrefAndAbandon();
205 fTexelBufferDescriptorSet = nullptr;
206 }
jvanverth992ad362016-02-26 09:21:02 -0800207}
208
Brian Salomonab015ef2017-04-04 10:15:51 -0400209static void append_texture_bindings(
210 const GrResourceIOProcessor& processor,
Greg Daniel31ec1442017-05-08 10:30:59 -0400211 SkTArray<const GrResourceIOProcessor::TextureSampler*>* textureBindings,
212 SkTArray<const GrResourceIOProcessor::BufferAccess*>* bufferAccesses) {
Brian Salomon0bbecb22016-11-17 11:38:22 -0500213 if (int numTextureSamplers = processor.numTextureSamplers()) {
Brian Salomonab015ef2017-04-04 10:15:51 -0400214 const GrResourceIOProcessor::TextureSampler** bindings =
Brian Salomon0bbecb22016-11-17 11:38:22 -0500215 textureBindings->push_back_n(numTextureSamplers);
jvanverth992ad362016-02-26 09:21:02 -0800216 int i = 0;
217 do {
Brian Salomon0bbecb22016-11-17 11:38:22 -0500218 bindings[i] = &processor.textureSampler(i);
219 } while (++i < numTextureSamplers);
jvanverth992ad362016-02-26 09:21:02 -0800220 }
Greg Daniel31ec1442017-05-08 10:30:59 -0400221 if (int numTexelBuffers = processor.numBuffers()) {
222 const GrResourceIOProcessor::BufferAccess** accesses =
223 bufferAccesses->push_back_n(numTexelBuffers);
224 int i = 0;
225 do {
226 accesses[i] = &processor.bufferAccess(i);
227 } while (++i < numTexelBuffers);
228 }
jvanverth992ad362016-02-26 09:21:02 -0800229}
230
egdaniel22281c12016-03-23 13:49:40 -0700231void GrVkPipelineState::setData(GrVkGpu* gpu,
232 const GrPrimitiveProcessor& primProc,
233 const GrPipeline& pipeline) {
jvanverth992ad362016-02-26 09:21:02 -0800234 // This is here to protect against someone calling setData multiple times in a row without
235 // freeing the tempData between calls.
236 this->freeTempResources(gpu);
237
Robert Phillips2890fbf2017-07-26 15:48:41 -0400238 this->setRenderTargetState(pipeline.proxy());
jvanverth992ad362016-02-26 09:21:02 -0800239
Brian Salomonab015ef2017-04-04 10:15:51 -0400240 SkSTArray<8, const GrResourceIOProcessor::TextureSampler*> textureBindings;
Greg Daniel31ec1442017-05-08 10:30:59 -0400241 SkSTArray<8, const GrResourceIOProcessor::BufferAccess*> bufferAccesses;
jvanverth992ad362016-02-26 09:21:02 -0800242
bsalomona624bf32016-09-20 09:12:47 -0700243 fGeometryProcessor->setData(fDataManager, primProc,
244 GrFragmentProcessor::CoordTransformIter(pipeline));
Greg Daniel31ec1442017-05-08 10:30:59 -0400245 append_texture_bindings(primProc, &textureBindings, &bufferAccesses);
jvanverth992ad362016-02-26 09:21:02 -0800246
bsalomonb58a2b42016-09-26 06:55:02 -0700247 GrFragmentProcessor::Iter iter(pipeline);
Brian Salomon4d3f5172018-06-07 14:42:52 -0400248 GrGLSLFragmentProcessor::Iter glslIter(fFragmentProcessors.get(), fFragmentProcessorCnt);
bsalomonb58a2b42016-09-26 06:55:02 -0700249 const GrFragmentProcessor* fp = iter.next();
250 GrGLSLFragmentProcessor* glslFP = glslIter.next();
251 while (fp && glslFP) {
252 glslFP->setData(fDataManager, *fp);
Greg Daniel31ec1442017-05-08 10:30:59 -0400253 append_texture_bindings(*fp, &textureBindings, &bufferAccesses);
mtklein85552e42016-09-26 08:39:43 -0700254 fp = iter.next();
255 glslFP = glslIter.next();
jvanverth992ad362016-02-26 09:21:02 -0800256 }
bsalomonb58a2b42016-09-26 06:55:02 -0700257 SkASSERT(!fp && !glslFP);
jvanverth992ad362016-02-26 09:21:02 -0800258
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400259 {
260 SkIPoint offset;
261 GrTexture* dstTexture = pipeline.peekDstTexture(&offset);
262
263 fXferProcessor->setData(fDataManager, pipeline.getXferProcessor(), dstTexture, offset);
264 }
265
Robert Phillips6be756b2018-01-16 15:07:54 -0500266 GrResourceProvider* resourceProvider = gpu->getContext()->contextPriv().resourceProvider();
267
Brian Salomonab015ef2017-04-04 10:15:51 -0400268 GrResourceIOProcessor::TextureSampler dstTextureSampler;
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400269 if (GrTextureProxy* dstTextureProxy = pipeline.dstTextureProxy()) {
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400270 dstTextureSampler.reset(sk_ref_sp(dstTextureProxy));
Robert Phillips6be756b2018-01-16 15:07:54 -0500271 SkAssertResult(dstTextureSampler.instantiate(resourceProvider));
Brian Salomon18dfa982017-04-03 16:57:43 -0400272 textureBindings.push_back(&dstTextureSampler);
273 }
jvanverth992ad362016-02-26 09:21:02 -0800274
egdanielc2dc1b22016-03-18 13:18:23 -0700275 // Get new descriptor sets
276 if (fNumSamplers) {
egdaniel707bbd62016-07-26 07:19:47 -0700277 if (fSamplerDescriptorSet) {
278 fSamplerDescriptorSet->recycle(gpu);
279 }
280 fSamplerDescriptorSet = gpu->resourceProvider().getSamplerDescriptorSet(fSamplerDSHandle);
281 int samplerDSIdx = GrVkUniformHandler::kSamplerDescSet;
282 fDescriptorSets[samplerDSIdx] = fSamplerDescriptorSet->descriptorSet();
Brian Osman2b23c4b2018-06-01 12:25:08 -0400283 this->writeSamplers(gpu, textureBindings);
egdanielc2dc1b22016-03-18 13:18:23 -0700284 }
egdanielb4aa3622016-04-06 13:47:08 -0700285
Greg Daniel31ec1442017-05-08 10:30:59 -0400286 if (fNumTexelBuffers) {
287 if (fTexelBufferDescriptorSet) {
288 fTexelBufferDescriptorSet->recycle(gpu);
289 }
290 fTexelBufferDescriptorSet =
291 gpu->resourceProvider().getSamplerDescriptorSet(fTexelBufferDSHandle);
292 int texelBufferDSIdx = GrVkUniformHandler::kTexelBufferDescSet;
293 fDescriptorSets[texelBufferDSIdx] = fTexelBufferDescriptorSet->descriptorSet();
294 this->writeTexelBuffers(gpu, bufferAccesses);
295 }
296
Greg Daniel18f96022017-05-04 15:09:03 -0400297 if (fGeometryUniformBuffer || fFragmentUniformBuffer) {
Ben Wagner145dbcd2016-11-03 14:40:50 -0400298 if (fDataManager.uploadUniformBuffers(gpu,
Greg Daniel18f96022017-05-04 15:09:03 -0400299 fGeometryUniformBuffer.get(),
Ben Wagner145dbcd2016-11-03 14:40:50 -0400300 fFragmentUniformBuffer.get())
301 || !fUniformDescriptorSet)
302 {
egdaniela95220d2016-07-21 11:50:37 -0700303 if (fUniformDescriptorSet) {
304 fUniformDescriptorSet->recycle(gpu);
egdaniel778555c2016-05-02 06:50:36 -0700305 }
egdaniela95220d2016-07-21 11:50:37 -0700306 fUniformDescriptorSet = gpu->resourceProvider().getUniformDescriptorSet();
307 int uniformDSIdx = GrVkUniformHandler::kUniformBufferDescSet;
308 fDescriptorSets[uniformDSIdx] = fUniformDescriptorSet->descriptorSet();
egdaniel7cbffda2016-04-08 13:27:53 -0700309 this->writeUniformBuffers(gpu);
310 }
egdanielb4aa3622016-04-06 13:47:08 -0700311 }
jvanverth992ad362016-02-26 09:21:02 -0800312}
313
Greg Daniel18f96022017-05-04 15:09:03 -0400314void set_uniform_descriptor_writes(VkWriteDescriptorSet* descriptorWrite,
315 VkDescriptorBufferInfo* bufferInfo,
316 const GrVkUniformBuffer* buffer,
317 VkDescriptorSet descriptorSet,
318 uint32_t binding) {
319
320 memset(bufferInfo, 0, sizeof(VkDescriptorBufferInfo));
321 bufferInfo->buffer = buffer->buffer();
322 bufferInfo->offset = buffer->offset();
323 bufferInfo->range = buffer->size();
324
325 memset(descriptorWrite, 0, sizeof(VkWriteDescriptorSet));
326 descriptorWrite->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
327 descriptorWrite->pNext = nullptr;
Greg Daniel783c4362017-05-04 17:29:09 -0400328 descriptorWrite->dstSet = descriptorSet;
Greg Daniel18f96022017-05-04 15:09:03 -0400329 descriptorWrite->dstBinding = binding;
330 descriptorWrite->dstArrayElement = 0;
331 descriptorWrite->descriptorCount = 1;
332 descriptorWrite->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
333 descriptorWrite->pImageInfo = nullptr;
334 descriptorWrite->pBufferInfo = bufferInfo;
335 descriptorWrite->pTexelBufferView = nullptr;
336}
337
egdaniel22281c12016-03-23 13:49:40 -0700338void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) {
Greg Daniel18f96022017-05-04 15:09:03 -0400339 VkWriteDescriptorSet descriptorWrites[3];
340 VkDescriptorBufferInfo bufferInfos[3];
jvanverth992ad362016-02-26 09:21:02 -0800341
Greg Daniel18f96022017-05-04 15:09:03 -0400342 uint32_t writeCount = 0;
jvanverth992ad362016-02-26 09:21:02 -0800343
Greg Daniel18f96022017-05-04 15:09:03 -0400344 // Geometry Uniform Buffer
345 if (fGeometryUniformBuffer.get()) {
346 set_uniform_descriptor_writes(&descriptorWrites[writeCount],
347 &bufferInfos[writeCount],
348 fGeometryUniformBuffer.get(),
349 fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
350 GrVkUniformHandler::kGeometryBinding);
351 ++writeCount;
jvanverth992ad362016-02-26 09:21:02 -0800352 }
353
354 // Fragment Uniform Buffer
355 if (fFragmentUniformBuffer.get()) {
Greg Daniel18f96022017-05-04 15:09:03 -0400356 set_uniform_descriptor_writes(&descriptorWrites[writeCount],
357 &bufferInfos[writeCount],
358 fFragmentUniformBuffer.get(),
359 fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
360 GrVkUniformHandler::kFragBinding);
361 ++writeCount;
jvanverth992ad362016-02-26 09:21:02 -0800362 }
363
Greg Daniel18f96022017-05-04 15:09:03 -0400364 if (writeCount) {
jvanverth992ad362016-02-26 09:21:02 -0800365 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
Greg Daniel18f96022017-05-04 15:09:03 -0400366 writeCount,
367 descriptorWrites,
jvanverth992ad362016-02-26 09:21:02 -0800368 0, nullptr));
369 }
370}
371
Brian Salomon0bbecb22016-11-17 11:38:22 -0500372void GrVkPipelineState::writeSamplers(
373 GrVkGpu* gpu,
Brian Osman2b23c4b2018-06-01 12:25:08 -0400374 const SkTArray<const GrResourceIOProcessor::TextureSampler*>& textureBindings) {
jvanverth992ad362016-02-26 09:21:02 -0800375 SkASSERT(fNumSamplers == textureBindings.count());
376
377 for (int i = 0; i < textureBindings.count(); ++i) {
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400378 GrSamplerState state = textureBindings[i]->samplerState();
jvanverth992ad362016-02-26 09:21:02 -0800379
Robert Phillips9bee2e52017-05-29 12:37:20 -0400380 GrVkTexture* texture = static_cast<GrVkTexture*>(textureBindings[i]->peekTexture());
jvanverth62340062016-04-26 08:01:44 -0700381
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400382 fSamplers.push(gpu->resourceProvider().findOrCreateCompatibleSampler(
383 state, texture->texturePriv().maxMipMapLevel()));
jvanverth992ad362016-02-26 09:21:02 -0800384
egdanielb2df0c22016-05-13 11:30:37 -0700385 const GrVkResource* textureResource = texture->resource();
jvanverth992ad362016-02-26 09:21:02 -0800386 textureResource->ref();
387 fTextures.push(textureResource);
388
Brian Osman2b23c4b2018-06-01 12:25:08 -0400389 const GrVkImageView* textureView = texture->textureView();
jvanverth992ad362016-02-26 09:21:02 -0800390 textureView->ref();
391 fTextureViews.push(textureView);
392
jvanverth992ad362016-02-26 09:21:02 -0800393 VkDescriptorImageInfo imageInfo;
394 memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
395 imageInfo.sampler = fSamplers[i]->sampler();
brianosmanf05ab1b2016-05-12 11:01:10 -0700396 imageInfo.imageView = textureView->imageView();
jvanverth992ad362016-02-26 09:21:02 -0800397 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
398
399 VkWriteDescriptorSet writeInfo;
400 memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
401 writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
402 writeInfo.pNext = nullptr;
403 writeInfo.dstSet = fDescriptorSets[GrVkUniformHandler::kSamplerDescSet];
404 writeInfo.dstBinding = i;
405 writeInfo.dstArrayElement = 0;
406 writeInfo.descriptorCount = 1;
407 writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
408 writeInfo.pImageInfo = &imageInfo;
409 writeInfo.pBufferInfo = nullptr;
410 writeInfo.pTexelBufferView = nullptr;
411
412 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
413 1,
414 &writeInfo,
415 0,
416 nullptr));
417 }
418}
419
Greg Daniel31ec1442017-05-08 10:30:59 -0400420void GrVkPipelineState::writeTexelBuffers(
421 GrVkGpu* gpu,
422 const SkTArray<const GrResourceIOProcessor::BufferAccess*>& bufferAccesses) {
423 SkASSERT(fNumTexelBuffers == bufferAccesses.count());
424
425 for (int i = 0; i < bufferAccesses.count(); ++i) {
426 GrPixelConfig config = bufferAccesses[i]->texelConfig();
427 VkFormat format;
428 SkAssertResult(GrPixelConfigToVkFormat(config, &format));
429
430 GrVkTexelBuffer* buffer = static_cast<GrVkTexelBuffer*>(bufferAccesses[i]->buffer());
431
432 const GrVkBufferView* bufferView = GrVkBufferView::Create(gpu, buffer->buffer(),
433 format, buffer->offset(),
434 buffer->size());
435 fBufferViews.push(bufferView);
436
437 const GrVkResource* bufferResource = buffer->resource();
438 bufferResource->ref();
439 fTexelBuffers.push(bufferResource);
440
441 VkWriteDescriptorSet writeInfo;
442 memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
443 writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
444 writeInfo.pNext = nullptr;
445 writeInfo.dstSet = fDescriptorSets[GrVkUniformHandler::kTexelBufferDescSet];
446 writeInfo.dstBinding = i;
447 writeInfo.dstArrayElement = 0;
448 writeInfo.descriptorCount = 1;
449 writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
450 writeInfo.pImageInfo = nullptr;
451 writeInfo.pBufferInfo = nullptr;
452 VkBufferView vkBufferView = bufferView->bufferView();
453 writeInfo.pTexelBufferView = &vkBufferView;
454
455 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
456 1,
457 &writeInfo,
458 0,
459 nullptr));
460 }
461}
462
Robert Phillips2890fbf2017-07-26 15:48:41 -0400463void GrVkPipelineState::setRenderTargetState(const GrRenderTargetProxy* proxy) {
464 GrRenderTarget* rt = proxy->priv().peekRenderTarget();
465
jvanverth992ad362016-02-26 09:21:02 -0800466 // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
467 if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
Robert Phillips02bb6df2017-03-28 17:11:19 -0400468 fRenderTargetState.fRenderTargetSize.fHeight != rt->height()) {
469 fDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, SkIntToScalar(rt->height()));
jvanverth992ad362016-02-26 09:21:02 -0800470 }
471
472 // set RT adjustment
jvanverth992ad362016-02-26 09:21:02 -0800473 SkISize size;
474 size.set(rt->width(), rt->height());
475 SkASSERT(fBuiltinUniformHandles.fRTAdjustmentUni.isValid());
Robert Phillips2890fbf2017-07-26 15:48:41 -0400476 if (fRenderTargetState.fRenderTargetOrigin != proxy->origin() ||
jvanverth992ad362016-02-26 09:21:02 -0800477 fRenderTargetState.fRenderTargetSize != size) {
478 fRenderTargetState.fRenderTargetSize = size;
Robert Phillips2890fbf2017-07-26 15:48:41 -0400479 fRenderTargetState.fRenderTargetOrigin = proxy->origin();
jvanverth992ad362016-02-26 09:21:02 -0800480
481 float rtAdjustmentVec[4];
482 fRenderTargetState.getRTAdjustmentVec(rtAdjustmentVec);
egdaniel22281c12016-03-23 13:49:40 -0700483 fDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec);
jvanverth992ad362016-02-26 09:21:02 -0800484 }
485}
486
egdaniel22281c12016-03-23 13:49:40 -0700487void GrVkPipelineState::bind(const GrVkGpu* gpu, GrVkCommandBuffer* commandBuffer) {
jvanverth992ad362016-02-26 09:21:02 -0800488 commandBuffer->bindPipeline(gpu, fPipeline);
egdanielc2dc1b22016-03-18 13:18:23 -0700489
Greg Daniel31ec1442017-05-08 10:30:59 -0400490 if (fGeometryUniformBuffer || fFragmentUniformBuffer) {
491 int dsIndex = GrVkUniformHandler::kUniformBufferDescSet;
492 commandBuffer->bindDescriptorSets(gpu, this, fPipelineLayout,
493 dsIndex, 1,
494 &fDescriptorSets[dsIndex], 0, nullptr);
495 }
496 if (fNumSamplers) {
497 int dsIndex = GrVkUniformHandler::kSamplerDescSet;
498 commandBuffer->bindDescriptorSets(gpu, this, fPipelineLayout,
499 dsIndex, 1,
500 &fDescriptorSets[dsIndex], 0, nullptr);
501 }
502 if (fNumTexelBuffers) {
503 int dsIndex = GrVkUniformHandler::kTexelBufferDescSet;
504 commandBuffer->bindDescriptorSets(gpu, this, fPipelineLayout,
505 dsIndex, 1,
506 &fDescriptorSets[dsIndex], 0, nullptr);
egdanielc2dc1b22016-03-18 13:18:23 -0700507 }
jvanverth992ad362016-02-26 09:21:02 -0800508}
509
egdaniel22281c12016-03-23 13:49:40 -0700510void GrVkPipelineState::addUniformResources(GrVkCommandBuffer& commandBuffer) {
egdaniela95220d2016-07-21 11:50:37 -0700511 if (fUniformDescriptorSet) {
512 commandBuffer.addRecycledResource(fUniformDescriptorSet);
egdanielc2dc1b22016-03-18 13:18:23 -0700513 }
egdaniel707bbd62016-07-26 07:19:47 -0700514 if (fSamplerDescriptorSet) {
515 commandBuffer.addRecycledResource(fSamplerDescriptorSet);
516 }
Greg Daniel31ec1442017-05-08 10:30:59 -0400517 if (fTexelBufferDescriptorSet) {
518 commandBuffer.addRecycledResource(fTexelBufferDescriptorSet);
519 }
egdaniel707bbd62016-07-26 07:19:47 -0700520
Greg Daniel18f96022017-05-04 15:09:03 -0400521 if (fGeometryUniformBuffer.get()) {
522 commandBuffer.addRecycledResource(fGeometryUniformBuffer->resource());
jvanverth992ad362016-02-26 09:21:02 -0800523 }
524 if (fFragmentUniformBuffer.get()) {
egdaniel31bc7df2016-07-29 10:46:06 -0700525 commandBuffer.addRecycledResource(fFragmentUniformBuffer->resource());
jvanverth992ad362016-02-26 09:21:02 -0800526 }
egdaniel31bc7df2016-07-29 10:46:06 -0700527
jvanverth992ad362016-02-26 09:21:02 -0800528 for (int i = 0; i < fSamplers.count(); ++i) {
529 commandBuffer.addResource(fSamplers[i]);
530 }
531
532 for (int i = 0; i < fTextureViews.count(); ++i) {
533 commandBuffer.addResource(fTextureViews[i]);
534 }
535
536 for (int i = 0; i < fTextures.count(); ++i) {
537 commandBuffer.addResource(fTextures[i]);
538 }
Greg Daniel31ec1442017-05-08 10:30:59 -0400539
540 for (int i = 0; i < fBufferViews.count(); ++i) {
541 commandBuffer.addResource(fBufferViews[i]);
542 }
543
544 for (int i = 0; i < fTexelBuffers.count(); ++i) {
545 commandBuffer.addResource(fTexelBuffers[i]);
546 }
egdanielc2dc1b22016-03-18 13:18:23 -0700547}