@@ -27,9 +27,9 @@ const std::vector<const char *> deviceExtensions = {
27
27
};
28
28
29
29
const std::vector<Vertex> vertices = {
30
- {{0 .0f , -0 .5f }, {1 .0f , 1 .0f , 1 .0f }},
31
- {{0 .5f , 0 .5f }, {0 .0f , 1 .0f , 0 .0f }},
32
- {{-0 .5f , 0 .5f }, {0 .0f , 0 .0f , 1 .0f }}
30
+ {{0 .0f , -0 .5f }, {1 .0f , 1 .0f , 1 .0f }},
31
+ {{0 .5f , 0 .5f }, {0 .0f , 1 .0f , 0 .0f }},
32
+ {{-0 .5f , 0 .5f }, {0 .0f , 0 .0f , 1 .0f }}
33
33
};
34
34
35
35
#ifdef NDEBUG
@@ -666,37 +666,97 @@ void HelloTriangleApplication::createFramebuffers() {
666
666
}
667
667
}
668
668
669
- void HelloTriangleApplication::createVertexBuffer () {
669
+ void HelloTriangleApplication::createBuffer (VkDeviceSize size, VkBufferUsageFlags usage,
670
+ VkMemoryPropertyFlags properties, VkBuffer &buffer,
671
+ VkDeviceMemory &bufferMemory) {
670
672
VkBufferCreateInfo bufferInfo = {
671
673
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
672
- .size = sizeof (vertices[ 0 ]) * vertices. size () ,
673
- .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT ,
674
+ .size = size,
675
+ .usage = usage ,
674
676
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
675
677
};
676
-
677
- if (vkCreateBuffer (device, &bufferInfo, nullptr , &vertexBuffer) != VK_SUCCESS) {
678
- throw std::runtime_error (" failed to create vertex buffer!" );
678
+ if (vkCreateBuffer (device, &bufferInfo, nullptr , &buffer) != VK_SUCCESS) {
679
+ throw std::runtime_error (" failed to create buffer!" );
679
680
}
680
681
681
682
VkMemoryRequirements memRequirements;
682
- vkGetBufferMemoryRequirements (device, vertexBuffer , &memRequirements);
683
+ vkGetBufferMemoryRequirements (device, buffer , &memRequirements);
683
684
684
685
VkMemoryAllocateInfo allocInfo = {
685
686
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
686
687
.allocationSize = memRequirements.size ,
687
- .memoryTypeIndex = findMemoryType (memRequirements.memoryTypeBits ,
688
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
689
- | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT),
688
+ .memoryTypeIndex = findMemoryType (memRequirements.memoryTypeBits , properties),
690
689
};
691
- if (vkAllocateMemory (device, &allocInfo, nullptr , &vertexBufferMemory) != VK_SUCCESS) {
692
- throw std::runtime_error (" failed to allocate vertex buffer memory!" );
690
+
691
+ if (vkAllocateMemory (device, &allocInfo, nullptr , &bufferMemory) != VK_SUCCESS) {
692
+ throw std::runtime_error (" failed to allocate buffer memory!" );
693
693
}
694
- vkBindBufferMemory (device, vertexBuffer, vertexBufferMemory, 0 );
695
694
696
- void * data;
697
- vkMapMemory (device, vertexBufferMemory, 0 , bufferInfo.size , 0 , &data);
698
- memcpy (data, vertices.data (), (size_t ) bufferInfo.size );
699
- vkUnmapMemory (device, vertexBufferMemory);
695
+ vkBindBufferMemory (device, buffer, bufferMemory, 0 );
696
+ }
697
+
698
+ void HelloTriangleApplication::createVertexBuffer () {
699
+ VkDeviceSize bufferSize = sizeof (vertices[0 ]) * vertices.size ();
700
+
701
+ VkBuffer stagingBuffer;
702
+ VkDeviceMemory stagingBufferMemory;
703
+ createBuffer (bufferSize,
704
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
705
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
706
+ stagingBuffer,
707
+ stagingBufferMemory);
708
+
709
+ void *data;
710
+ vkMapMemory (device, stagingBufferMemory, 0 , bufferSize, 0 , &data);
711
+ memcpy (data, vertices.data (), (size_t ) bufferSize);
712
+ vkUnmapMemory (device, stagingBufferMemory);
713
+
714
+ createBuffer (bufferSize,
715
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
716
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
717
+ vertexBuffer,
718
+ vertexBufferMemory);
719
+
720
+ copyBuffer (stagingBuffer, vertexBuffer, bufferSize);
721
+
722
+ vkDestroyBuffer (device, stagingBuffer, nullptr );
723
+ vkFreeMemory (device, stagingBufferMemory, nullptr );
724
+ }
725
+
726
+ void HelloTriangleApplication::copyBuffer (
727
+ VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) {
728
+ VkCommandBufferAllocateInfo allocInfo = {
729
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
730
+ .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
731
+ .commandPool = commandPool,
732
+ .commandBufferCount = 1 ,
733
+ };
734
+
735
+ VkCommandBuffer commandBuffer;
736
+ vkAllocateCommandBuffers (device, &allocInfo, &commandBuffer);
737
+
738
+ VkCommandBufferBeginInfo beginInfo = {
739
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
740
+ .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
741
+ };
742
+ vkBeginCommandBuffer (commandBuffer, &beginInfo);
743
+
744
+ VkBufferCopy copyRegion = {
745
+ .size = size
746
+ };
747
+ vkCmdCopyBuffer (commandBuffer, srcBuffer, dstBuffer, 1 , ©Region);
748
+
749
+ vkEndCommandBuffer (commandBuffer);
750
+
751
+ VkSubmitInfo submitInfo = {
752
+ .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
753
+ .commandBufferCount = 1 ,
754
+ .pCommandBuffers = &commandBuffer,
755
+ };
756
+ vkQueueSubmit (graphicsQueue, 1 , &submitInfo, VK_NULL_HANDLE);
757
+ vkQueueWaitIdle (graphicsQueue);
758
+
759
+ vkFreeCommandBuffers (device, commandPool, 1 , &commandBuffer);
700
760
}
701
761
702
762
uint32_t HelloTriangleApplication::findMemoryType (
0 commit comments