Fixed memory usage

This commit is contained in:
Dynamitos
2024-08-08 22:53:49 +02:00
parent ac72377210
commit b857963f68
3 changed files with 61 additions and 44 deletions
+49 -43
View File
@@ -19,42 +19,42 @@ StaticMeshVertexData* StaticMeshVertexData::getInstance() {
void StaticMeshVertexData::loadPositions(uint64 offset, const Array<Vector4>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector4*)positions->map() + offset, data.data(), data.size() * sizeof(Vector4));
std::memcpy(posData.data() + offset, data.data(), data.size() * sizeof(Vector4));
//positions->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
dirty = true;
}
void StaticMeshVertexData::loadTexCoords(uint64 offset, uint64 index, const Array<Vector2>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector2*)texCoords[index]->map() + offset, data.data(), data.size() * sizeof(Vector2));
std::memcpy(texData[index].data() + offset, data.data(), data.size() * sizeof(Vector2));
//texCoords[index]->updateContents(offset * sizeof(Vector2), data.size() * sizeof(Vector2), data.data());
dirty = true;
}
void StaticMeshVertexData::loadNormals(uint64 offset, const Array<Vector4>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector4*)normals->map() + offset, data.data(), data.size() * sizeof(Vector4));
std::memcpy(norData.data() + offset, data.data(), data.size() * sizeof(Vector4));
// normals->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
dirty = true;
}
void StaticMeshVertexData::loadTangents(uint64 offset, const Array<Vector4>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector4*)tangents->map() + offset, data.data(), data.size() * sizeof(Vector4));
std::memcpy(tanData.data() + offset, data.data(), data.size() * sizeof(Vector4));
//tangents->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
dirty = true;
}
void StaticMeshVertexData::loadBiTangents(uint64 offset, const Array<Vector4>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector4*)biTangents->map() + offset, data.data(), data.size() * sizeof(Vector4));
std::memcpy(bitData.data() + offset, data.data(), data.size() * sizeof(Vector4));
// biTangents->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
dirty = true;
}
void StaticMeshVertexData::loadColors(uint64 offset, const Array<Vector4>& data) {
assert(offset + data.size() <= head);
std::memcpy((Vector4*)colors->map() + offset, data.data(), data.size() * sizeof(Vector4));
std::memcpy(colData.data() + offset, data.data(), data.size() * sizeof(Vector4));
//colors->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
dirty = true;
}
@@ -127,31 +127,6 @@ uint64 StaticMeshVertexData::deserializeMesh(MeshId id, ArchiveBuffer& buffer) {
void StaticMeshVertexData::init(Gfx::PGraphics _graphics) {
VertexData::init(_graphics);
ShaderBufferCreateInfo createInfo = {
.sourceData =
{
.size = verticesAllocated * sizeof(Vector4),
},
.numElements = verticesAllocated,
.dynamic = true,
.vertexBuffer = true,
.name = "Positions",
};
positions = graphics->createShaderBuffer(createInfo);
createInfo.vertexBuffer = false;
createInfo.name = "Normals";
normals = graphics->createShaderBuffer(createInfo);
createInfo.name = "Tangents";
tangents = graphics->createShaderBuffer(createInfo);
createInfo.name = "BiTangents";
biTangents = graphics->createShaderBuffer(createInfo);
createInfo.name = "Colors";
colors = graphics->createShaderBuffer(createInfo);
createInfo.sourceData.size = verticesAllocated * sizeof(Vector2);
createInfo.name = "TexCoords";
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
texCoords[i] = graphics->createShaderBuffer(createInfo);
}
descriptorLayout = _graphics->createDescriptorLayout("pVertexData");
descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 0, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER});
descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 1, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER});
@@ -190,25 +165,56 @@ Gfx::PDescriptorLayout StaticMeshVertexData::getVertexDataLayout() { return desc
Gfx::PDescriptorSet StaticMeshVertexData::getVertexDataSet() { return descriptorSet; }
void StaticMeshVertexData::resizeBuffers() {
positions->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
normals->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
tangents->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
biTangents->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
colors->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
posData.resize(verticesAllocated);
norData.resize(verticesAllocated);
tanData.resize(verticesAllocated);
bitData.resize(verticesAllocated);
colData.resize(verticesAllocated);
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
texCoords[i]->rotateBuffer(verticesAllocated * sizeof(Vector2), true);
texData[i].resize(verticesAllocated);
}
}
void StaticMeshVertexData::updateBuffers() {
positions->unmap();
normals->unmap();
tangents->unmap();
biTangents->unmap();
colors->unmap();
ShaderBufferCreateInfo createInfo = {
.sourceData =
{
.size = verticesAllocated * sizeof(Vector4),
.data = (uint8*)posData.data(),
},
.numElements = verticesAllocated,
.dynamic = true,
.vertexBuffer = true,
.name = "Positions",
};
positions = graphics->createShaderBuffer(createInfo);
createInfo.vertexBuffer = false;
createInfo.name = "Normals";
createInfo.sourceData.data = (uint8*)norData.data();
normals = graphics->createShaderBuffer(createInfo);
createInfo.name = "Tangents";
createInfo.sourceData.data = (uint8*)tanData.data();
tangents = graphics->createShaderBuffer(createInfo);
createInfo.name = "BiTangents";
createInfo.sourceData.data = (uint8*)bitData.data();
biTangents = graphics->createShaderBuffer(createInfo);
createInfo.name = "Colors";
createInfo.sourceData.data = (uint8*)colData.data();
colors = graphics->createShaderBuffer(createInfo);
createInfo.sourceData.size = verticesAllocated * sizeof(Vector2);
createInfo.name = "TexCoords";
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
texCoords[i]->unmap();
createInfo.sourceData.data = (uint8*)texData[i].data();
texCoords[i] = graphics->createShaderBuffer(createInfo);
}
posData.clear();
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
texData[i].clear();
}
norData.clear();
tanData.clear();
bitData.clear();
colData.clear();
descriptorLayout->reset();
descriptorSet = descriptorLayout->allocateDescriptorSet();
descriptorSet->updateBuffer(0, positions);
@@ -38,6 +38,12 @@ class StaticMeshVertexData : public VertexData {
Gfx::OShaderBuffer tangents;
Gfx::OShaderBuffer biTangents;
Gfx::OShaderBuffer colors;
Array<Vector4> posData;
Array<Vector2> texData[MAX_TEXCOORDS];
Array<Vector4> norData;
Array<Vector4> tanData;
Array<Vector4> bitData;
Array<Vector4> colData;
Gfx::ODescriptorLayout descriptorLayout;
Gfx::PDescriptorSet descriptorSet;
};
+6 -1
View File
@@ -255,8 +255,12 @@ void VertexData::commitMeshes() {
.name = "PrimitiveIndicesBuffer",
});
updateBuffers();
vertexIndices.clear();
primitiveIndices.clear();
indices.clear();
meshlets.clear();
dirty = false;
graphics->buildBottomLevelAccelerationStructures(std::move(dataToBuild));
//graphics->buildBottomLevelAccelerationStructures(std::move(dataToBuild));
}
MeshId VertexData::allocateVertexData(uint64 numVertices) {
@@ -364,6 +368,7 @@ void VertexData::init(Gfx::PGraphics _graphics) {
.dynamic = true,
.name = "MeshDataBuffer",
});
resizeBuffers();
graphics->getShaderCompiler()->registerVertexData(this);
}