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 if (!m_buffer) {
17 return;
18 }
19/*
20 if (!m_buffer->isDirty()) {
21 return;
22 }
23*/
24 const void* data = m_buffer->getData();
25 size_t size = m_buffer->getSize();
26
27 if (!data || size == 0) {
28 return;
29 }
30
31 uint32_t maxFrames = m_ctx->maxFrameInFlight();
32 size_t copySize = std::min(size, static_cast<size_t>(m_bufferInfos[0].range));
33 UpdateFrequency frequency = m_layout.getUpdateFrequency();
34
35 switch (frequency) {
38 {
39 uint32_t frameIndex = m_ctx->currentSubmitFrameIndex();
40 if (frameIndex < m_mappedData.size() && m_mappedData[frameIndex]) {
41 memcpy(m_mappedData[frameIndex], data, copySize);
42 }
43 break;
44 }
45
48 {
49 // 对于静态或每对象数据,更新当前帧并标记其他帧需要更新
50 uint32_t currentFrame = m_ctx->currentSubmitFrameIndex();
51
52 // 更新当前帧
53 if (currentFrame < m_mappedData.size() && m_mappedData[currentFrame]) {
54 memcpy(m_mappedData[currentFrame], data, copySize);
55 }
56
57 // 标记其他帧需要更新
58 if (m_frameNeedsUpdate.size() < maxFrames) {
59 m_frameNeedsUpdate.resize(maxFrames, false);
60 }
61
62 for (uint32_t i = 0; i < maxFrames; i++) {
63 if (i != currentFrame) {
64 m_frameNeedsUpdate[i] = true;
65 }
66 }
67
68 break;
69 }
70 }
71
72 m_buffer->clearDirty();
73 }
74
76 {
77 if (!m_buffer) {
78 return;
79 }
80
81 uint32_t currentFrame = m_ctx->currentSubmitFrameIndex();
82
83 if (currentFrame < m_frameNeedsUpdate.size() && m_frameNeedsUpdate[currentFrame]) {
84 if (currentFrame < m_mappedData.size() && m_mappedData[currentFrame]) {
85 const void* data = m_buffer->getData();
86 size_t size = m_buffer->getSize();
87
88 if (data && size > 0) {
89 size_t copySize = std::min(size, static_cast<size_t>(m_bufferInfos[currentFrame].range));
90 memcpy(m_mappedData[currentFrame], data, copySize);
91 }
92 }
93
94 m_frameNeedsUpdate[currentFrame] = false;
95 }
96 }
97
98 const vk::DescriptorBufferInfo& VK_ConstBuffer::currentBufferInfo()
99 {
101 return m_bufferInfos[m_ctx->currentSubmitFrameIndex()];
102 }
103
104 const vk::DescriptorBufferInfo& VK_ConstBuffer::currentBufferInfoWithoutUpdata() const
105 {
106 return m_bufferInfos[m_ctx->currentSubmitFrameIndex()];
107 }
108
110 {
111 vk::Device device = m_ctx->getDevice();
112 uint32_t maxFramesInFlight = m_ctx->maxFrameInFlight();
113
114 vk::DeviceSize bufferSize = m_layout.getTotalSize();
115 if (bufferSize == 0) {
116 bufferSize = 256;
117 }
118
119 m_buffers.resize(maxFramesInFlight);
120 m_memories.resize(maxFramesInFlight);
121 m_mappedData.resize(maxFramesInFlight, nullptr);
122 m_frameNeedsUpdate.resize(maxFramesInFlight, false);
123
124 for (uint32_t i = 0; i < maxFramesInFlight; i++) {
125 try {
126 vk::BufferCreateInfo bufferInfo;
127 bufferInfo.size = bufferSize;
128 bufferInfo.usage = vk::BufferUsageFlagBits::eUniformBuffer;
129 bufferInfo.sharingMode = vk::SharingMode::eExclusive;
130
131 m_buffers[i] = device.createBuffer(bufferInfo);
132
133 vk::MemoryRequirements memRequirements = device.getBufferMemoryRequirements(m_buffers[i]);
134
135 vk::MemoryAllocateInfo allocInfo;
136 allocInfo.allocationSize = memRequirements.size;
137 allocInfo.memoryTypeIndex = m_ctx->findMemoryType(
138 memRequirements.memoryTypeBits,
139 vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent
140 );
141
142 m_memories[i] = device.allocateMemory(allocInfo);
143
144 device.bindBufferMemory(m_buffers[i], m_memories[i], 0);
145
146 m_mappedData[i] = device.mapMemory(m_memories[i], 0, bufferSize);
147
148 memset(m_mappedData[i], 0, static_cast<size_t>(bufferSize));
149 }
150 catch (const vk::SystemError& e) {
151 throw std::runtime_error("Failed to create uniform buffer: " + std::string(e.what()));
152 }
153 }
154
155 m_bufferInfos.resize(maxFramesInFlight);
156 for (uint32_t i = 0; i < maxFramesInFlight; i++) {
157 m_bufferInfos[i].buffer = m_buffers[i];
158 m_bufferInfos[i].offset = 0;
159 m_bufferInfos[i].range = bufferSize;
160 }
161 }
162 }
163}
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