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 "GrVkResourceProvider.h" | 8 #include "GrVkResourceProvider.h" |
9 | 9 |
10 #include "GrTextureParams.h" | 10 #include "GrTextureParams.h" |
11 #include "GrVkCommandBuffer.h" | 11 #include "GrVkCommandBuffer.h" |
| 12 #include "GrVkGLSLSampler.h" |
12 #include "GrVkPipeline.h" | 13 #include "GrVkPipeline.h" |
13 #include "GrVkRenderTarget.h" | 14 #include "GrVkRenderTarget.h" |
14 #include "GrVkSampler.h" | 15 #include "GrVkSampler.h" |
15 #include "GrVkUniformBuffer.h" | 16 #include "GrVkUniformBuffer.h" |
16 #include "GrVkUtil.h" | 17 #include "GrVkUtil.h" |
17 | 18 |
18 #ifdef SK_TRACE_VK_RESOURCES | 19 #ifdef SK_TRACE_VK_RESOURCES |
19 GrVkResource::Trace GrVkResource::fTrace; | 20 GrVkResource::Trace GrVkResource::fTrace; |
20 uint32_t GrVkResource::fKeyCounter = 0; | 21 uint32_t GrVkResource::fKeyCounter = 0; |
21 #endif | 22 #endif |
22 | 23 |
23 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) | 24 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
24 : fGpu(gpu) | 25 : fGpu(gpu) |
25 , fPipelineCache(VK_NULL_HANDLE) | 26 , fPipelineCache(VK_NULL_HANDLE) { |
26 , fCurrentUniformDescCount(0) { | |
27 fPipelineStateCache = new PipelineStateCache(gpu); | 27 fPipelineStateCache = new PipelineStateCache(gpu); |
28 } | 28 } |
29 | 29 |
30 GrVkResourceProvider::~GrVkResourceProvider() { | 30 GrVkResourceProvider::~GrVkResourceProvider() { |
31 SkASSERT(0 == fRenderPassArray.count()); | 31 SkASSERT(0 == fRenderPassArray.count()); |
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); | 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); |
33 delete fPipelineStateCache; | 33 delete fPipelineStateCache; |
34 } | 34 } |
35 | 35 |
36 void GrVkResourceProvider::initUniformDescObjects() { | |
37 // Create Uniform Buffer Descriptor | |
38 // The vertex uniform buffer will have binding 0 and the fragment binding 1. | |
39 VkDescriptorSetLayoutBinding dsUniBindings[2]; | |
40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding)); | |
41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding; | |
42 dsUniBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | |
43 dsUniBindings[0].descriptorCount = 1; | |
44 dsUniBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; | |
45 dsUniBindings[0].pImmutableSamplers = nullptr; | |
46 dsUniBindings[1].binding = GrVkUniformHandler::kFragBinding; | |
47 dsUniBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | |
48 dsUniBindings[1].descriptorCount = 1; | |
49 dsUniBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; | |
50 dsUniBindings[1].pImmutableSamplers = nullptr; | |
51 | |
52 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo; | |
53 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo
)); | |
54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR
EATE_INFO; | |
55 dsUniformLayoutCreateInfo.pNext = nullptr; | |
56 dsUniformLayoutCreateInfo.flags = 0; | |
57 dsUniformLayoutCreateInfo.bindingCount = 2; | |
58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; | |
59 | |
60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev
ice(), | |
61 &dsUnifor
mLayoutCreateInfo, | |
62 nullptr, | |
63 &fUniform
DescLayout)); | |
64 | |
65 this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle); | |
66 } | |
67 | |
68 void GrVkResourceProvider::init() { | 36 void GrVkResourceProvider::init() { |
69 VkPipelineCacheCreateInfo createInfo; | 37 VkPipelineCacheCreateInfo createInfo; |
70 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); | 38 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); |
71 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; | 39 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; |
72 createInfo.pNext = nullptr; | 40 createInfo.pNext = nullptr; |
73 createInfo.flags = 0; | 41 createInfo.flags = 0; |
74 createInfo.initialDataSize = 0; | 42 createInfo.initialDataSize = 0; |
75 createInfo.pInitialData = nullptr; | 43 createInfo.pInitialData = nullptr; |
76 VkResult result = GR_VK_CALL(fGpu->vkInterface(), | 44 VkResult result = GR_VK_CALL(fGpu->vkInterface(), |
77 CreatePipelineCache(fGpu->device(), &createInfo
, nullptr, | 45 CreatePipelineCache(fGpu->device(), &createInfo
, nullptr, |
78 &fPipelineCache)); | 46 &fPipelineCache)); |
79 SkASSERT(VK_SUCCESS == result); | 47 SkASSERT(VK_SUCCESS == result); |
80 if (VK_SUCCESS != result) { | 48 if (VK_SUCCESS != result) { |
81 fPipelineCache = VK_NULL_HANDLE; | 49 fPipelineCache = VK_NULL_HANDLE; |
82 } | 50 } |
83 | 51 |
84 this->initUniformDescObjects(); | 52 // Init uniform descriptor objects |
| 53 fDescriptorSetManagers.emplace_back(fGpu, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)
; |
| 54 SkASSERT(1 == fDescriptorSetManagers.count()); |
| 55 fUniformDSHandle = GrVkDescriptorSetManager::Handle(0); |
85 } | 56 } |
86 | 57 |
87 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, | 58 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, |
88 const GrPrimitiveProcessor& p
rimProc, | 59 const GrPrimitiveProcessor& p
rimProc, |
89 VkPipelineShaderStageCreateIn
fo* shaderStageInfo, | 60 VkPipelineShaderStageCreateIn
fo* shaderStageInfo, |
90 int shaderStageCount, | 61 int shaderStageCount, |
91 GrPrimitiveType primitiveType
, | 62 GrPrimitiveType primitiveType
, |
92 const GrVkRenderPass& renderP
ass, | 63 const GrVkRenderPass& renderP
ass, |
93 VkPipelineLayout layout) { | 64 VkPipelineLayout layout) { |
94 | 65 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 154 } |
184 | 155 |
185 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( | 156 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( |
186 const GrPipelin
e& pipeline, | 157 const GrPipelin
e& pipeline, |
187 const GrPrimiti
veProcessor& proc, | 158 const GrPrimiti
veProcessor& proc, |
188 GrPrimitiveType
primitiveType, | 159 GrPrimitiveType
primitiveType, |
189 const GrVkRende
rPass& renderPass) { | 160 const GrVkRende
rPass& renderPass) { |
190 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); | 161 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); |
191 } | 162 } |
192 | 163 |
193 | 164 void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandle
r& uniformHandler, |
194 void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSe
tLayout layout, | 165 GrVkDescriptorSetManage
r::Handle* handle) { |
195 GrVkDescriptorSetManager::Handle* ha
ndle) { | |
196 SkASSERT(handle); | 166 SkASSERT(handle); |
197 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { | 167 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
198 if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { | 168 if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_I
MAGE_SAMPLER, |
| 169 &uniformHandler)) { |
199 *handle = GrVkDescriptorSetManager::Handle(i); | 170 *handle = GrVkDescriptorSetManager::Handle(i); |
200 return; | 171 return; |
201 } | 172 } |
202 } | 173 } |
203 | 174 |
204 // Failed to find a DescSetManager, we must create a new one; | 175 fDescriptorSetManagers.emplace_back(fGpu, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_
SAMPLER, |
205 VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMP
LER | 176 &uniformHandler); |
206 : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | 177 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() -
1); |
| 178 } |
207 | 179 |
208 fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); | 180 VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const { |
209 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() -
1); | 181 SkASSERT(fUniformDSHandle.isValid()); |
| 182 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout(); |
| 183 } |
| 184 |
| 185 VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout( |
| 186 const GrVkDescriptorSetManager::Handle& handle) const { |
| 187 SkASSERT(handle.isValid()); |
| 188 return fDescriptorSetManagers[handle.toIndex()].layout(); |
210 } | 189 } |
211 | 190 |
212 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { | 191 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { |
213 SkASSERT(fUniformDSHandle.isValid()); | 192 SkASSERT(fUniformDSHandle.isValid()); |
214 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f
Gpu, | 193 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f
Gpu, |
215 f
UniformDSHandle); | 194 f
UniformDSHandle); |
216 } | 195 } |
217 | 196 |
| 197 const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet( |
| 198 const GrVkDescriptorSetManager::Handle& handle) { |
| 199 SkASSERT(handle.isValid()); |
| 200 return fDescriptorSetManagers[handle.toIndex()].getDescriptorSet(fGpu, handl
e); |
| 201 } |
218 | 202 |
219 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet
, | 203 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet
, |
220 const GrVkDescriptorSetManager::
Handle& handle) { | 204 const GrVkDescriptorSetManager::
Handle& handle) { |
221 SkASSERT(descSet); | 205 SkASSERT(descSet); |
222 SkASSERT(handle.isValid()); | 206 SkASSERT(handle.isValid()); |
223 int managerIdx = handle.toIndex(); | 207 int managerIdx = handle.toIndex(); |
224 SkASSERT(managerIdx < fDescriptorSetManagers.count()); | 208 SkASSERT(managerIdx < fDescriptorSetManagers.count()); |
225 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); | 209 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); |
226 } | 210 } |
227 | 211 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 for (; !iter.done(); ++iter) { | 303 for (; !iter.done(); ++iter) { |
320 (*iter).unref(fGpu); | 304 (*iter).unref(fGpu); |
321 } | 305 } |
322 fSamplers.reset(); | 306 fSamplers.reset(); |
323 | 307 |
324 fPipelineStateCache->release(); | 308 fPipelineStateCache->release(); |
325 | 309 |
326 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); | 310 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); |
327 fPipelineCache = VK_NULL_HANDLE; | 311 fPipelineCache = VK_NULL_HANDLE; |
328 | 312 |
329 if (fUniformDescLayout) { | |
330 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), | |
331 fUniformDescL
ayout, | |
332 nullptr)); | |
333 fUniformDescLayout = VK_NULL_HANDLE; | |
334 } | |
335 | |
336 // We must release/destroy all command buffers and pipeline states before re
leasing the | 313 // We must release/destroy all command buffers and pipeline states before re
leasing the |
337 // GrVkDescriptorSetManagers | 314 // GrVkDescriptorSetManagers |
338 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { | 315 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
339 fDescriptorSetManagers[i].release(fGpu); | 316 fDescriptorSetManagers[i].release(fGpu); |
340 } | 317 } |
341 fDescriptorSetManagers.reset(); | 318 fDescriptorSetManagers.reset(); |
342 | 319 |
343 // release our uniform buffers | 320 // release our uniform buffers |
344 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { | 321 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { |
345 SkASSERT(fAvailableUniformBufferResources[i]->unique()); | 322 SkASSERT(fAvailableUniformBufferResources[i]->unique()); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 } | 426 } |
450 | 427 |
451 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { | 428 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { |
452 for (int i = 0; i < fRenderPasses.count(); ++i) { | 429 for (int i = 0; i < fRenderPasses.count(); ++i) { |
453 if (fRenderPasses[i]) { | 430 if (fRenderPasses[i]) { |
454 fRenderPasses[i]->unrefAndAbandon(); | 431 fRenderPasses[i]->unrefAndAbandon(); |
455 fRenderPasses[i] = nullptr; | 432 fRenderPasses[i] = nullptr; |
456 } | 433 } |
457 } | 434 } |
458 } | 435 } |
OLD | NEW |