667 {
668
669 long orig = InterlockedCompareExchange(&(geometry->id), INT32_MAX, -1);
670 if (orig != -1) return false;
671
674 VkDeviceSize size = 0;
675 {
676
677 VkMemoryRequirements memReqs;
678 VkMemoryAllocateInfo memAlloc = {};
679 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
680
681 VkBufferCreateInfo BufferInfo = {};
682 BufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
683 BufferInfo.size = geometry->array.memorySize;
684 BufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
685
686 size = geometry->array.memorySize;
687
688 VK_CHECK_RESULT(vkCreateBuffer($device, &BufferInfo,
nullptr, &input.
buffer));
689 vkGetBufferMemoryRequirements($device, input.
buffer, &memReqs);
690 memAlloc.allocationSize = memReqs.size;
691 memAlloc.memoryTypeIndex = vka::shelve::getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
692 VK_CHECK_RESULT(vkAllocateMemory($device, &memAlloc,
nullptr, &input.
memory));
693 VK_CHECK_RESULT(vkBindBufferMemory($device, input.
buffer, input.
memory, 0));
694
695
696 BufferInfo.size = geometry->Size.index;
697
698 size += geometry->Size.index;
699 BufferInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
700 VK_CHECK_RESULT(vkCreateBuffer($device, &BufferInfo,
nullptr, &index.
buffer));
701 vkGetBufferMemoryRequirements($device, index.
buffer, &memReqs);
702 memAlloc.allocationSize = memReqs.size;
703 memAlloc.memoryTypeIndex = vka::shelve::getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
704 VK_CHECK_RESULT(vkAllocateMemory($device, &memAlloc,
nullptr, &index.
memory));
705 VK_CHECK_RESULT(vkBindBufferMemory($device, index.
buffer, index.
memory, 0));
706
707 }
708
709 cmder.allocStaging(size);
710
711 cmder.Map(geometry->map(1), 0, geometry->array.memorySize);
712 cmder.Map(geometry->map(0), geometry->array.memorySize, geometry->Size.index);
713
714
715 cmder.begin();
716 cmder.Copy(input, geometry->array.memorySize, 0, 0);
717 cmder.Copy(index, geometry->Size.index, geometry->array.memorySize, 0);
718 cmder.end();
719 cmder.submit();
720
721
723 index.
count = geometry->updateRange.count;
724
725 cmder.wait();
726
728 geometry->ID.vert = geometry->id;
729 geometry->info.vert = {
731 .offset = 0,
732 .range = geometry->array.memorySize
733 };
734
735
737 geometry->ID.index = geometry->id;
738 geometry->info.index = {
740 .offset = 0,
741 .range = geometry->Size.index
742 };
743
744 int c = (int)
inth.size();
745 inth[
"vertex" + std::to_string(c)] = geometry->ID.vert;
746 c = (int)
inth.size();
747 inth[
"index" + std::to_string(c)] = geometry->ID.index;
748
749 return true;
750
751 };
void $createVertexInfo$(Geom *geometry, int type=0)