FCT
载入中...
搜索中...
未找到
VK_ConstBuffer.cpp
浏览该文件的文档.
1#include "../FCTAPI.h"
2
3namespace FCT
4{
5 namespace RHI
6 {
8 {
9 m_ctx = ctx;
10 m_buffer = nullptr;
11 m_frameNeedsUpdate.clear();
12 }
13
15 {
16 for (auto& buffer : m_buffers)
17 {
18 m_ctx->device().destroyBuffer(buffer);
19 }
20 for (auto& memory : m_memories)
21 {
22 m_ctx->device().freeMemory(memory);
23 }
24 }
25
27 {
28 if (!m_buffer) {
29 return;
30 }
31/*
32 if (!m_buffer->isDirty()) {
33 return;
34 }
35*/
36 const void* data = m_buffer->getData();
37 size_t size = m_buffer->getSize();
38
39 if (!data || size == 0) {
40 return;
41 }
42
43 uint32_t maxFrames = m_ctx->maxFrameInFlight();
44 size_t copySize = std::min(size, static_cast<size_t>(m_bufferInfos[0].range));
45 UpdateFrequency frequency = m_layout.getUpdateFrequency();
46
47 switch (frequency) {
50 {
51 uint32_t frameIndex = m_ctx->currentSubmitFrameIndex();
52 if (frameIndex < m_mappedData.size() && m_mappedData[frameIndex]) {
53 memcpy(m_mappedData[frameIndex], data, copySize);
54 }
55 break;
56 }
57
60 {
61 // 对于静态或每对象数据,更新当前帧并标记其他帧需要更新
62 uint32_t currentFrame = m_ctx->currentSubmitFrameIndex();
63
64 // 更新当前帧
65 if (currentFrame < m_mappedData.size() && m_mappedData[currentFrame]) {
66 memcpy(m_mappedData[currentFrame], data, copySize);
67 }
68
69 // 标记其他帧需要更新
70 if (m_frameNeedsUpdate.size() < maxFrames) {
71 m_frameNeedsUpdate.resize(maxFrames, false);
72 }
73
74 for (uint32_t i = 0; i < maxFrames; i++) {
75 if (i != currentFrame) {
76 m_frameNeedsUpdate[i] = true;
77 }
78 }
79
80 break;
81 }
82 }
83
84 m_buffer->clearDirty();
85 }
86
88 {
89 if (!m_buffer) {
90 return;
91 }
92
93 uint32_t currentFrame = m_ctx->currentSubmitFrameIndex();
94
95 if (currentFrame < m_frameNeedsUpdate.size() && m_frameNeedsUpdate[currentFrame]) {
96 if (currentFrame < m_mappedData.size() && m_mappedData[currentFrame]) {
97 const void* data = m_buffer->getData();
98 size_t size = m_buffer->getSize();
99
100 if (data && size > 0) {
101 size_t copySize = std::min(size, static_cast<size_t>(m_bufferInfos[currentFrame].range));
102 memcpy(m_mappedData[currentFrame], data, copySize);
103 }
104 }
105
106 m_frameNeedsUpdate[currentFrame] = false;
107 }
108 }
109
110 const vk::DescriptorBufferInfo& VK_ConstBuffer::currentBufferInfo()
111 {
113 return m_bufferInfos[m_ctx->currentSubmitFrameIndex()];
114 }
115
116 const vk::DescriptorBufferInfo& VK_ConstBuffer::currentBufferInfoWithoutUpdata() const
117 {
118 return m_bufferInfos[m_ctx->currentSubmitFrameIndex()];
119 }
120
122 {
123 vk::Device device = m_ctx->getDevice();
124 uint32_t maxFramesInFlight = m_ctx->maxFrameInFlight();
125
126 vk::DeviceSize bufferSize = m_layout.getTotalSize();
127 if (bufferSize == 0) {
128 bufferSize = 256;
129 }
130
131 m_buffers.resize(maxFramesInFlight);
132 m_memories.resize(maxFramesInFlight);
133 m_mappedData.resize(maxFramesInFlight, nullptr);
134 m_frameNeedsUpdate.resize(maxFramesInFlight, false);
135
136 for (uint32_t i = 0; i < maxFramesInFlight; i++) {
137 try {
138 vk::BufferCreateInfo bufferInfo;
139 bufferInfo.size = bufferSize;
140 bufferInfo.usage = vk::BufferUsageFlagBits::eUniformBuffer;
141 bufferInfo.sharingMode = vk::SharingMode::eExclusive;
142
143 m_buffers[i] = device.createBuffer(bufferInfo);
144
145 vk::MemoryRequirements memRequirements = device.getBufferMemoryRequirements(m_buffers[i]);
146
147 vk::MemoryAllocateInfo allocInfo;
148 allocInfo.allocationSize = memRequirements.size;
149 allocInfo.memoryTypeIndex = m_ctx->findMemoryType(
150 memRequirements.memoryTypeBits,
151 vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent
152 );
153
154 m_memories[i] = device.allocateMemory(allocInfo);
155
156 device.bindBufferMemory(m_buffers[i], m_memories[i], 0);
157
158 m_mappedData[i] = device.mapMemory(m_memories[i], 0, bufferSize);
159
160 memset(m_mappedData[i], 0, static_cast<size_t>(bufferSize));
161 }
162 catch (const vk::SystemError& e) {
163 throw std::runtime_error("Failed to create uniform buffer: " + std::string(e.what()));
164 }
165 }
166
167 m_bufferInfos.resize(maxFramesInFlight);
168 for (uint32_t i = 0; i < maxFramesInFlight; i++) {
169 m_bufferInfos[i].buffer = m_buffers[i];
170 m_bufferInfos[i].offset = 0;
171 m_bufferInfos[i].range = bufferSize;
172 }
173 }
174 }
175}
void buffer(UniformBuffer *buffer)
std::vector< vk::DeviceMemory > m_memories
std::vector< vk::Buffer > m_buffers
std::vector< void * > m_mappedData
const vk::DescriptorBufferInfo & currentBufferInfo()
std::vector< vk::DescriptorBufferInfo > m_bufferInfos
const vk::DescriptorBufferInfo & currentBufferInfoWithoutUpdata() const
std::vector< bool > m_frameNeedsUpdate
UpdateFrequency