| 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" |
| 17 #include "GrVkUniformHandler.h" |
| 16 #include "GrVkUtil.h" | 18 #include "GrVkUtil.h" |
| 17 | 19 |
| 18 #ifdef SK_TRACE_VK_RESOURCES | 20 #ifdef SK_TRACE_VK_RESOURCES |
| 19 GrVkResource::Trace GrVkResource::fTrace; | 21 GrVkResource::Trace GrVkResource::fTrace; |
| 20 uint32_t GrVkResource::fKeyCounter = 0; | 22 uint32_t GrVkResource::fKeyCounter = 0; |
| 21 #endif | 23 #endif |
| 22 | 24 |
| 23 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) | 25 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
| 24 : fGpu(gpu) | 26 : fGpu(gpu) |
| 25 , fPipelineCache(VK_NULL_HANDLE) | 27 , fPipelineCache(VK_NULL_HANDLE) { |
| 26 , fCurrentUniformDescCount(0) { | |
| 27 fPipelineStateCache = new PipelineStateCache(gpu); | 28 fPipelineStateCache = new PipelineStateCache(gpu); |
| 28 } | 29 } |
| 29 | 30 |
| 30 GrVkResourceProvider::~GrVkResourceProvider() { | 31 GrVkResourceProvider::~GrVkResourceProvider() { |
| 31 SkASSERT(0 == fRenderPassArray.count()); | 32 SkASSERT(0 == fRenderPassArray.count()); |
| 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); | 33 SkASSERT(VK_NULL_HANDLE == fPipelineCache); |
| 33 delete fPipelineStateCache; | 34 delete fPipelineStateCache; |
| 34 } | 35 } |
| 35 | 36 |
| 36 void GrVkResourceProvider::initUniformDescObjects() { | 37 void GrVkResourceProvider::initUniformDescObjects() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 50 dsUniBindings[1].pImmutableSamplers = nullptr; | 51 dsUniBindings[1].pImmutableSamplers = nullptr; |
| 51 | 52 |
| 52 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo; | 53 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo; |
| 53 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo
)); | 54 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo
)); |
| 54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR
EATE_INFO; | 55 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR
EATE_INFO; |
| 55 dsUniformLayoutCreateInfo.pNext = nullptr; | 56 dsUniformLayoutCreateInfo.pNext = nullptr; |
| 56 dsUniformLayoutCreateInfo.flags = 0; | 57 dsUniformLayoutCreateInfo.flags = 0; |
| 57 dsUniformLayoutCreateInfo.bindingCount = 2; | 58 dsUniformLayoutCreateInfo.bindingCount = 2; |
| 58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; | 59 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; |
| 59 | 60 |
| 61 VkDescriptorSetLayout uniformDescLayout; |
| 60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev
ice(), | 62 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev
ice(), |
| 61 &dsUnifor
mLayoutCreateInfo, | 63 &dsUnifor
mLayoutCreateInfo, |
| 62 nullptr, | 64 nullptr, |
| 63 &fUniform
DescLayout)); | 65 &uniformD
escLayout)); |
| 64 | 66 |
| 65 this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle); | 67 fDescriptorSetManagers.emplace_back(fGpu, uniformDescLayout, |
| 68 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2); |
| 69 SkASSERT(1 == fDescriptorSetManagers.count()); |
| 70 fUniformDSHandle = GrVkDescriptorSetManager::Handle(0); |
| 66 } | 71 } |
| 67 | 72 |
| 68 void GrVkResourceProvider::init() { | 73 void GrVkResourceProvider::init() { |
| 69 VkPipelineCacheCreateInfo createInfo; | 74 VkPipelineCacheCreateInfo createInfo; |
| 70 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); | 75 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); |
| 71 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; | 76 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; |
| 72 createInfo.pNext = nullptr; | 77 createInfo.pNext = nullptr; |
| 73 createInfo.flags = 0; | 78 createInfo.flags = 0; |
| 74 createInfo.initialDataSize = 0; | 79 createInfo.initialDataSize = 0; |
| 75 createInfo.pInitialData = nullptr; | 80 createInfo.pInitialData = nullptr; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 } | 188 } |
| 184 | 189 |
| 185 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( | 190 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( |
| 186 const GrPipelin
e& pipeline, | 191 const GrPipelin
e& pipeline, |
| 187 const GrPrimiti
veProcessor& proc, | 192 const GrPrimiti
veProcessor& proc, |
| 188 GrPrimitiveType
primitiveType, | 193 GrPrimitiveType
primitiveType, |
| 189 const GrVkRende
rPass& renderPass) { | 194 const GrVkRende
rPass& renderPass) { |
| 190 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); | 195 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); |
| 191 } | 196 } |
| 192 | 197 |
| 198 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { |
| 199 VkShaderStageFlags flags = 0; |
| 193 | 200 |
| 194 void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSe
tLayout layout, | 201 if (visibility & kVertex_GrShaderFlag) { |
| 195 GrVkDescriptorSetManager::Handle* ha
ndle) { | 202 flags |= VK_SHADER_STAGE_VERTEX_BIT; |
| 203 } |
| 204 if (visibility & kGeometry_GrShaderFlag) { |
| 205 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; |
| 206 } |
| 207 if (visibility & kFragment_GrShaderFlag) { |
| 208 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; |
| 209 } |
| 210 return flags; |
| 211 } |
| 212 |
| 213 void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandle
r& uniformHandler, |
| 214 GrVkDescriptorSetManage
r::Handle* handle) { |
| 196 SkASSERT(handle); | 215 SkASSERT(handle); |
| 197 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { | 216 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
| 198 if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { | 217 if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_I
MAGE_SAMPLER, |
| 218 &uniformHandler)) { |
| 199 *handle = GrVkDescriptorSetManager::Handle(i); | 219 *handle = GrVkDescriptorSetManager::Handle(i); |
| 200 return; | 220 return; |
| 201 } | 221 } |
| 202 } | 222 } |
| 203 | 223 |
| 204 // Failed to find a DescSetManager, we must create a new one; | 224 // Failed to find a DescSetManager, we must create a new one; |
| 205 VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMP
LER | 225 uint32_t numSamplers = (uint32_t)uniformHandler.numSamplers(); |
| 206 : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; | |
| 207 | 226 |
| 208 fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); | 227 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( |
| 228 new VkDescriptorSetLayoutBi
nding[numSamplers]); |
| 229 for (uint32_t i = 0; i < numSamplers; ++i) { |
| 230 const GrVkGLSLSampler& sampler = |
| 231 static_cast<const GrVkGLSLSampler&>(uniformHandler.getSampler(i)); |
| 232 SkASSERT(sampler.binding() == i); |
| 233 dsSamplerBindings[i].binding = sampler.binding(); |
| 234 dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_
SAMPLER; |
| 235 dsSamplerBindings[i].descriptorCount = 1; |
| 236 dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(sampler.v
isibility()); |
| 237 dsSamplerBindings[i].pImmutableSamplers = nullptr; |
| 238 } |
| 239 |
| 240 VkDescriptorSetLayoutCreateInfo dsSamplerLayoutCreateInfo; |
| 241 memset(&dsSamplerLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo
)); |
| 242 dsSamplerLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR
EATE_INFO; |
| 243 dsSamplerLayoutCreateInfo.pNext = nullptr; |
| 244 dsSamplerLayoutCreateInfo.flags = 0; |
| 245 dsSamplerLayoutCreateInfo.bindingCount = numSamplers; |
| 246 // Setting to nullptr fixes an error in the param checker validation layer.
Even though |
| 247 // bindingCount is 0 (which is valid), it still tries to validate pBindings
unless it is null. |
| 248 dsSamplerLayoutCreateInfo.pBindings = numSamplers ? dsSamplerBindings.get()
: nullptr; |
| 249 |
| 250 VkDescriptorSetLayout dsLayout; |
| 251 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), |
| 252 CreateDescriptorSetLayout(fGpu->device(), |
| 253 &dsSamplerLayoutCreateInfo, |
| 254 nullptr, |
| 255 &dsLayout)); |
| 256 fDescriptorSetManagers.emplace_back(fGpu, dsLayout, VK_DESCRIPTOR_TYPE_COMBI
NED_IMAGE_SAMPLER, |
| 257 numSamplers, &uniformHandler); |
| 209 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() -
1); | 258 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() -
1); |
| 210 } | 259 } |
| 211 | 260 |
| 261 VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const { |
| 262 SkASSERT(fUniformDSHandle.isValid()); |
| 263 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout(); |
| 264 } |
| 265 |
| 266 VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout( |
| 267 const GrVkDescriptorSetManager::Handle& handle) const { |
| 268 SkASSERT(handle.isValid()); |
| 269 return fDescriptorSetManagers[handle.toIndex()].layout(); |
| 270 } |
| 271 |
| 212 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { | 272 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { |
| 213 SkASSERT(fUniformDSHandle.isValid()); | 273 SkASSERT(fUniformDSHandle.isValid()); |
| 214 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f
Gpu, | 274 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f
Gpu, |
| 215 f
UniformDSHandle); | 275 f
UniformDSHandle); |
| 216 } | 276 } |
| 217 | 277 |
| 278 const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet( |
| 279 const GrVkDescriptorSetManager::Handle& handle) { |
| 280 SkASSERT(handle.isValid()); |
| 281 return fDescriptorSetManagers[handle.toIndex()].getDescriptorSet(fGpu, handl
e); |
| 282 } |
| 218 | 283 |
| 219 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet
, | 284 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet
, |
| 220 const GrVkDescriptorSetManager::
Handle& handle) { | 285 const GrVkDescriptorSetManager::
Handle& handle) { |
| 221 SkASSERT(descSet); | 286 SkASSERT(descSet); |
| 222 SkASSERT(handle.isValid()); | 287 SkASSERT(handle.isValid()); |
| 223 int managerIdx = handle.toIndex(); | 288 int managerIdx = handle.toIndex(); |
| 224 SkASSERT(managerIdx < fDescriptorSetManagers.count()); | 289 SkASSERT(managerIdx < fDescriptorSetManagers.count()); |
| 225 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); | 290 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); |
| 226 } | 291 } |
| 227 | 292 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 for (; !iter.done(); ++iter) { | 384 for (; !iter.done(); ++iter) { |
| 320 (*iter).unref(fGpu); | 385 (*iter).unref(fGpu); |
| 321 } | 386 } |
| 322 fSamplers.reset(); | 387 fSamplers.reset(); |
| 323 | 388 |
| 324 fPipelineStateCache->release(); | 389 fPipelineStateCache->release(); |
| 325 | 390 |
| 326 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); | 391 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); |
| 327 fPipelineCache = VK_NULL_HANDLE; | 392 fPipelineCache = VK_NULL_HANDLE; |
| 328 | 393 |
| 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 | 394 // We must release/destroy all command buffers and pipeline states before re
leasing the |
| 337 // GrVkDescriptorSetManagers | 395 // GrVkDescriptorSetManagers |
| 338 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { | 396 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
| 339 fDescriptorSetManagers[i].release(fGpu); | 397 fDescriptorSetManagers[i].release(fGpu); |
| 340 } | 398 } |
| 341 fDescriptorSetManagers.reset(); | 399 fDescriptorSetManagers.reset(); |
| 342 | 400 |
| 343 // release our uniform buffers | 401 // release our uniform buffers |
| 344 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { | 402 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { |
| 345 SkASSERT(fAvailableUniformBufferResources[i]->unique()); | 403 SkASSERT(fAvailableUniformBufferResources[i]->unique()); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 } | 507 } |
| 450 | 508 |
| 451 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { | 509 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { |
| 452 for (int i = 0; i < fRenderPasses.count(); ++i) { | 510 for (int i = 0; i < fRenderPasses.count(); ++i) { |
| 453 if (fRenderPasses[i]) { | 511 if (fRenderPasses[i]) { |
| 454 fRenderPasses[i]->unrefAndAbandon(); | 512 fRenderPasses[i]->unrefAndAbandon(); |
| 455 fRenderPasses[i] = nullptr; | 513 fRenderPasses[i] = nullptr; |
| 456 } | 514 } |
| 457 } | 515 } |
| 458 } | 516 } |
| OLD | NEW |