Merge branch 'v2'
diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index 4687943..e90ca15 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -29,6 +29,7 @@
#pragma warning(push, 4)
#pragma warning(disable: 4127) // warning C4127: conditional expression is constant
+#pragma warning(disable: 4100) // warning C4100: '...': unreferenced formal parameter
#define VMA_IMPLEMENTATION
#include "vk_mem_alloc.h"
#pragma warning(pop)
@@ -93,6 +94,7 @@
static VkSampler g_hSampler;
static VkFormat g_DepthFormat;
static VkImage g_hDepthImage;
+static VmaAllocation g_hDepthImageAlloc;
static VkImageView g_hDepthImageView;
static VkSurfaceCapabilitiesKHR g_SurfaceCapabilities;
@@ -114,11 +116,14 @@
static VkPipeline g_hPipeline;
static VkBuffer g_hVertexBuffer;
+static VmaAllocation g_hVertexBufferAlloc;
static VkBuffer g_hIndexBuffer;
+static VmaAllocation g_hIndexBufferAlloc;
static uint32_t g_VertexCount;
static uint32_t g_IndexCount;
static VkImage g_hTextureImage;
+static VmaAllocation g_hTextureImageAlloc;
static VkImageView g_hTextureImageView;
static void BeginSingleTimeCommands()
@@ -290,22 +295,24 @@
vbInfo.size = vertexBufferSize;
vbInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
vbInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
VmaMemoryRequirements vbMemReq = {};
vbMemReq.usage = VMA_MEMORY_USAGE_CPU_ONLY;
- VkMappedMemoryRange stagingVertexBufferMem;
- VkBuffer stagingVertexBuffer = VK_NULL_HANDLE;
- ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &vbInfo, &vbMemReq, &stagingVertexBuffer, &stagingVertexBufferMem, nullptr) );
+ vbMemReq.flags = VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT;
- void* pVbData = nullptr;
- ERR_GUARD_VULKAN( vmaMapMemory(g_hAllocator, &stagingVertexBufferMem, &pVbData) );
- memcpy(pVbData, vertices, vertexBufferSize);
- vmaUnmapMemory(g_hAllocator, &stagingVertexBufferMem);
+ VkBuffer stagingVertexBuffer = VK_NULL_HANDLE;
+ VmaAllocation stagingVertexBufferAlloc = VK_NULL_HANDLE;
+ VmaAllocationInfo stagingVertexBufferAllocInfo = {};
+ ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &vbInfo, &vbMemReq, &stagingVertexBuffer, &stagingVertexBufferAlloc, &stagingVertexBufferAllocInfo) );
+
+ memcpy(stagingVertexBufferAllocInfo.pMappedData, vertices, vertexBufferSize);
// No need to flush stagingVertexBuffer memory because CPU_ONLY memory is always HOST_COHERENT.
vbInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
vbMemReq.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &vbInfo, &vbMemReq, &g_hVertexBuffer, nullptr, nullptr) );
+ vbMemReq.flags = 0;
+ ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &vbInfo, &vbMemReq, &g_hVertexBuffer, &g_hVertexBufferAlloc, nullptr) );
// Create index buffer
@@ -313,22 +320,24 @@
ibInfo.size = indexBufferSize;
ibInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
ibInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
VmaMemoryRequirements ibMemReq = {};
ibMemReq.usage = VMA_MEMORY_USAGE_CPU_ONLY;
- VkMappedMemoryRange stagingIndexBufferMem;
+ ibMemReq.flags = VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT;
+
VkBuffer stagingIndexBuffer = VK_NULL_HANDLE;
- ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &ibInfo, &ibMemReq, &stagingIndexBuffer, &stagingIndexBufferMem, nullptr) );
+ VmaAllocation stagingIndexBufferAlloc = VK_NULL_HANDLE;
+ VmaAllocationInfo stagingIndexBufferAllocInfo = {};
+ ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &ibInfo, &ibMemReq, &stagingIndexBuffer, &stagingIndexBufferAlloc, &stagingIndexBufferAllocInfo) );
- void* pIbData = nullptr;
- ERR_GUARD_VULKAN( vmaMapMemory(g_hAllocator, &stagingIndexBufferMem, &pIbData) );
- memcpy(pIbData, indices, indexBufferSize);
- vmaUnmapMemory(g_hAllocator, &stagingIndexBufferMem);
+ memcpy(stagingIndexBufferAllocInfo.pMappedData, indices, indexBufferSize);
// No need to flush stagingIndexBuffer memory because CPU_ONLY memory is always HOST_COHERENT.
ibInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
ibMemReq.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &ibInfo, &ibMemReq, &g_hIndexBuffer, nullptr, nullptr) );
+ ibMemReq.flags = 0;
+ ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &ibInfo, &ibMemReq, &g_hIndexBuffer, &g_hIndexBufferAlloc, nullptr) );
// Copy buffers
@@ -348,8 +357,8 @@
EndSingleTimeCommands();
- vmaDestroyBuffer(g_hAllocator, stagingIndexBuffer);
- vmaDestroyBuffer(g_hAllocator, stagingVertexBuffer);
+ vmaDestroyBuffer(g_hAllocator, stagingIndexBuffer, stagingIndexBufferAlloc);
+ vmaDestroyBuffer(g_hAllocator, stagingVertexBuffer, stagingVertexBufferAlloc);
}
static void CopyImage(VkImage srcImage, VkImage dstImage, uint32_t width, uint32_t height, uint32_t mipLevel)
@@ -475,14 +484,15 @@
stagingImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
stagingImageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
stagingImageInfo.flags = 0;
+
VmaMemoryRequirements stagingImageMemReq = {};
stagingImageMemReq.usage = VMA_MEMORY_USAGE_CPU_ONLY;
+ stagingImageMemReq.flags = VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT;
+
VkImage stagingImage = VK_NULL_HANDLE;
- VkMappedMemoryRange stagingImageMem;
- ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &stagingImageInfo, &stagingImageMemReq, &stagingImage, &stagingImageMem, nullptr) );
-
- char* pImageData = nullptr;
- ERR_GUARD_VULKAN( vmaMapMemory(g_hAllocator, &stagingImageMem, (void**)&pImageData) );
+ VmaAllocation stagingImageAlloc = VK_NULL_HANDLE;
+ VmaAllocationInfo stagingImageAllocInfo = {};
+ ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &stagingImageInfo, &stagingImageMemReq, &stagingImage, &stagingImageAlloc, &stagingImageAllocInfo) );
VkImageSubresource imageSubresource = {};
imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -492,7 +502,7 @@
VkSubresourceLayout imageLayout = {};
vkGetImageSubresourceLayout(g_hDevice, stagingImage, &imageSubresource, &imageLayout);
- char* const pMipLevelData = pImageData + imageLayout.offset;
+ char* const pMipLevelData = (char*)stagingImageAllocInfo.pMappedData + imageLayout.offset;
uint8_t* pRowData = (uint8_t*)pMipLevelData;
for(uint32_t y = 0; y < sizeY; ++y)
{
@@ -509,8 +519,6 @@
pRowData += imageLayout.rowPitch;
}
- vmaUnmapMemory(g_hAllocator, &stagingImageMem);
-
// No need to flush stagingImage memory because CPU_ONLY memory is always HOST_COHERENT.
VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
@@ -529,7 +537,7 @@
imageInfo.flags = 0;
VmaMemoryRequirements imageMemReq = {};
imageMemReq.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &imageInfo, &imageMemReq, &g_hTextureImage, nullptr, nullptr) );
+ ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &imageInfo, &imageMemReq, &g_hTextureImage, &g_hTextureImageAlloc, nullptr) );
TransitionImageLayout(
stagingImage,
@@ -551,7 +559,7 @@
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
- vmaDestroyImage(g_hAllocator, stagingImage);
+ vmaDestroyImage(g_hAllocator, stagingImage, stagingImageAlloc);
// Create ImageView
@@ -765,7 +773,7 @@
VmaMemoryRequirements depthImageMemReq = {};
depthImageMemReq.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &depthImageInfo, &depthImageMemReq, &g_hDepthImage, nullptr, nullptr) );
+ ERR_GUARD_VULKAN( vmaCreateImage(g_hAllocator, &depthImageInfo, &depthImageMemReq, &g_hDepthImage, &g_hDepthImageAlloc, nullptr) );
VkImageViewCreateInfo depthImageViewInfo = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
depthImageViewInfo.image = g_hDepthImage;
@@ -1093,7 +1101,7 @@
}
if(g_hDepthImage != VK_NULL_HANDLE)
{
- vmaDestroyImage(g_hAllocator, g_hDepthImage);
+ vmaDestroyImage(g_hAllocator, g_hDepthImage, g_hDepthImageAlloc);
g_hDepthImage = VK_NULL_HANDLE;
}
@@ -1400,18 +1408,18 @@
}
if(g_hTextureImage != VK_NULL_HANDLE)
{
- vmaDestroyImage(g_hAllocator, g_hTextureImage);
+ vmaDestroyImage(g_hAllocator, g_hTextureImage, g_hTextureImageAlloc);
g_hTextureImage = VK_NULL_HANDLE;
}
if(g_hIndexBuffer != VK_NULL_HANDLE)
{
- vmaDestroyBuffer(g_hAllocator, g_hIndexBuffer);
+ vmaDestroyBuffer(g_hAllocator, g_hIndexBuffer, g_hIndexBufferAlloc);
g_hIndexBuffer = VK_NULL_HANDLE;
}
if(g_hVertexBuffer != VK_NULL_HANDLE)
{
- vmaDestroyBuffer(g_hAllocator, g_hVertexBuffer);
+ vmaDestroyBuffer(g_hAllocator, g_hVertexBuffer, g_hVertexBufferAlloc);
g_hVertexBuffer = VK_NULL_HANDLE;
}