完成顶点缓冲区
							parent
							
								
									b19c7666b2
								
							
						
					
					
						commit
						b9f19473ef
					
				| 
						 | 
					@ -713,40 +713,99 @@ void HelloTriangleApplication::createCommandPool()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void HelloTriangleApplication::createVertexBuffer()
 | 
					void HelloTriangleApplication::createVertexBuffer()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						VkDeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
 | 
				
			||||||
 | 
						VkBuffer stagingBuffer;
 | 
				
			||||||
 | 
						VkDeviceMemory stagingBufferMemory;
 | 
				
			||||||
 | 
						createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer ,stagingBufferMemory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void* data;
 | 
				
			||||||
 | 
						vkMapMemory(device, stagingBufferMemory, 0, bufferSize, 0, &data);
 | 
				
			||||||
 | 
						memcpy(data, vertices.data(), (size_t)bufferSize);
 | 
				
			||||||
 | 
						vkUnmapMemory(device, stagingBufferMemory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// host visible buffer as temp buffer
 | 
				
			||||||
 | 
						createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT , VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// move the vertex data to the device local buffer
 | 
				
			||||||
 | 
						copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vkDestroyBuffer(device, stagingBuffer, nullptr);
 | 
				
			||||||
 | 
						vkFreeMemory(device, stagingBufferMemory, nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HelloTriangleApplication::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	VkBufferCreateInfo bufferInfo{};
 | 
						VkBufferCreateInfo bufferInfo{};
 | 
				
			||||||
	bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
 | 
						bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
 | 
				
			||||||
	bufferInfo.size = sizeof(vertices[0]) * vertices.size();
 | 
						bufferInfo.size = size;
 | 
				
			||||||
	bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
 | 
						bufferInfo.usage = usage;
 | 
				
			||||||
	bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
 | 
						bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (vkCreateBuffer(device,&bufferInfo,nullptr,&vertexBuffer) != VK_SUCCESS)
 | 
						if (vkCreateBuffer(device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		throw std::runtime_error("failed to create vertex buffer in createVertexBuffer");
 | 
							throw std::runtime_error("failed to create vertex buffer in createVertexBuffer");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	VkMemoryRequirements memRequirement;
 | 
						VkMemoryRequirements memRequirements;
 | 
				
			||||||
	vkGetBufferMemoryRequirements(device, vertexBuffer, &memRequirement);
 | 
						vkGetBufferMemoryRequirements(device, buffer, &memRequirements);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	VkMemoryAllocateInfo allocInfo{};
 | 
						VkMemoryAllocateInfo allocInfo{};
 | 
				
			||||||
	allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
 | 
						allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
 | 
				
			||||||
	allocInfo.allocationSize = memRequirement.size;
 | 
						allocInfo.allocationSize = memRequirements.size;
 | 
				
			||||||
	allocInfo.memoryTypeIndex = findMemoryType(memRequirement.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
 | 
						allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (vkAllocateMemory(device,&allocInfo,nullptr,&vertexBufferMemory) != VK_SUCCESS)
 | 
						if (vkAllocateMemory(device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		throw std::runtime_error("failed to allocate vertex buffer memory!");
 | 
							throw std::runtime_error("failed to allocate vertex buffer memory!");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vkBindBufferMemory(device, vertexBuffer, vertexBufferMemory, 0);
 | 
						vkBindBufferMemory(device, buffer, bufferMemory, 0);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	void* data;
 | 
					 | 
				
			||||||
	vkMapMemory(device, vertexBufferMemory, 0, bufferInfo.size, 0, &data);
 | 
					 | 
				
			||||||
	memcpy(data, vertices.data(), (size_t)bufferInfo.size);
 | 
					 | 
				
			||||||
	vkUnmapMemory(device, vertexBufferMemory);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HelloTriangleApplication::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						VkCommandBufferAllocateInfo allocInfo{};
 | 
				
			||||||
 | 
						allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
 | 
				
			||||||
 | 
						allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
 | 
				
			||||||
 | 
						allocInfo.commandPool = commandPool;
 | 
				
			||||||
 | 
						allocInfo.commandBufferCount = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VkCommandBuffer commandBuffer;
 | 
				
			||||||
 | 
						vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VkCommandBufferBeginInfo beginInfo{};
 | 
				
			||||||
 | 
						beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
 | 
				
			||||||
 | 
						beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vkBeginCommandBuffer(commandBuffer, &beginInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VkBufferCopy copyRegin{};
 | 
				
			||||||
 | 
						copyRegin.srcOffset = 0;
 | 
				
			||||||
 | 
						copyRegin.dstOffset = 0;
 | 
				
			||||||
 | 
						copyRegin.size = size;
 | 
				
			||||||
 | 
						vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, ©Regin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vkEndCommandBuffer(commandBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VkSubmitInfo submitInfo{};
 | 
				
			||||||
 | 
						submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
 | 
				
			||||||
 | 
						submitInfo.commandBufferCount = 1;
 | 
				
			||||||
 | 
						submitInfo.pCommandBuffers = &commandBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vkQueueSubmit(graphicQueue, 1, &submitInfo, VK_NULL_HANDLE);
 | 
				
			||||||
 | 
						vkQueueWaitIdle(graphicQueue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t HelloTriangleApplication::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
 | 
					uint32_t HelloTriangleApplication::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	VkPhysicalDeviceMemoryProperties memProperties;
 | 
						VkPhysicalDeviceMemoryProperties memProperties;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -179,6 +179,9 @@ private:
 | 
				
			||||||
	void createCommandPool();
 | 
						void createCommandPool();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void createVertexBuffer();
 | 
						void createVertexBuffer();
 | 
				
			||||||
 | 
						void createBuffer(VkDeviceSize size,VkBufferUsageFlags usage,VkMemoryPropertyFlags properties,VkBuffer& buffer,VkDeviceMemory& bufferMemory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
 | 
						uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue