Skip to content

Commit 79cba9d

Browse files
committed
use staging buffer
1 parent 7f8e722 commit 79cba9d

File tree

3 files changed

+86
-21
lines changed

3 files changed

+86
-21
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
Step by step tutorial of Vulkan on Android, follow https://vulkan-tutorial.com.
44

5-
+ We need [`vulkan_wrappe`](https://developer.android.com/ndk/guides/graphics/getting-started.html#using) on Android, which could be [download from GitHub](https://github.com/LunarG/VulkanSamples/tree/master/common).
5+
+ We need [`vulkan_wrapper`](https://developer.android.com/ndk/guides/graphics/getting-started.html#using) on Android, which could be [download from GitHub](https://github.com/LunarG/VulkanSamples/tree/master/common).
66
+ In Android Studio, just put shader code under `src/main/shaders` folder, they will be compiled into `.spv` files, and packaged as assets.

app/src/main/cpp/vulkan_triangle.cpp

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ const std::vector<const char *> deviceExtensions = {
2727
};
2828

2929
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}}
3333
};
3434

3535
#ifdef NDEBUG
@@ -666,37 +666,97 @@ void HelloTriangleApplication::createFramebuffers() {
666666
}
667667
}
668668

669-
void HelloTriangleApplication::createVertexBuffer() {
669+
void HelloTriangleApplication::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage,
670+
VkMemoryPropertyFlags properties, VkBuffer &buffer,
671+
VkDeviceMemory &bufferMemory) {
670672
VkBufferCreateInfo bufferInfo = {
671673
.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,
674676
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
675677
};
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!");
679680
}
680681

681682
VkMemoryRequirements memRequirements;
682-
vkGetBufferMemoryRequirements(device, vertexBuffer, &memRequirements);
683+
vkGetBufferMemoryRequirements(device, buffer, &memRequirements);
683684

684685
VkMemoryAllocateInfo allocInfo = {
685686
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
686687
.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),
690689
};
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!");
693693
}
694-
vkBindBufferMemory(device, vertexBuffer, vertexBufferMemory, 0);
695694

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, &copyRegion);
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);
700760
}
701761

702762
uint32_t HelloTriangleApplication::findMemoryType(

app/src/main/cpp/vulkan_triangle.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,15 @@ class HelloTriangleApplication {
125125

126126
void createFramebuffers();
127127

128+
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
129+
VkBuffer &buffer, VkDeviceMemory &bufferMemory);
130+
128131
void createCommandPool();
129132

130133
void createVertexBuffer();
131134

135+
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
136+
132137
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
133138

134139
void createCommandBuffers();

0 commit comments

Comments
 (0)