private void FlushNewResourceSets( VkResourceSet[] resourceSets, bool[] resourceSetsChanged, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout) { int setCount = resourceSets.Length; VkDescriptorSet *descriptorSets = stackalloc VkDescriptorSet[setCount]; uint currentBatchCount = 0; uint currentBatchFirstSet = 0; for (uint currentSlot = 0; currentSlot < resourceSets.Length; currentSlot++) { bool batchEnded = !resourceSetsChanged[currentSlot] || currentSlot == resourceSets.Length - 1; if (resourceSetsChanged[currentSlot]) { resourceSetsChanged[currentSlot] = false; descriptorSets[currentBatchCount] = resourceSets[currentSlot].DescriptorSet; currentBatchCount += 1; } if (batchEnded) { if (currentBatchCount != 0) { // Flush current batch. vkCmdBindDescriptorSets( _cb, bindPoint, pipelineLayout, currentBatchFirstSet, currentBatchCount, descriptorSets, 0, null); } currentBatchCount = 0; currentBatchFirstSet = currentSlot + 1; } } }
public static void vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint firstSet, uint descriptorSetCount, VkDescriptorSet *descriptorSets) { vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, descriptorSets, 0, null); }
private void FlushNewResourceSets( int newResourceSetsCount, VkResourceSet[] resourceSets, bool[] resourceSetsChanged, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout) { if (newResourceSetsCount > 0) { int totalChanged = 0; uint currentSlot = 0; uint currentBatchIndex = 0; uint currentBatchFirstSet = 0; VkDescriptorSet *descriptorSets = stackalloc VkDescriptorSet[newResourceSetsCount]; while (totalChanged < newResourceSetsCount) { if (resourceSetsChanged[currentSlot]) { resourceSetsChanged[currentSlot] = false; descriptorSets[currentBatchIndex] = resourceSets[currentSlot].DescriptorSet; totalChanged += 1; currentBatchIndex += 1; currentSlot += 1; } else { if (currentBatchIndex != 0) { // Flush current batch. vkCmdBindDescriptorSets( _cb, bindPoint, pipelineLayout, currentBatchFirstSet, currentBatchIndex, descriptorSets, 0, null); currentBatchIndex = 0; } currentSlot += 1; currentBatchFirstSet = currentSlot; } } if (currentBatchIndex != 0) { // Flush current batch. vkCmdBindDescriptorSets( _cb, bindPoint, pipelineLayout, currentBatchFirstSet, currentBatchIndex, descriptorSets, 0, null); } } }
public static void AllocateDescriptorSets(ref VkDescriptorSetAllocateInfo pAllocateInfo, VkDescriptorSet *pDescriptorSets) { VulkanUtil.CheckResult(vkAllocateDescriptorSets(device, Utilities.AsPtr(ref pAllocateInfo), pDescriptorSets)); }