blob: 9f18b1acee11891ea0ea38f82c73f9d8dde59417 [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"
24#include "GrVkTexture.h"
25#include "GrVkUniformBuffer.h"
Brian Salomon1471df92018-06-08 10:49:00 -040026#include "SkMipMap.h"
jvanverth992ad362016-02-26 09:21:02 -080027#include "glsl/GrGLSLFragmentProcessor.h"
28#include "glsl/GrGLSLGeometryProcessor.h"
29#include "glsl/GrGLSLXferProcessor.h"
30
Brian Salomon1471df92018-06-08 10:49:00 -040031GrVkPipelineState::GrVkPipelineState(
32 GrVkGpu* gpu,
Brian Salomon4d3f5172018-06-07 14:42:52 -040033 GrVkPipeline* pipeline,
34 VkPipelineLayout layout,
35 const GrVkDescriptorSetManager::Handle& samplerDSHandle,
Brian Salomon1471df92018-06-08 10:49:00 -040036 const GrGLSLBuiltinUniformHandles& builtinUniformHandles,
Brian Salomon4d3f5172018-06-07 14:42:52 -040037 const UniformInfoArray& uniforms,
38 uint32_t geometryUniformSize,
39 uint32_t fragmentUniformSize,
Greg Daniel7a82edf2018-12-04 10:54:34 -050040 const UniformInfoArray& samplers,
Brian Salomon4d3f5172018-06-07 14:42:52 -040041 std::unique_ptr<GrGLSLPrimitiveProcessor> geometryProcessor,
42 std::unique_ptr<GrGLSLXferProcessor> xferProcessor,
43 std::unique_ptr<std::unique_ptr<GrGLSLFragmentProcessor>[]> fragmentProcessors,
44 int fragmentProcessorCnt)
45 : fPipeline(pipeline)
Greg Daniel7d918fd2018-06-19 15:22:01 -040046 , fPipelineLayout(new GrVkPipelineLayout(layout))
Brian Salomon4d3f5172018-06-07 14:42:52 -040047 , fUniformDescriptorSet(nullptr)
48 , fSamplerDescriptorSet(nullptr)
Brian Salomon4d3f5172018-06-07 14:42:52 -040049 , fSamplerDSHandle(samplerDSHandle)
Brian Salomon4d3f5172018-06-07 14:42:52 -040050 , fBuiltinUniformHandles(builtinUniformHandles)
51 , fGeometryProcessor(std::move(geometryProcessor))
52 , fXferProcessor(std::move(xferProcessor))
53 , fFragmentProcessors(std::move(fragmentProcessors))
54 , fFragmentProcessorCnt(fragmentProcessorCnt)
Brian Salomon4d3f5172018-06-07 14:42:52 -040055 , fDataManager(uniforms, geometryUniformSize, fragmentUniformSize) {
egdanielc2dc1b22016-03-18 13:18:23 -070056 fDescriptorSets[0] = VK_NULL_HANDLE;
57 fDescriptorSets[1] = VK_NULL_HANDLE;
Greg Daniel31ec1442017-05-08 10:30:59 -040058 fDescriptorSets[2] = VK_NULL_HANDLE;
jvanverth992ad362016-02-26 09:21:02 -080059
Greg Daniel18f96022017-05-04 15:09:03 -040060 fGeometryUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, geometryUniformSize));
jvanverth4c6e47a2016-07-22 10:34:52 -070061 fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformSize));
jvanverth992ad362016-02-26 09:21:02 -080062
Greg Daniel7a82edf2018-12-04 10:54:34 -050063 fNumSamplers = samplers.count();
64
65 for (int i = 0; i < fNumSamplers; ++i) {
66 // We store the immutable samplers here and take ownership of the ref from the
67 // GrVkUnformHandler.
68 fImmutableSamplers.push_back(samplers[i].fImmutableSampler);
69 }
jvanverth992ad362016-02-26 09:21:02 -080070}
71
egdaniel22281c12016-03-23 13:49:40 -070072GrVkPipelineState::~GrVkPipelineState() {
Ethan Nicholas87f340e2017-01-03 14:32:01 -050073 // Must have freed all GPU resources before this is destroyed
jvanverth992ad362016-02-26 09:21:02 -080074 SkASSERT(!fPipeline);
jvanverth992ad362016-02-26 09:21:02 -080075 SkASSERT(!fPipelineLayout);
jvanverth992ad362016-02-26 09:21:02 -080076}
77
egdaniel22281c12016-03-23 13:49:40 -070078void GrVkPipelineState::freeGPUResources(const GrVkGpu* gpu) {
jvanverth992ad362016-02-26 09:21:02 -080079 if (fPipeline) {
80 fPipeline->unref(gpu);
81 fPipeline = nullptr;
82 }
egdanielc2dc1b22016-03-18 13:18:23 -070083
jvanverth992ad362016-02-26 09:21:02 -080084 if (fPipelineLayout) {
Greg Daniel7d918fd2018-06-19 15:22:01 -040085 fPipelineLayout->unref(gpu);
86 fPipelineLayout = nullptr;
jvanverth992ad362016-02-26 09:21:02 -080087 }
88
Greg Daniel18f96022017-05-04 15:09:03 -040089 if (fGeometryUniformBuffer) {
90 fGeometryUniformBuffer->release(gpu);
Greg Danieladb4bfe2018-08-23 16:15:05 -040091 fGeometryUniformBuffer.reset();
jvanverth992ad362016-02-26 09:21:02 -080092 }
93
94 if (fFragmentUniformBuffer) {
95 fFragmentUniformBuffer->release(gpu);
Greg Danieladb4bfe2018-08-23 16:15:05 -040096 fFragmentUniformBuffer.reset();
jvanverth992ad362016-02-26 09:21:02 -080097 }
egdanielc2dc1b22016-03-18 13:18:23 -070098
egdaniela95220d2016-07-21 11:50:37 -070099 if (fUniformDescriptorSet) {
100 fUniformDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu));
101 fUniformDescriptorSet = nullptr;
egdaniel778555c2016-05-02 06:50:36 -0700102 }
egdanielc2dc1b22016-03-18 13:18:23 -0700103
egdaniel707bbd62016-07-26 07:19:47 -0700104 if (fSamplerDescriptorSet) {
105 fSamplerDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu));
106 fSamplerDescriptorSet = nullptr;
107 }
jvanverth992ad362016-02-26 09:21:02 -0800108}
109
egdaniel22281c12016-03-23 13:49:40 -0700110void GrVkPipelineState::abandonGPUResources() {
Greg Daniel7d918fd2018-06-19 15:22:01 -0400111 if (fPipeline) {
112 fPipeline->unrefAndAbandon();
113 fPipeline = nullptr;
114 }
egdanielc2dc1b22016-03-18 13:18:23 -0700115
Greg Daniel7d918fd2018-06-19 15:22:01 -0400116 if (fPipelineLayout) {
117 fPipelineLayout->unrefAndAbandon();
118 fPipelineLayout = nullptr;
119 }
jvanverth992ad362016-02-26 09:21:02 -0800120
Greg Danieladb4bfe2018-08-23 16:15:05 -0400121 if (fGeometryUniformBuffer) {
122 fGeometryUniformBuffer->abandon();
123 fGeometryUniformBuffer.reset();
124 }
125
126 if (fFragmentUniformBuffer) {
127 fFragmentUniformBuffer->abandon();
128 fFragmentUniformBuffer.reset();
129 }
jvanverth992ad362016-02-26 09:21:02 -0800130
egdaniela95220d2016-07-21 11:50:37 -0700131 if (fUniformDescriptorSet) {
132 fUniformDescriptorSet->unrefAndAbandon();
133 fUniformDescriptorSet = nullptr;
egdaniel778555c2016-05-02 06:50:36 -0700134 }
egdaniel707bbd62016-07-26 07:19:47 -0700135
136 if (fSamplerDescriptorSet) {
137 fSamplerDescriptorSet->unrefAndAbandon();
138 fSamplerDescriptorSet = nullptr;
139 }
jvanverth992ad362016-02-26 09:21:02 -0800140}
141
Brian Salomonf7232642018-09-19 08:58:08 -0400142void GrVkPipelineState::setAndBindUniforms(GrVkGpu* gpu,
143 const GrPrimitiveProcessor& primProc,
144 const GrPipeline& pipeline,
145 GrVkCommandBuffer* commandBuffer) {
Robert Phillips2890fbf2017-07-26 15:48:41 -0400146 this->setRenderTargetState(pipeline.proxy());
jvanverth992ad362016-02-26 09:21:02 -0800147
Brian Salomonf7232642018-09-19 08:58:08 -0400148 fGeometryProcessor->setData(fDataManager, primProc,
149 GrFragmentProcessor::CoordTransformIter(pipeline));
150 GrFragmentProcessor::Iter iter(pipeline);
151 GrGLSLFragmentProcessor::Iter glslIter(fFragmentProcessors.get(), fFragmentProcessorCnt);
152 const GrFragmentProcessor* fp = iter.next();
153 GrGLSLFragmentProcessor* glslFP = glslIter.next();
154 while (fp && glslFP) {
155 glslFP->setData(fDataManager, *fp);
156 fp = iter.next();
157 glslFP = glslIter.next();
158 }
159 SkASSERT(!fp && !glslFP);
160
161 {
162 SkIPoint offset;
163 GrTexture* dstTexture = pipeline.peekDstTexture(&offset);
164
165 fXferProcessor->setData(fDataManager, pipeline.getXferProcessor(), dstTexture, offset);
166 }
167
168 // Get new descriptor set
169 if (fGeometryUniformBuffer || fFragmentUniformBuffer) {
170 int uniformDSIdx = GrVkUniformHandler::kUniformBufferDescSet;
171 if (fDataManager.uploadUniformBuffers(
172 gpu, fGeometryUniformBuffer.get(), fFragmentUniformBuffer.get()) ||
173 !fUniformDescriptorSet) {
174 if (fUniformDescriptorSet) {
175 fUniformDescriptorSet->recycle(gpu);
176 }
177 fUniformDescriptorSet = gpu->resourceProvider().getUniformDescriptorSet();
178 fDescriptorSets[uniformDSIdx] = fUniformDescriptorSet->descriptorSet();
179 this->writeUniformBuffers(gpu);
180 }
181 commandBuffer->bindDescriptorSets(gpu, this, fPipelineLayout, uniformDSIdx, 1,
182 &fDescriptorSets[uniformDSIdx], 0, nullptr);
183 if (fUniformDescriptorSet) {
184 commandBuffer->addRecycledResource(fUniformDescriptorSet);
185 }
186 if (fGeometryUniformBuffer) {
187 commandBuffer->addRecycledResource(fGeometryUniformBuffer->resource());
188 }
189 if (fFragmentUniformBuffer) {
190 commandBuffer->addRecycledResource(fFragmentUniformBuffer->resource());
191 }
192 }
193}
194
195void GrVkPipelineState::setAndBindTextures(GrVkGpu* gpu,
196 const GrPrimitiveProcessor& primProc,
197 const GrPipeline& pipeline,
198 const GrTextureProxy* const primProcTextures[],
199 GrVkCommandBuffer* commandBuffer) {
200 SkASSERT(primProcTextures || !primProc.numTextureSamplers());
201
202 struct SamplerBindings {
203 GrSamplerState fState;
204 GrVkTexture* fTexture;
205 };
Brian Salomon5e81a122018-08-23 16:46:07 -0400206 SkAutoSTMalloc<8, SamplerBindings> samplerBindings(fNumSamplers);
207 int currTextureBinding = 0;
208
209 fGeometryProcessor->setData(fDataManager, primProc,
210 GrFragmentProcessor::CoordTransformIter(pipeline));
211 for (int i = 0; i < primProc.numTextureSamplers(); ++i) {
212 const auto& sampler = primProc.textureSampler(i);
213 auto texture = static_cast<GrVkTexture*>(primProcTextures[i]->peekTexture());
214 samplerBindings[currTextureBinding++] = {sampler.samplerState(), texture};
215 }
216
217 GrFragmentProcessor::Iter iter(pipeline);
218 GrGLSLFragmentProcessor::Iter glslIter(fFragmentProcessors.get(), fFragmentProcessorCnt);
219 const GrFragmentProcessor* fp = iter.next();
220 GrGLSLFragmentProcessor* glslFP = glslIter.next();
221 while (fp && glslFP) {
222 for (int i = 0; i < fp->numTextureSamplers(); ++i) {
223 const auto& sampler = fp->textureSampler(i);
224 samplerBindings[currTextureBinding++] =
225 {sampler.samplerState(), static_cast<GrVkTexture*>(sampler.peekTexture())};
226 }
227 fp = iter.next();
228 glslFP = glslIter.next();
229 }
230 SkASSERT(!fp && !glslFP);
231
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400232 if (GrTextureProxy* dstTextureProxy = pipeline.dstTextureProxy()) {
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400233 samplerBindings[currTextureBinding++] = {
234 GrSamplerState::ClampNearest(),
235 static_cast<GrVkTexture*>(dstTextureProxy->peekTexture())};
Brian Salomon18dfa982017-04-03 16:57:43 -0400236 }
jvanverth992ad362016-02-26 09:21:02 -0800237
Brian Salomonf7232642018-09-19 08:58:08 -0400238 // Get new descriptor set
Brian Salomone782f842018-07-31 13:53:11 -0400239 SkASSERT(fNumSamplers == currTextureBinding);
egdanielc2dc1b22016-03-18 13:18:23 -0700240 if (fNumSamplers) {
egdaniel707bbd62016-07-26 07:19:47 -0700241 if (fSamplerDescriptorSet) {
242 fSamplerDescriptorSet->recycle(gpu);
243 }
244 fSamplerDescriptorSet = gpu->resourceProvider().getSamplerDescriptorSet(fSamplerDSHandle);
245 int samplerDSIdx = GrVkUniformHandler::kSamplerDescSet;
246 fDescriptorSets[samplerDSIdx] = fSamplerDescriptorSet->descriptorSet();
Brian Salomonf7232642018-09-19 08:58:08 -0400247 for (int i = 0; i < fNumSamplers; ++i) {
248 const GrSamplerState& state = samplerBindings[i].fState;
249 GrVkTexture* texture = samplerBindings[i].fTexture;
egdanielb4aa3622016-04-06 13:47:08 -0700250
Brian Salomonf7232642018-09-19 08:58:08 -0400251 const GrVkImageView* textureView = texture->textureView();
Greg Daniel7a82edf2018-12-04 10:54:34 -0500252 const GrVkSampler* sampler = nullptr;
253 if (fImmutableSamplers[i]) {
254 sampler = fImmutableSamplers[i];
255 } else {
256 sampler = gpu->resourceProvider().findOrCreateCompatibleSampler(
Greg Daniel7e000222018-12-03 10:08:21 -0500257 state, texture->ycbcrConversionInfo());
Greg Daniel7a82edf2018-12-04 10:54:34 -0500258 }
259 SkASSERT(sampler);
Brian Salomonf7232642018-09-19 08:58:08 -0400260
261 VkDescriptorImageInfo imageInfo;
262 memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
263 imageInfo.sampler = sampler->sampler();
264 imageInfo.imageView = textureView->imageView();
265 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
266
267 VkWriteDescriptorSet writeInfo;
268 memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
269 writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
270 writeInfo.pNext = nullptr;
271 writeInfo.dstSet = fDescriptorSets[GrVkUniformHandler::kSamplerDescSet];
272 writeInfo.dstBinding = i;
273 writeInfo.dstArrayElement = 0;
274 writeInfo.descriptorCount = 1;
275 writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
276 writeInfo.pImageInfo = &imageInfo;
277 writeInfo.pBufferInfo = nullptr;
278 writeInfo.pTexelBufferView = nullptr;
279
280 GR_VK_CALL(gpu->vkInterface(),
281 UpdateDescriptorSets(gpu->device(), 1, &writeInfo, 0, nullptr));
282 commandBuffer->addResource(sampler);
Greg Daniel7a82edf2018-12-04 10:54:34 -0500283 if (!fImmutableSamplers[i]) {
284 sampler->unref(gpu);
285 }
Brian Salomonf7232642018-09-19 08:58:08 -0400286 commandBuffer->addResource(samplerBindings[i].fTexture->textureView());
287 commandBuffer->addResource(samplerBindings[i].fTexture->resource());
egdaniel7cbffda2016-04-08 13:27:53 -0700288 }
Brian Salomonf7232642018-09-19 08:58:08 -0400289
290 commandBuffer->bindDescriptorSets(gpu, this, fPipelineLayout, samplerDSIdx, 1,
291 &fDescriptorSets[samplerDSIdx], 0, nullptr);
292 commandBuffer->addRecycledResource(fSamplerDescriptorSet);
egdanielb4aa3622016-04-06 13:47:08 -0700293 }
jvanverth992ad362016-02-26 09:21:02 -0800294}
295
Greg Daniel18f96022017-05-04 15:09:03 -0400296void set_uniform_descriptor_writes(VkWriteDescriptorSet* descriptorWrite,
297 VkDescriptorBufferInfo* bufferInfo,
298 const GrVkUniformBuffer* buffer,
299 VkDescriptorSet descriptorSet,
300 uint32_t binding) {
301
302 memset(bufferInfo, 0, sizeof(VkDescriptorBufferInfo));
303 bufferInfo->buffer = buffer->buffer();
304 bufferInfo->offset = buffer->offset();
305 bufferInfo->range = buffer->size();
306
307 memset(descriptorWrite, 0, sizeof(VkWriteDescriptorSet));
308 descriptorWrite->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
309 descriptorWrite->pNext = nullptr;
Greg Daniel783c4362017-05-04 17:29:09 -0400310 descriptorWrite->dstSet = descriptorSet;
Greg Daniel18f96022017-05-04 15:09:03 -0400311 descriptorWrite->dstBinding = binding;
312 descriptorWrite->dstArrayElement = 0;
313 descriptorWrite->descriptorCount = 1;
314 descriptorWrite->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
315 descriptorWrite->pImageInfo = nullptr;
316 descriptorWrite->pBufferInfo = bufferInfo;
317 descriptorWrite->pTexelBufferView = nullptr;
318}
319
egdaniel22281c12016-03-23 13:49:40 -0700320void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) {
Greg Daniel18f96022017-05-04 15:09:03 -0400321 VkWriteDescriptorSet descriptorWrites[3];
322 VkDescriptorBufferInfo bufferInfos[3];
jvanverth992ad362016-02-26 09:21:02 -0800323
Greg Daniel18f96022017-05-04 15:09:03 -0400324 uint32_t writeCount = 0;
jvanverth992ad362016-02-26 09:21:02 -0800325
Greg Daniel18f96022017-05-04 15:09:03 -0400326 // Geometry Uniform Buffer
327 if (fGeometryUniformBuffer.get()) {
328 set_uniform_descriptor_writes(&descriptorWrites[writeCount],
329 &bufferInfos[writeCount],
330 fGeometryUniformBuffer.get(),
331 fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
332 GrVkUniformHandler::kGeometryBinding);
333 ++writeCount;
jvanverth992ad362016-02-26 09:21:02 -0800334 }
335
336 // Fragment Uniform Buffer
337 if (fFragmentUniformBuffer.get()) {
Greg Daniel18f96022017-05-04 15:09:03 -0400338 set_uniform_descriptor_writes(&descriptorWrites[writeCount],
339 &bufferInfos[writeCount],
340 fFragmentUniformBuffer.get(),
341 fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
342 GrVkUniformHandler::kFragBinding);
343 ++writeCount;
jvanverth992ad362016-02-26 09:21:02 -0800344 }
345
Greg Daniel18f96022017-05-04 15:09:03 -0400346 if (writeCount) {
jvanverth992ad362016-02-26 09:21:02 -0800347 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
Greg Daniel18f96022017-05-04 15:09:03 -0400348 writeCount,
349 descriptorWrites,
jvanverth992ad362016-02-26 09:21:02 -0800350 0, nullptr));
351 }
352}
353
Robert Phillips2890fbf2017-07-26 15:48:41 -0400354void GrVkPipelineState::setRenderTargetState(const GrRenderTargetProxy* proxy) {
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400355 GrRenderTarget* rt = proxy->peekRenderTarget();
Robert Phillips2890fbf2017-07-26 15:48:41 -0400356
jvanverth992ad362016-02-26 09:21:02 -0800357 // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
Greg Daniele6ab9982018-08-22 13:56:32 +0000358 if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
359 fRenderTargetState.fRenderTargetSize.fHeight != rt->height()) {
360 fDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, SkIntToScalar(rt->height()));
jvanverth992ad362016-02-26 09:21:02 -0800361 }
362
363 // set RT adjustment
jvanverth992ad362016-02-26 09:21:02 -0800364 SkISize size;
365 size.set(rt->width(), rt->height());
366 SkASSERT(fBuiltinUniformHandles.fRTAdjustmentUni.isValid());
Robert Phillips2890fbf2017-07-26 15:48:41 -0400367 if (fRenderTargetState.fRenderTargetOrigin != proxy->origin() ||
jvanverth992ad362016-02-26 09:21:02 -0800368 fRenderTargetState.fRenderTargetSize != size) {
369 fRenderTargetState.fRenderTargetSize = size;
Robert Phillips2890fbf2017-07-26 15:48:41 -0400370 fRenderTargetState.fRenderTargetOrigin = proxy->origin();
jvanverth992ad362016-02-26 09:21:02 -0800371
372 float rtAdjustmentVec[4];
373 fRenderTargetState.getRTAdjustmentVec(rtAdjustmentVec);
egdaniel22281c12016-03-23 13:49:40 -0700374 fDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec);
jvanverth992ad362016-02-26 09:21:02 -0800375 }
376}
377
Brian Salomonf7232642018-09-19 08:58:08 -0400378void GrVkPipelineState::bindPipeline(const GrVkGpu* gpu, GrVkCommandBuffer* commandBuffer) {
jvanverth992ad362016-02-26 09:21:02 -0800379 commandBuffer->bindPipeline(gpu, fPipeline);
egdanielc2dc1b22016-03-18 13:18:23 -0700380}