diff options
author | egdaniel <egdaniel@google.com> | 2016-08-25 13:52:00 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-25 13:52:00 -0700 |
commit | 4d866dfc46bc381da1761d05ce8b5a3bb0cd7f00 (patch) | |
tree | b9f489b6b12207722c950c2a1f5d9934894f99c6 /src | |
parent | 1c9f55b468e14eb3e6b1bb8cb740818d8f036859 (diff) |
Add support for getting vulkan descriptor sets without a GrVkUniformHandler.
This change allows us to use the current descriptor set system for doing
copies as draws. This is a step towards being able to track resources for draws
that don't go through out normal pipeline.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2275633002
Review-Url: https://codereview.chromium.org/2275633002
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/vk/GrVkDescriptorSetManager.cpp | 81 | ||||
-rw-r--r-- | src/gpu/vk/GrVkDescriptorSetManager.h | 13 | ||||
-rw-r--r-- | src/gpu/vk/GrVkResourceProvider.cpp | 16 | ||||
-rw-r--r-- | src/gpu/vk/GrVkResourceProvider.h | 2 |
4 files changed, 105 insertions, 7 deletions
diff --git a/src/gpu/vk/GrVkDescriptorSetManager.cpp b/src/gpu/vk/GrVkDescriptorSetManager.cpp index 9f44d65dd5..868a5ce96c 100644 --- a/src/gpu/vk/GrVkDescriptorSetManager.cpp +++ b/src/gpu/vk/GrVkDescriptorSetManager.cpp @@ -31,6 +31,26 @@ GrVkDescriptorSetManager::GrVkDescriptorSetManager(GrVkGpu* gpu, } } +GrVkDescriptorSetManager::GrVkDescriptorSetManager(GrVkGpu* gpu, + VkDescriptorType type, + const SkTArray<uint32_t>& visibilities) + : fPoolManager(type, gpu, visibilities) { + if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { + for (int i = 0; i < visibilities.count(); ++i) { + fBindingVisibilities.push_back(visibilities[i]); + } + } else { + SkASSERT(type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER); + SkASSERT(2 == visibilities.count() && + kVertex_GrShaderFlag == visibilities[0] && + kFragment_GrShaderFlag == visibilities[1]); + // We set the visibility of the first binding to the vertex shader and the second to the + // fragment shader. + fBindingVisibilities.push_back(kVertex_GrShaderFlag); + fBindingVisibilities.push_back(kFragment_GrShaderFlag); + } +} + const GrVkDescriptorSet* GrVkDescriptorSetManager::getDescriptorSet(GrVkGpu* gpu, const Handle& handle) { const GrVkDescriptorSet* ds = nullptr; @@ -91,6 +111,25 @@ bool GrVkDescriptorSetManager::isCompatible(VkDescriptorType type, return true; } +bool GrVkDescriptorSetManager::isCompatible(VkDescriptorType type, + const SkTArray<uint32_t>& visibilities) const { + if (type != fPoolManager.fDescType) { + return false; + } + + if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { + if (fBindingVisibilities.count() != visibilities.count()) { + return false; + } + for (int i = 0; i < visibilities.count(); ++i) { + if (visibilities[i] != fBindingVisibilities[i]) { + return false; + } + } + } + return true; +} + //////////////////////////////////////////////////////////////////////////////// VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { @@ -115,20 +154,48 @@ GrVkDescriptorSetManager::DescriptorPoolManager::DescriptorPoolManager( : fDescType(type) , fCurrentDescriptorCount(0) , fPool(nullptr) { + this->init(gpu, type, uniformHandler, nullptr); +} + +GrVkDescriptorSetManager::DescriptorPoolManager::DescriptorPoolManager( + VkDescriptorType type, + GrVkGpu* gpu, + const SkTArray<uint32_t>& visibilities) + : fDescType(type) + , fCurrentDescriptorCount(0) + , fPool(nullptr) { + this->init(gpu, type, nullptr, &visibilities); +} + +void GrVkDescriptorSetManager::DescriptorPoolManager::init(GrVkGpu* gpu, + VkDescriptorType type, + const GrVkUniformHandler* uniformHandler, + const SkTArray<uint32_t>* visibilities) { if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { - SkASSERT(uniformHandler); - uint32_t numSamplers = (uint32_t)uniformHandler->numSamplers(); + SkASSERT(SkToBool(uniformHandler) != SkToBool(visibilities)); + uint32_t numSamplers; + if (uniformHandler) { + numSamplers = (uint32_t)uniformHandler->numSamplers(); + } else { + numSamplers = (uint32_t)visibilities->count(); + } SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( - new VkDescriptorSetLayoutBinding[numSamplers]); + new VkDescriptorSetLayoutBinding[numSamplers]); for (uint32_t i = 0; i < numSamplers; ++i) { - const GrVkGLSLSampler& sampler = + uint32_t visibility; + if (uniformHandler) { + const GrVkGLSLSampler& sampler = static_cast<const GrVkGLSLSampler&>(uniformHandler->getSampler(i)); - SkASSERT(sampler.binding() == i); - dsSamplerBindings[i].binding = sampler.binding(); + SkASSERT(sampler.binding() == i); + visibility = sampler.visibility(); + } else { + visibility = (*visibilities)[i]; + } + dsSamplerBindings[i].binding = i; dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; dsSamplerBindings[i].descriptorCount = 1; - dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(sampler.visibility()); + dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(visibility); dsSamplerBindings[i].pImmutableSamplers = nullptr; } diff --git a/src/gpu/vk/GrVkDescriptorSetManager.h b/src/gpu/vk/GrVkDescriptorSetManager.h index 0b11eb3ba9..84dd29ece0 100644 --- a/src/gpu/vk/GrVkDescriptorSetManager.h +++ b/src/gpu/vk/GrVkDescriptorSetManager.h @@ -29,6 +29,11 @@ public: GrVkDescriptorSetManager(GrVkGpu* gpu, VkDescriptorType, const GrVkUniformHandler* handler = nullptr); + + GrVkDescriptorSetManager(GrVkGpu* gpu, + VkDescriptorType, + const SkTArray<uint32_t>& visibilities); + ~GrVkDescriptorSetManager() {} void abandon(); @@ -41,11 +46,16 @@ public: void recycleDescriptorSet(const GrVkDescriptorSet*); bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const; + bool isCompatible(VkDescriptorType type, + const SkTArray<uint32_t>& visibilities) const; private: struct DescriptorPoolManager { DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu, const GrVkUniformHandler* handler = nullptr); + DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu, + const SkTArray<uint32_t>& visibilities); + ~DescriptorPoolManager() { SkASSERT(!fDescLayout); @@ -71,6 +81,9 @@ private: kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors }; + void init(GrVkGpu* gpu, VkDescriptorType type, const GrVkUniformHandler* uniformHandler, + const SkTArray<uint32_t>* visibilities); + void getNewPool(GrVkGpu* gpu); }; diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp index b1817cf3ea..e581384ddf 100644 --- a/src/gpu/vk/GrVkResourceProvider.cpp +++ b/src/gpu/vk/GrVkResourceProvider.cpp @@ -177,6 +177,22 @@ void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandle *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); } +void GrVkResourceProvider::getSamplerDescriptorSetHandle(const SkTArray<uint32_t>& visibilities, + GrVkDescriptorSetManager::Handle* handle) { + SkASSERT(handle); + for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { + if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + visibilities)) { + *handle = GrVkDescriptorSetManager::Handle(i); + return; + } + } + + fDescriptorSetManagers.emplace_back(fGpu, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + visibilities); + *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); +} + VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const { SkASSERT(fUniformDSHandle.isValid()); return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout(); diff --git a/src/gpu/vk/GrVkResourceProvider.h b/src/gpu/vk/GrVkResourceProvider.h index 9cd8217e42..7f6ce6d613 100644 --- a/src/gpu/vk/GrVkResourceProvider.h +++ b/src/gpu/vk/GrVkResourceProvider.h @@ -104,6 +104,8 @@ public: void getSamplerDescriptorSetHandle(const GrVkUniformHandler&, GrVkDescriptorSetManager::Handle* handle); + void getSamplerDescriptorSetHandle(const SkTArray<uint32_t>& visibilities, + GrVkDescriptorSetManager::Handle* handle); // Returns the compatible VkDescriptorSetLayout to use for uniform buffers. The caller does not // own the VkDescriptorSetLayout and thus should not delete it. This function should be used |