| 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 |