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
|
#pragma once
#include "xe_device.hpp"
namespace xe {
class XeBuffer {
public:
XeBuffer(
XeDevice& device,
VkDeviceSize instanceSize,
uint32_t instanceCount,
VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags,
VkDeviceSize minOffsetAlignment = 1);
~XeBuffer();
XeBuffer(const XeBuffer&) = delete;
XeBuffer& operator=(const XeBuffer&) = delete;
VkResult map(VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0);
void unmap();
void writeToBuffer(void* data, VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0);
VkResult flush(VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0);
VkDescriptorBufferInfo descriptorInfo(VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0);
VkResult invalidate(VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0);
void writeToIndex(void* data, int index);
VkResult flushIndex(int index);
VkDescriptorBufferInfo descriptorInfoForIndex(int index);
VkResult invalidateIndex(int index);
VkBuffer getBuffer() const { return buffer; }
void* getMappedMemory() const { return mapped; }
uint32_t getInstanceCount() const { return instanceCount; }
VkDeviceSize getInstanceSize() const { return instanceSize; }
VkDeviceSize getAlignmentSize() const { return instanceSize; }
VkBufferUsageFlags getUsageFlags() const { return usageFlags; }
VkMemoryPropertyFlags getMemoryPropertyFlags() const { return memoryPropertyFlags; }
VkDeviceSize getBufferSize() const { return bufferSize; }
private:
static VkDeviceSize getAlignment(VkDeviceSize instanceSize, VkDeviceSize minOffsetAlignment);
XeDevice& xeDevice;
void* mapped = nullptr;
VkBuffer buffer = VK_NULL_HANDLE;
VkDeviceMemory memory = VK_NULL_HANDLE;
VkDeviceSize bufferSize;
uint32_t instanceCount;
VkDeviceSize instanceSize;
VkDeviceSize alignmentSize;
VkBufferUsageFlags usageFlags;
VkMemoryPropertyFlags memoryPropertyFlags;
};
}
|