-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGpuBufferFactory.h
More file actions
124 lines (94 loc) · 2.92 KB
/
GpuBufferFactory.h
File metadata and controls
124 lines (94 loc) · 2.92 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#pragma once
#include"GpuBufferBuilder.h"
enum class BufferUsage
{
VERTEX = 0,
UIVERTEX,
COLIDERVERTEX,
INDEX,
UNIFORM,
LOCALSTORAGE,
HOSTSTORAGE
};
enum class BufferTransferType
{
SRC = 0,
DST,
SRCDST,
NONE
};
struct GpuBuffer;
class GpuBufferFactory:public std::enable_shared_from_this<GpuBufferFactory>
{
private:
//コマンドバッファ作成用
std::shared_ptr<VulkanCore> vulkanCore;
//ビルダー
std::shared_ptr<GpuBufferBuilder> builder;
//物理デバイス
VkPhysicalDevice physicalDevice;
//論理デバイス
VkDevice device;
//現在の破棄予定のリストのインデックス
//描画処理が行われるごとに値が更新される
uint32_t frameIndex;
//破棄予定のバッファが詰め込まれる
std::array<std::list<std::pair<VkBuffer, VkDeviceMemory>>, 2> destructList;
//引数として受けたenum classからVkBufferUsageFlagBitsに変換する
VkBufferUsageFlagBits convertUsageFlagBits(BufferUsage usage, BufferTransferType transferType);
//引数として受けたenum classからVkMemoryPropertyFlagBitsに変換する
VkMemoryPropertyFlagBits convertMemoryPropertyFlagBits(BufferUsage usage);
//ステージングバッファのメモリのマップとアンマップ
void memoryMap(GpuBuffer& bufffer, size_t bufferSize);
void memoryUnMap(GpuBuffer& buffer);
public:
GpuBufferFactory(std::shared_ptr<VulkanCore> vulkanCore, std::shared_ptr<GpuBufferBuilder> b);
~GpuBufferFactory()
{
for (int i = 0; i < 2; i++)
{
resourceDestruct();
}
#ifdef _DEBUG
std::cout << "GpuBufferFactory :: デストラクタ" << std::endl;
#endif
}
//バッファの設定を直接指定して、バッファを作成する
std::shared_ptr<GpuBuffer> Create(VkDeviceSize bufferSize, const void* srcPtr
, VkBufferUsageFlags usage, VkMemoryPropertyFlags property);
//あらかじめ設定されたバッファの設定でバッファを作成する
std::shared_ptr<GpuBuffer> Create(VkDeviceSize bufferSize, const void* srcPtr
, BufferUsage usage,BufferTransferType transferType);
std::shared_ptr<GpuBuffer> Create(VkDeviceSize bufferSize, BufferUsage usage
, BufferTransferType transferType);
//ステージングバッファのメモリのマップとアンマップ
void memoryMap(std::shared_ptr<GpuBuffer> bufffer, size_t bufferSize);
void memoryUnMap(std::shared_ptr<GpuBuffer> buffer);
//メモリのデータをコピー
void copyMemory(const VkDeviceSize size, const void* src, std::shared_ptr<GpuBuffer> dst);
void copyMemory(const VkDeviceSize size, const void* src, GpuBuffer& dst);
//バッファの内容をコピー
void copyBuffer(const VkDeviceSize size, const GpuBuffer& src, std::shared_ptr<GpuBuffer> dst);
//遅延破棄リストにバッファを追加する
void addDefferedDestruct(VkBuffer buffer, VkDeviceMemory memory);
//バッファを破棄する
void resourceDestruct();
};
struct GpuBuffer
{
VkBuffer buffer;
VkDeviceMemory memory;
void* mappedPtr;
std::shared_ptr<GpuBufferFactory> factory;
GpuBuffer(std::shared_ptr<GpuBufferFactory> f)
{
factory = f;
buffer = nullptr;
memory = nullptr;
mappedPtr = nullptr;
}
~GpuBuffer()
{
factory->addDefferedDestruct(buffer, memory);
}
};