BsVulkanDescriptorLayout.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "BsVulkanDescriptorLayout.h"
  2. #include "BsVulkanDevice.h"
  3. namespace bs { namespace ct
  4. {
  5. VulkanDescriptorLayout::VulkanDescriptorLayout(VulkanDevice& device, VkDescriptorSetLayoutBinding* bindings,
  6. UINT32 numBindings)
  7. :mDevice(device)
  8. {
  9. mHash = calculateHash(bindings, numBindings);
  10. VkDescriptorSetLayoutCreateInfo layoutCI;
  11. layoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
  12. layoutCI.pNext = nullptr;
  13. layoutCI.flags = 0;
  14. layoutCI.bindingCount = numBindings;
  15. layoutCI.pBindings = bindings;
  16. VkResult result = vkCreateDescriptorSetLayout(device.getLogical(), &layoutCI, gVulkanAllocator, &mLayout);
  17. assert(result == VK_SUCCESS);
  18. }
  19. VulkanDescriptorLayout::~VulkanDescriptorLayout()
  20. {
  21. vkDestroyDescriptorSetLayout(mDevice.getLogical(), mLayout, gVulkanAllocator);
  22. }
  23. size_t VulkanDescriptorLayout::calculateHash(VkDescriptorSetLayoutBinding* bindings, UINT32 numBindings)
  24. {
  25. size_t hash = 0;
  26. for (UINT32 i = 0; i < numBindings; i++)
  27. {
  28. size_t bindingHash = 0;
  29. hash_combine(bindingHash, bindings[i].binding);
  30. hash_combine(bindingHash, bindings[i].descriptorCount);
  31. hash_combine(bindingHash, bindings[i].descriptorType);
  32. hash_combine(bindingHash, bindings[i].stageFlags);
  33. assert(bindings[i].pImmutableSamplers == nullptr); // Not accounted for in hash, assumed always null
  34. hash_combine(hash, bindingHash);
  35. }
  36. return hash;
  37. }
  38. }}