vertexIndexBuffer: use allocateFromMemoryRequirements / non-coherent memory

This commit is contained in:
Zack Buhman 2026-04-07 15:08:06 -05:00
parent be45d0960e
commit 9b0ba08ccb

View File

@ -81,6 +81,8 @@ VkDeviceMemory depthImageMemory{ VK_NULL_HANDLE };
VkBuffer vertexIndexBuffer{ VK_NULL_HANDLE }; VkBuffer vertexIndexBuffer{ VK_NULL_HANDLE };
VkDeviceMemory vertexIndexBufferMemory{ VK_NULL_HANDLE }; VkDeviceMemory vertexIndexBufferMemory{ VK_NULL_HANDLE };
VkDeviceSize vertexBufferSize{ 0 };
VkDeviceSize indexBufferSize{ 0 };
VkFence fences[maxFramesInFlight]; VkFence fences[maxFramesInFlight];
VkSemaphore presentSemaphores[maxFramesInFlight]; VkSemaphore presentSemaphores[maxFramesInFlight];
@ -337,7 +339,7 @@ VkDeviceSize allocateFromMemoryRequirements(VkPhysicalDeviceMemoryProperties2 co
memoryRequirements.memoryTypeBits, memoryRequirements.memoryTypeBits,
memoryPropertyFlags); memoryPropertyFlags);
VkDeviceSize stride = roundAlignment(memoryRequirements.size, memoryRequirements.alignment); VkDeviceSize stride = (count == 1) ? memoryRequirements.size : roundAlignment(memoryRequirements.size, memoryRequirements.alignment);
VkMemoryAllocateFlagsInfo memoryAllocateFlagsInfo{ VkMemoryAllocateFlagsInfo memoryAllocateFlagsInfo{
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
@ -541,40 +543,52 @@ int main()
// mesh // mesh
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
uint32_t vertexSize; {
void const * vertexStart = file::open("position_normal_texture.vtx", &vertexSize); uint32_t vertexSize;
uint32_t indexSize; void const * vertexStart = file::open("position_normal_texture.vtx", &vertexSize);
void const * indexStart = file::open("index.idx", &indexSize); uint32_t indexSize;
void const * indexStart = file::open("index.idx", &indexSize);
vertexBufferSize = vertexSize;
indexBufferSize = indexSize;
VkDeviceSize vtxBufferSize{ vertexSize }; VkDeviceSize bufferSize{ vertexSize + indexSize };
VkDeviceSize idxBufferSize{ indexSize }; VkBufferCreateInfo vertexIndexBufferCreateInfo{
VkBufferCreateInfo vertexIndexBufferCreateInfo{ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .size = bufferSize,
.size = vtxBufferSize + idxBufferSize, .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, .sharingMode = VK_SHARING_MODE_EXCLUSIVE
.sharingMode = VK_SHARING_MODE_EXCLUSIVE };
}; VK_CHECK(vkCreateBuffer(device, &vertexIndexBufferCreateInfo, nullptr, &vertexIndexBuffer));
VK_CHECK(vkCreateBuffer(device, &vertexIndexBufferCreateInfo, nullptr, &vertexIndexBuffer));
VkMemoryRequirements vertexIndexBufferMemoryRequirements; VkMemoryRequirements memoryRequirements;
vkGetBufferMemoryRequirements(device, vertexIndexBuffer, &vertexIndexBufferMemoryRequirements); vkGetBufferMemoryRequirements(device, vertexIndexBuffer, &memoryRequirements);
VkMemoryPropertyFlags vertexIndexBufferMemoryPropertyFlags{ VkMemoryPropertyFlags memoryPropertyFlags{ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT };
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT VkMemoryAllocateFlags memoryAllocateFlags{};
};
uint32_t vertexIndexBufferMemoryTypeIndex = findMemoryTypeIndex(physicalDeviceMemoryProperties.memoryProperties, vertexIndexBufferMemoryRequirements.memoryTypeBits, vertexIndexBufferMemoryPropertyFlags);
VkMemoryAllocateInfo vertexIndexBufferAllocateInfo{
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.allocationSize = vertexIndexBufferMemoryRequirements.size,
.memoryTypeIndex = vertexIndexBufferMemoryTypeIndex,
};
VK_CHECK(vkAllocateMemory(device, &vertexIndexBufferAllocateInfo, nullptr, &vertexIndexBufferMemory));
VK_CHECK(vkBindBufferMemory(device, vertexIndexBuffer, vertexIndexBufferMemory, 0));
void * vertexIndexMappedData; allocateFromMemoryRequirements(physicalDeviceMemoryProperties,
VK_CHECK(vkMapMemory(device, vertexIndexBufferMemory, 0, vertexIndexBufferCreateInfo.size, 0, &vertexIndexMappedData)); memoryRequirements,
memcpy((void *)(((ptrdiff_t)vertexIndexMappedData) + 0), vertexStart, vertexSize); memoryPropertyFlags,
memcpy((void *)(((ptrdiff_t)vertexIndexMappedData) + vertexSize), indexStart, indexSize); memoryAllocateFlags,
vkUnmapMemory(device, vertexIndexBufferMemory); 1,
&vertexIndexBufferMemory);
VK_CHECK(vkBindBufferMemory(device, vertexIndexBuffer, vertexIndexBufferMemory, 0));
void * vertexIndexMappedData;
VK_CHECK(vkMapMemory(device, vertexIndexBufferMemory, 0, vertexIndexBufferCreateInfo.size, 0, &vertexIndexMappedData));
memcpy((void *)(((ptrdiff_t)vertexIndexMappedData) + 0), vertexStart, vertexSize);
memcpy((void *)(((ptrdiff_t)vertexIndexMappedData) + vertexSize), indexStart, indexSize);
VkMappedMemoryRange mappedMemoryRange{
.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
.memory = vertexIndexBufferMemory,
.offset = 0,
.size = VK_WHOLE_SIZE,
};
vkFlushMappedMemoryRanges(device, 1, &mappedMemoryRange);
vkUnmapMemory(device, vertexIndexBufferMemory);
}
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// shader buffers // shader buffers
@ -1185,7 +1199,7 @@ int main()
VkDeviceSize vertexOffset{ 0 }; VkDeviceSize vertexOffset{ 0 };
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &textureDescriptorSet, 0, nullptr); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &textureDescriptorSet, 0, nullptr);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &vertexIndexBuffer, &vertexOffset); vkCmdBindVertexBuffers(commandBuffer, 0, 1, &vertexIndexBuffer, &vertexOffset);
VkDeviceSize indexOffset{ vtxBufferSize }; VkDeviceSize indexOffset{ vertexBufferSize };
vkCmdBindIndexBuffer(commandBuffer, vertexIndexBuffer, indexOffset, VK_INDEX_TYPE_UINT32); vkCmdBindIndexBuffer(commandBuffer, vertexIndexBuffer, indexOffset, VK_INDEX_TYPE_UINT32);
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, (sizeof (VkDeviceAddress)), &shaderDataDevice.frame[frameIndex].deviceAddress); vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, (sizeof (VkDeviceAddress)), &shaderDataDevice.frame[frameIndex].deviceAddress);
VkDeviceSize indexCount{ 9216 }; VkDeviceSize indexCount{ 9216 };