-
Notifications
You must be signed in to change notification settings - Fork 0
/
device_buffer_allocator.h
81 lines (61 loc) · 1.95 KB
/
device_buffer_allocator.h
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once
#include <map>
#include <vector>
#include <algorithm>
#include <numeric>
#include <assert.h>
#include "doge_vulkan.h"
#include "vulkan_helpers.h"
#include "memory.h"
#include "basic_allocators.h"
// IGNORE FOR NOW, WE CERTAINLY *ALWAYS* STAGE INTO GPU ANYWAY
enum HostTranferType {
eViaHostAccess,
eViaStaging,
eDeviceOnly
};
enum EDeviceBufferType {
kVertex,
kIndex,
kUniformStatic,
MAX_COUNT
};
static const VkBufferUsageFlags AsVkFlag_EGeometryBufferType[EDeviceBufferType::MAX_COUNT] = {
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
};
// TODO Log mechanism for logging standard resources usage in real conditions
struct DeviceBufferAllocator {
struct Handle {
u32 id;
VkBuffer buffer;
EDeviceBufferType eGeometryBufferType;
u32 bankIdx;
u64 bankOffset;
u32 queueFamilyIndex;
};
DeviceBufferAllocator();
Handle GetNewBufferHandle(EDeviceBufferType eDeviceBufferType, size_t size, u32 queueFamilyIndex);
void UploadData(Handle handle, VkDeviceSize offset, VkDeviceSize size, const void* data);
private:
void CreateBuffer(VkBufferUsageFlags usage, VkDeviceSize size, u32 queueFamilyIndex, VkBuffer* pOutBuffer);
static constexpr u32 USAGE_COUNT = EDeviceBufferType::MAX_COUNT;
static constexpr u32 USAGE_MEMORY_BANK_SIZE[USAGE_COUNT] = {
32u * 1024u * 1024u, // VERTEX: 32MB
16u * 1024u * 1024u, // INDEX: 16MB
8u * 1024u * 1024u, // UNIFORM STATIC: 8MB
};
// Per spec, all VkBuffer created with the same 'flag' and 'usage' have the same 'alignment' and 'memoryTypeBits'
VkDeviceSize mPerUsageAlignement[USAGE_COUNT];
void* mPerUsageHostBanks[USAGE_COUNT];
void* mPerUsageDeviceBanks[USAGE_COUNT];
struct Bank {
VkDeviceMemory memory;
u64 size;
PagedAlignedFreeList allocator;
};
// I know, put that map down ! Should be done in due time.
std::map<u32, std::vector<Bank>> mFamilyBanks[USAGE_COUNT];
};
extern DeviceBufferAllocator gDeviceBufferAllocator;