0

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 to 96
  • The _vertices array size is indeed also equal to 96, 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 two glm::vec3 structs:

    typedef struct MKTAGA2 {
        glm::vec3 position;
        glm::vec3 color;
    } MKTAGA;

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
MAKiT
  • 5
  • 1
  • What is `_vertexBufferMemory` set to? Please show a [mre] – Alan Birtles Aug 17 '22 at 21:27
  • Thank you for the comment, because that was the issue. I was using the ```_vertexBufferMemory``` when working on ```stagingBufferMemory```. After replacing it with the ```C void* data; VK_CHECK(vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data)); memcpy(data, _vertices, sizeOfBuffer); vkUnmapMemory(_device, stagingBufferMemory); ``` everything was fine. – MAKiT Aug 17 '22 at 21:34
  • are you sure `_device` and `_vertexBufferMemory` are initialized properly? In my experience 0xC0000005 errors result from trying to do things with null/invalid pointers – yano Aug 17 '22 at 21:34

1 Answers1

0

I was mapping the _vertexBufferMemory when I should've been mapping the stagingBufferMemory here is the fixed code:

    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;
        vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data);
        memcpy(data, _vertices, sizeOfBuffer);
        vkUnmapMemory(_device, stagingBufferMemory);

        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;
    }
MAKiT
  • 5
  • 1