Fixed memory usage
This commit is contained in:
@@ -19,42 +19,42 @@ StaticMeshVertexData* StaticMeshVertexData::getInstance() {
|
|||||||
|
|
||||||
void StaticMeshVertexData::loadPositions(uint64 offset, const Array<Vector4>& data) {
|
void StaticMeshVertexData::loadPositions(uint64 offset, const Array<Vector4>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
//positions->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::loadTexCoords(uint64 offset, uint64 index, const Array<Vector2>& data) {
|
void StaticMeshVertexData::loadTexCoords(uint64 offset, uint64 index, const Array<Vector2>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
//texCoords[index]->updateContents(offset * sizeof(Vector2), data.size() * sizeof(Vector2), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::loadNormals(uint64 offset, const Array<Vector4>& data) {
|
void StaticMeshVertexData::loadNormals(uint64 offset, const Array<Vector4>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
// normals->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::loadTangents(uint64 offset, const Array<Vector4>& data) {
|
void StaticMeshVertexData::loadTangents(uint64 offset, const Array<Vector4>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
//tangents->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::loadBiTangents(uint64 offset, const Array<Vector4>& data) {
|
void StaticMeshVertexData::loadBiTangents(uint64 offset, const Array<Vector4>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
// biTangents->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::loadColors(uint64 offset, const Array<Vector4>& data) {
|
void StaticMeshVertexData::loadColors(uint64 offset, const Array<Vector4>& data) {
|
||||||
assert(offset + data.size() <= head);
|
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());
|
//colors->updateContents(offset * sizeof(Vector4), data.size() * sizeof(Vector4), data.data());
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
@@ -127,31 +127,6 @@ uint64 StaticMeshVertexData::deserializeMesh(MeshId id, ArchiveBuffer& buffer) {
|
|||||||
|
|
||||||
void StaticMeshVertexData::init(Gfx::PGraphics _graphics) {
|
void StaticMeshVertexData::init(Gfx::PGraphics _graphics) {
|
||||||
VertexData::init(_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 = _graphics->createDescriptorLayout("pVertexData");
|
||||||
descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 0, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER});
|
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});
|
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; }
|
Gfx::PDescriptorSet StaticMeshVertexData::getVertexDataSet() { return descriptorSet; }
|
||||||
|
|
||||||
void StaticMeshVertexData::resizeBuffers() {
|
void StaticMeshVertexData::resizeBuffers() {
|
||||||
positions->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
|
posData.resize(verticesAllocated);
|
||||||
normals->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
|
norData.resize(verticesAllocated);
|
||||||
tangents->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
|
tanData.resize(verticesAllocated);
|
||||||
biTangents->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
|
bitData.resize(verticesAllocated);
|
||||||
colors->rotateBuffer(verticesAllocated * sizeof(Vector4), true);
|
colData.resize(verticesAllocated);
|
||||||
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
|
for (size_t i = 0; i < MAX_TEXCOORDS; ++i) {
|
||||||
texCoords[i]->rotateBuffer(verticesAllocated * sizeof(Vector2), true);
|
texData[i].resize(verticesAllocated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticMeshVertexData::updateBuffers() {
|
void StaticMeshVertexData::updateBuffers() {
|
||||||
positions->unmap();
|
ShaderBufferCreateInfo createInfo = {
|
||||||
normals->unmap();
|
.sourceData =
|
||||||
tangents->unmap();
|
{
|
||||||
biTangents->unmap();
|
.size = verticesAllocated * sizeof(Vector4),
|
||||||
colors->unmap();
|
.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) {
|
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();
|
descriptorLayout->reset();
|
||||||
descriptorSet = descriptorLayout->allocateDescriptorSet();
|
descriptorSet = descriptorLayout->allocateDescriptorSet();
|
||||||
descriptorSet->updateBuffer(0, positions);
|
descriptorSet->updateBuffer(0, positions);
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ class StaticMeshVertexData : public VertexData {
|
|||||||
Gfx::OShaderBuffer tangents;
|
Gfx::OShaderBuffer tangents;
|
||||||
Gfx::OShaderBuffer biTangents;
|
Gfx::OShaderBuffer biTangents;
|
||||||
Gfx::OShaderBuffer colors;
|
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::ODescriptorLayout descriptorLayout;
|
||||||
Gfx::PDescriptorSet descriptorSet;
|
Gfx::PDescriptorSet descriptorSet;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -255,8 +255,12 @@ void VertexData::commitMeshes() {
|
|||||||
.name = "PrimitiveIndicesBuffer",
|
.name = "PrimitiveIndicesBuffer",
|
||||||
});
|
});
|
||||||
updateBuffers();
|
updateBuffers();
|
||||||
|
vertexIndices.clear();
|
||||||
|
primitiveIndices.clear();
|
||||||
|
indices.clear();
|
||||||
|
meshlets.clear();
|
||||||
dirty = false;
|
dirty = false;
|
||||||
graphics->buildBottomLevelAccelerationStructures(std::move(dataToBuild));
|
//graphics->buildBottomLevelAccelerationStructures(std::move(dataToBuild));
|
||||||
}
|
}
|
||||||
|
|
||||||
MeshId VertexData::allocateVertexData(uint64 numVertices) {
|
MeshId VertexData::allocateVertexData(uint64 numVertices) {
|
||||||
@@ -364,6 +368,7 @@ void VertexData::init(Gfx::PGraphics _graphics) {
|
|||||||
.dynamic = true,
|
.dynamic = true,
|
||||||
.name = "MeshDataBuffer",
|
.name = "MeshDataBuffer",
|
||||||
});
|
});
|
||||||
|
resizeBuffers();
|
||||||
graphics->getShaderCompiler()->registerVertexData(this);
|
graphics->getShaderCompiler()->registerVertexData(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user