I've been working on a Vulkan based graphical engine, and whilst trying to create a buffer,
I have encountered an issue with the vkMapMemory()
function. In the code shown below,
the program returns an "Access is denied" (-1073741819 or C0000005) error. Error happends inside the vkMapMemory()
call, and I can't check its returned VkResult
.
void createVertexBuffer(size_t sizeOfBuffer, void * _vertices , VkBuffer * _vertexBuffer, VkDeviceMemory * _vertexBufferMemory)
{
VkDeviceSize bufferSize = sizeOfBuffer;
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;
if(vkMapMemory(_device, *_vertexBufferMemory, 0, bufferSize, 0, &data) != VK_SUCCESS)
printf("This is not printed");
memcpy(data, _vertices, sizeOfBuffer);
vkUnmapMemory(_device, *_vertexBufferMemory);
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, _vertexBuffer, _vertexBufferMemory);
copyBuffer(stagingBuffer, *_vertexBuffer, bufferSize);
vkDestroyBuffer(_device, stagingBuffer, NULL);
vkFreeMemory(_device, stagingBufferMemory, NULL);
return;
}
For some additional information:
sizeOfBuffer
in this case is equal to96
- The
_vertices
array size is indeed also equal to96
, given that it looks like this:
_vertices[0][0] -1.000000 0.000000
_vertices[0][1] -1.000000 0.000000
_vertices[0][2] 0.000000 0.000000
_vertices[1][0] 1.000000 0.000000
_vertices[1][1] -1.000000 0.000000
_vertices[1][2] 0.000000 0.000000
_vertices[2][0] 1.000000 0.000000
_vertices[2][1] 1.000000 0.000000
_vertices[2][2] 0.000000 0.000000
_vertices[3][0] -1.000000 0.000000
_vertices[3][1] 1.000000 0.000000
_vertices[3][2] 0.000000 0.000000
- The size of three lines is equal to 24 because
(sizeof(glm::vec3)=12)
and three lines contain twoglm::vec3
structs:
typedef struct MKTAGA2 {
glm::vec3 position;
glm::vec3 color;
} MKTAGA;