OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrVkPipelineState.h" | 8 #include "GrVkPipelineState.h" |
9 | 9 |
10 #include "GrPipeline.h" | 10 #include "GrPipeline.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 const BuiltinUniformHandles& builtinUniform
Handles, | 30 const BuiltinUniformHandles& builtinUniform
Handles, |
31 const UniformInfoArray& uniforms, | 31 const UniformInfoArray& uniforms, |
32 uint32_t vertexUniformSize, | 32 uint32_t vertexUniformSize, |
33 uint32_t fragmentUniformSize, | 33 uint32_t fragmentUniformSize, |
34 uint32_t numSamplers, | 34 uint32_t numSamplers, |
35 GrGLSLPrimitiveProcessor* geometryProcessor
, | 35 GrGLSLPrimitiveProcessor* geometryProcessor
, |
36 GrGLSLXferProcessor* xferProcessor, | 36 GrGLSLXferProcessor* xferProcessor, |
37 const GrGLSLFragProcs& fragmentProcessors) | 37 const GrGLSLFragProcs& fragmentProcessors) |
38 : fPipeline(pipeline) | 38 : fPipeline(pipeline) |
39 , fPipelineLayout(layout) | 39 , fPipelineLayout(layout) |
| 40 , fStartDS(SK_MaxS32) |
| 41 , fDSCount(0) |
40 , fBuiltinUniformHandles(builtinUniformHandles) | 42 , fBuiltinUniformHandles(builtinUniformHandles) |
41 , fGeometryProcessor(geometryProcessor) | 43 , fGeometryProcessor(geometryProcessor) |
42 , fXferProcessor(xferProcessor) | 44 , fXferProcessor(xferProcessor) |
43 , fFragmentProcessors(fragmentProcessors) | 45 , fFragmentProcessors(fragmentProcessors) |
44 , fDesc(desc) | 46 , fDesc(desc) |
45 , fDataManager(uniforms, vertexUniformSize, fragmentUniformSize) | 47 , fDataManager(uniforms, vertexUniformSize, fragmentUniformSize) |
46 , fSamplerPoolManager(dsLayout[GrVkUniformHandler::kSamplerDescSet], | 48 , fSamplerPoolManager(dsLayout[GrVkUniformHandler::kSamplerDescSet], |
47 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, numSamplers
, gpu) | 49 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, numSamplers
, gpu) |
48 , fUniformPoolManager(dsLayout[GrVkUniformHandler::kUniformBufferDescSet], | 50 , fUniformPoolManager(dsLayout[GrVkUniformHandler::kUniformBufferDescSet], |
49 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, gpu) { | 51 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| 52 (vertexUniformSize || fragmentUniformSize) ? 2 : 0, gp
u) { |
50 fSamplers.setReserve(numSamplers); | 53 fSamplers.setReserve(numSamplers); |
51 fTextureViews.setReserve(numSamplers); | 54 fTextureViews.setReserve(numSamplers); |
52 fTextures.setReserve(numSamplers); | 55 fTextures.setReserve(numSamplers); |
53 | 56 |
54 fDescriptorSets[0] = VK_NULL_HANDLE; | 57 fDescriptorSets[0] = VK_NULL_HANDLE; |
55 fDescriptorSets[1] = VK_NULL_HANDLE; | 58 fDescriptorSets[1] = VK_NULL_HANDLE; |
56 | 59 |
57 // Currently we are always binding a descriptor set for uniform buffers. | 60 // Currently we are always binding a descriptor set for uniform buffers. |
58 fStartDS = GrVkUniformHandler::kUniformBufferDescSet; | 61 if (vertexUniformSize || fragmentUniformSize) { |
59 fDSCount = 1; | 62 fDSCount++; |
| 63 fStartDS = GrVkUniformHandler::kUniformBufferDescSet; |
| 64 } |
60 if (numSamplers) { | 65 if (numSamplers) { |
61 fDSCount++; | 66 fDSCount++; |
62 fStartDS = SkTMin(fStartDS, (int)GrVkUniformHandler::kSamplerDescSet); | 67 fStartDS = SkTMin(fStartDS, (int)GrVkUniformHandler::kSamplerDescSet); |
63 } | 68 } |
64 | 69 |
65 fVertexUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, vertexUniformSize,
true)); | 70 fVertexUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, vertexUniformSize,
true)); |
66 fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformS
ize, true)); | 71 fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformS
ize, true)); |
67 | 72 |
68 fNumSamplers = numSamplers; | 73 fNumSamplers = numSamplers; |
69 } | 74 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 append_texture_bindings(processor, &textureBindings); | 187 append_texture_bindings(processor, &textureBindings); |
183 } | 188 } |
184 | 189 |
185 fXferProcessor->setData(fDataManager, pipeline.getXferProcessor()); | 190 fXferProcessor->setData(fDataManager, pipeline.getXferProcessor()); |
186 append_texture_bindings(pipeline.getXferProcessor(), &textureBindings); | 191 append_texture_bindings(pipeline.getXferProcessor(), &textureBindings); |
187 | 192 |
188 // Get new descriptor sets | 193 // Get new descriptor sets |
189 if (fNumSamplers) { | 194 if (fNumSamplers) { |
190 fSamplerPoolManager.getNewDescriptorSet(gpu, | 195 fSamplerPoolManager.getNewDescriptorSet(gpu, |
191 &fDescriptorSets[GrVkUniformHandler
::kSamplerDescSet]); | 196 &fDescriptorSets[GrVkUniformHandler
::kSamplerDescSet]); |
| 197 this->writeSamplers(gpu, textureBindings); |
192 } | 198 } |
193 fUniformPoolManager.getNewDescriptorSet(gpu, | 199 |
| 200 |
| 201 if (fVertexUniformBuffer.get() || fFragmentUniformBuffer.get()) { |
| 202 fUniformPoolManager.getNewDescriptorSet(gpu, |
194 &fDescriptorSets[GrVkUniformHandler::kUni
formBufferDescSet]); | 203 &fDescriptorSets[GrVkUniformHandler::kUni
formBufferDescSet]); |
195 | 204 this->writeUniformBuffers(gpu); |
196 this->writeUniformBuffers(gpu); | 205 } |
197 | |
198 this->writeSamplers(gpu, textureBindings); | |
199 } | 206 } |
200 | 207 |
201 void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { | 208 void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { |
202 fDataManager.uploadUniformBuffers(gpu, fVertexUniformBuffer, fFragmentUnifor
mBuffer); | 209 fDataManager.uploadUniformBuffers(gpu, fVertexUniformBuffer, fFragmentUnifor
mBuffer); |
203 | 210 |
204 VkWriteDescriptorSet descriptorWrites[2]; | 211 VkWriteDescriptorSet descriptorWrites[2]; |
205 memset(descriptorWrites, 0, 2 * sizeof(VkWriteDescriptorSet)); | 212 memset(descriptorWrites, 0, 2 * sizeof(VkWriteDescriptorSet)); |
206 | 213 |
207 uint32_t firstUniformWrite = 0; | 214 uint32_t firstUniformWrite = 0; |
208 uint32_t uniformBindingUpdateCount = 0; | 215 uint32_t uniformBindingUpdateCount = 0; |
209 | 216 |
210 VkDescriptorBufferInfo vertBufferInfo; | 217 VkDescriptorBufferInfo vertBufferInfo; |
211 // Vertex Uniform Buffer | 218 // Vertex Uniform Buffer |
212 if (fVertexUniformBuffer.get()) { | 219 if (fVertexUniformBuffer.get()) { |
213 ++uniformBindingUpdateCount; | 220 ++uniformBindingUpdateCount; |
214 memset(&vertBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); | 221 memset(&vertBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); |
215 vertBufferInfo.buffer = fVertexUniformBuffer->buffer(); | 222 vertBufferInfo.buffer = fVertexUniformBuffer->buffer(); |
216 vertBufferInfo.offset = 0; | 223 vertBufferInfo.offset = 0; |
217 vertBufferInfo.range = fVertexUniformBuffer->size(); | 224 vertBufferInfo.range = fVertexUniformBuffer->size(); |
218 | 225 |
219 descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | 226 descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; |
220 descriptorWrites[0].pNext = nullptr; | 227 descriptorWrites[0].pNext = nullptr; |
221 descriptorWrites[0].dstSet = fDescriptorSets[1]; | 228 descriptorWrites[0].dstSet = fDescriptorSets[GrVkUniformHandler::kUnifor
mBufferDescSet]; |
222 descriptorWrites[0].dstBinding = GrVkUniformHandler::kVertexBinding; | 229 descriptorWrites[0].dstBinding = GrVkUniformHandler::kVertexBinding; |
223 descriptorWrites[0].dstArrayElement = 0; | 230 descriptorWrites[0].dstArrayElement = 0; |
224 descriptorWrites[0].descriptorCount = 1; | 231 descriptorWrites[0].descriptorCount = 1; |
225 descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | 232 descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
226 descriptorWrites[0].pImageInfo = nullptr; | 233 descriptorWrites[0].pImageInfo = nullptr; |
227 descriptorWrites[0].pBufferInfo = &vertBufferInfo; | 234 descriptorWrites[0].pBufferInfo = &vertBufferInfo; |
228 descriptorWrites[0].pTexelBufferView = nullptr; | 235 descriptorWrites[0].pTexelBufferView = nullptr; |
229 | 236 |
230 fVertexUniformBuffer->addMemoryBarrier(gpu, | 237 fVertexUniformBuffer->addMemoryBarrier(gpu, |
231 VK_ACCESS_HOST_WRITE_BIT, | 238 VK_ACCESS_HOST_WRITE_BIT, |
(...skipping 10 matching lines...) Expand all Loading... |
242 firstUniformWrite = 1; | 249 firstUniformWrite = 1; |
243 } | 250 } |
244 ++uniformBindingUpdateCount; | 251 ++uniformBindingUpdateCount; |
245 memset(&fragBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); | 252 memset(&fragBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); |
246 fragBufferInfo.buffer = fFragmentUniformBuffer->buffer(); | 253 fragBufferInfo.buffer = fFragmentUniformBuffer->buffer(); |
247 fragBufferInfo.offset = 0; | 254 fragBufferInfo.offset = 0; |
248 fragBufferInfo.range = fFragmentUniformBuffer->size(); | 255 fragBufferInfo.range = fFragmentUniformBuffer->size(); |
249 | 256 |
250 descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | 257 descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; |
251 descriptorWrites[1].pNext = nullptr; | 258 descriptorWrites[1].pNext = nullptr; |
252 descriptorWrites[1].dstSet = fDescriptorSets[1]; | 259 descriptorWrites[1].dstSet = fDescriptorSets[GrVkUniformHandler::kUnifor
mBufferDescSet]; |
253 descriptorWrites[1].dstBinding = GrVkUniformHandler::kFragBinding;; | 260 descriptorWrites[1].dstBinding = GrVkUniformHandler::kFragBinding;; |
254 descriptorWrites[1].dstArrayElement = 0; | 261 descriptorWrites[1].dstArrayElement = 0; |
255 descriptorWrites[1].descriptorCount = 1; | 262 descriptorWrites[1].descriptorCount = 1; |
256 descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | 263 descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
257 descriptorWrites[1].pImageInfo = nullptr; | 264 descriptorWrites[1].pImageInfo = nullptr; |
258 descriptorWrites[1].pBufferInfo = &fragBufferInfo; | 265 descriptorWrites[1].pBufferInfo = &fragBufferInfo; |
259 descriptorWrites[1].pTexelBufferView = nullptr; | 266 descriptorWrites[1].pTexelBufferView = nullptr; |
260 | 267 |
261 fFragmentUniformBuffer->addMemoryBarrier(gpu, | 268 fFragmentUniformBuffer->addMemoryBarrier(gpu, |
262 VK_ACCESS_HOST_WRITE_BIT, | 269 VK_ACCESS_HOST_WRITE_BIT, |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 | 494 |
488 b.add32(get_blend_info_key(pipeline)); | 495 b.add32(get_blend_info_key(pipeline)); |
489 | 496 |
490 b.add32(primitiveType); | 497 b.add32(primitiveType); |
491 | 498 |
492 // Set key length | 499 // Set key length |
493 int keyLength = key->count(); | 500 int keyLength = key->count(); |
494 SkASSERT(0 == (keyLength % 4)); | 501 SkASSERT(0 == (keyLength % 4)); |
495 *reinterpret_cast<uint32_t*>(key->begin()) = SkToU32(keyLength); | 502 *reinterpret_cast<uint32_t*>(key->begin()) = SkToU32(keyLength); |
496 } | 503 } |
OLD | NEW |