summaryrefslogtreecommitdiffstatsci
path: root/src/vkvg_buff.c
blob: 8f2973d52bd572a264201b805d79db4a29a38634 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "vkvg_buff.h"
#include "vkvg_device_internal.h"

void _set_size_and_map(VkvgDevice pDev, VkBufferUsageFlags usage, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, vkvg_buff *buff){
    VkMemoryRequirements memReq;
    vkGetBufferMemoryRequirements(pDev->vkDev, buff->buffer, &memReq);
    VkMemoryAllocateInfo memAllocInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
                                          .allocationSize = memReq.size };
    assert(memory_type_from_properties(&pDev->phyMemProps, memReq.memoryTypeBits,memoryPropertyFlags, &memAllocInfo.memoryTypeIndex));
    VK_CHECK_RESULT(vkAllocateMemory(pDev->vkDev, &memAllocInfo, NULL, &buff->memory));

    buff->alignment = memReq.alignment;
    buff->size = memAllocInfo.allocationSize;
    buff->usageFlags = usage;
    buff->memoryPropertyFlags = memoryPropertyFlags;

    VK_CHECK_RESULT(vkBindBufferMemory(buff->pDev->vkDev, buff->buffer, buff->memory, 0));
    VK_CHECK_RESULT(vkMapMemory(buff->pDev->vkDev, buff->memory, 0, VK_WHOLE_SIZE, 0, &buff->mapped));
}

void vkvg_buffer_create(VkvgDevice pDev, VkBufferUsageFlags usage, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, vkvg_buff *buff){
    buff->pDev = pDev;
    VkBufferCreateInfo bufCreateInfo = {
        .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
        .usage = usage, .size = size, .sharingMode = VK_SHARING_MODE_EXCLUSIVE};
    VK_CHECK_RESULT(vkCreateBuffer(pDev->vkDev, &bufCreateInfo, NULL, &buff->buffer));

    _set_size_and_map(pDev,usage,memoryPropertyFlags,size,buff);
}

void vkvg_buffer_destroy(vkvg_buff *buff){
    vkUnmapMemory   (buff->pDev->vkDev, buff->memory);
    vkDestroyBuffer (buff->pDev->vkDev, buff->buffer, NULL);
    vkFreeMemory    (buff->pDev->vkDev, buff->memory, NULL);
}


void vkvg_buffer_increase_size(vkvg_buff *buff, uint32_t sizeAdded){
    size_t oldBSize = buff->size;
    void* pSave = (void*)malloc (oldBSize);
    memcpy (pSave, buff->mapped, oldBSize);

    vkvg_buffer_destroy(buff);
    vkvg_buffer_create(buff->pDev, buff->usageFlags, buff->memoryPropertyFlags, oldBSize + sizeAdded, buff);
    memcpy (buff->mapped, pSave, oldBSize);
    free(pSave);
}