Somewhat working version

This commit is contained in:
Dynamitos
2023-11-26 09:40:48 +01:00
parent 7f1bc7d090
commit 89cee2e41a
10 changed files with 44 additions and 120 deletions
+1 -1
View File
@@ -72,7 +72,7 @@ ExternalProject_Add(slang-build
SOURCE_DIR ${SLANG_ROOT}
BINARY_DIR ${SLANG_ROOT}
CONFIGURE_COMMAND ${SLANG_ROOT}/premake.bat vs2019 --file=${SLANG_ROOT}/premake5.lua gmake --arch=x64 --deps=true
BUILD_COMMAND msbuild slang.sln -p:PlatformToolset=v143 -p:Configuration=Release -p:Platform=x64
BUILD_COMMAND msbuild -p:PlatformToolset=v143 -p:Configuration=Release -p:Platform=x64 build/visual-studio/slang/slang.vcxproj
INSTALL_COMMAND ""
)
elseif(UNIX)
+1 -1
+1 -12
View File
@@ -1,18 +1,7 @@
import Common;
import VertexData;
import MaterialParameter;
struct InstanceData
{
float4x4 transformMatrix;
};
struct Scene
{
StructuredBuffer<InstanceData> instances;
}
layout(set=2)
ParameterBlock<Scene> pScene;
import Scene;
struct VertexShaderOutput
{
+1 -1
View File
@@ -1,6 +1,6 @@
import Common;
import BRDF;
import Meshlet;
import Scene;
import VertexData;
import MaterialParameter;
@@ -18,7 +18,7 @@ struct MeshData
static const uint MAX_VERTICES = 64;
static const uint MAX_PRIMITIVES = 126;
static const uint TASK_GROUP_SIZE = 128;
static const uint TASK_GROUP_SIZE = 1;
static const uint MESH_GROUP_SIZE = 32;
static const uint MAX_MESHLETS_PER_MESH = 512;
+27 -78
View File
@@ -18,6 +18,7 @@ void VertexData::resetMeshData()
{
mat.material->getDescriptorLayout()->reset();
}
materialData.clear();
if (dirty)
{
updateBuffers();
@@ -25,7 +26,7 @@ void VertexData::resetMeshData()
}
}
void VertexData::addMesh(PMesh mesh)
void VertexData::updateMesh(PMesh mesh, Component::Transform& transform)
{
PMaterial mat = mesh->referencedMaterial->getHandle()->getBaseMaterial();
MaterialData& matData = materialData[mat->getName()];
@@ -34,28 +35,15 @@ void VertexData::addMesh(PMesh mesh)
matInstanceData.meshes.add(MeshInstanceData{
.id = mesh->id,
.instance = InstanceData {
.transformMatrix = Matrix4(),
.transformMatrix = transform.toMatrix(),
},
.indexBuffer = mesh->indexBuffer,
});
});
matInstanceData.materialInstance = mesh->referencedMaterial->getHandle();
matInstanceData.numMeshes += meshData[mesh->id].size();
}
void VertexData::removeMesh(PMesh mesh)
{
PMaterial mat = mesh->referencedMaterial->getHandle()->getBaseMaterial();
MaterialData& matData = materialData[mat->getName()];
matData.material = mat;
MaterialInstanceData& matInstanceData = matData.instances[mesh->referencedMaterial->getHandle()->getId()];
matInstanceData.meshes.remove_if([&mesh](const MeshInstanceData& data) {
return data.id == mesh->id;
});
matInstanceData.materialInstance = mesh->referencedMaterial->getHandle();
matInstanceData.numMeshes -= meshData[mesh->id].size();
}
void VertexData::updateInstances()
void VertexData::createDescriptors()
{
instanceDataLayout->reset();
for (const auto& [_, mat] : materialData)
@@ -63,11 +51,13 @@ void VertexData::updateInstances()
for (auto& [_, matInst] : mat.instances)
{
Array<InstanceData> instanceData;
Array<MeshData> meshes;
for (auto& inst : matInst.meshes)
{
inst.meshes = 0;
for (const auto& mesh : meshData[inst.id])
{
meshes.add(mesh);
instanceData.add(inst.instance);
inst.meshes++;
}
@@ -82,60 +72,20 @@ void VertexData::updateInstances()
});
matInst.descriptorSet = instanceDataLayout->allocateDescriptorSet();
matInst.descriptorSet->updateBuffer(0, matInst.instanceBuffer);
if (graphics->supportMeshShading())
{
matInst.descriptorSet->updateBuffer(1, matInst.meshDataBuffer);
matInst.descriptorSet->updateBuffer(2, meshletBuffer);
matInst.descriptorSet->updateBuffer(3, primitiveIndicesBuffer);
matInst.descriptorSet->updateBuffer(4, vertexIndicesBuffer);
}
matInst.descriptorSet->writeChanges();
}
}
}
void VertexData::createDescriptors()
{
instanceDataLayout->reset();
for (const auto& [_, mat] : materialData)
{
for (auto& [_, matInst] : mat.instances)
{
Array<MeshData> meshes;
for (auto& inst : matInst.meshes)
{
inst.meshes = 0;
for (const auto& mesh : meshData[inst.id])
{
meshes.add(mesh);
inst.meshes++;
}
}
matInst.instanceBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
matInst.meshDataBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.sourceData = {
.size = sizeof(InstanceData) * instanceData.size(),
.data = (uint8*)instanceData.data(),
.size = sizeof(MeshData) * meshes.size(),
.data = (uint8*)meshes.data(),
},
.numElements = instanceData.size(),
.numElements = meshes.size(),
.dynamic = false,
});
matInst.descriptorSet = instanceDataLayout->allocateDescriptorSet();
matInst.descriptorSet->updateBuffer(0, matInst.instanceBuffer);
if (graphics->supportMeshShading())
{
matInst.meshDataBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.sourceData = {
.size = sizeof(MeshData) * meshes.size(),
.data = (uint8*)meshes.data(),
},
.numElements = meshes.size(),
.dynamic = false,
});
matInst.descriptorSet->updateBuffer(1, matInst.meshDataBuffer);
matInst.descriptorSet->updateBuffer(2, meshletBuffer);
matInst.descriptorSet->updateBuffer(3, primitiveIndicesBuffer);
matInst.descriptorSet->updateBuffer(4, vertexIndicesBuffer);
}
matInst.descriptorSet->updateBuffer(1, matInst.meshDataBuffer);
matInst.descriptorSet->updateBuffer(2, meshletBuffer);
matInst.descriptorSet->updateBuffer(3, primitiveIndicesBuffer);
matInst.descriptorSet->updateBuffer(4, vertexIndicesBuffer);
matInst.descriptorSet->writeChanges();
matInst.numMeshes = meshes.size();
}
@@ -252,17 +202,16 @@ void Seele::VertexData::init(Gfx::PGraphics graphics)
verticesAllocated = NUM_DEFAULT_ELEMENTS;
instanceDataLayout = graphics->createDescriptorLayout("VertexDataInstanceLayout");
instanceDataLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
if (graphics->supportMeshShading())
{
// meshData
instanceDataLayout->addDescriptorBinding(1, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// meshletData
instanceDataLayout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// primitiveIndices
instanceDataLayout->addDescriptorBinding(3, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// vetexIndices
instanceDataLayout->addDescriptorBinding(4, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
}
// meshData
instanceDataLayout->addDescriptorBinding(1, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// meshletData
instanceDataLayout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// primitiveIndices
instanceDataLayout->addDescriptorBinding(3, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
// vetexIndices
instanceDataLayout->addDescriptorBinding(4, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
instanceDataLayout->create();
resizeBuffers();
graphics->getShaderCompiler()->registerVertexData(this);
+1 -3
View File
@@ -67,9 +67,7 @@ public:
uint32 indicesOffset;
};
void resetMeshData();
void addMesh(PMesh mesh);
void removeMesh(PMesh mesh);
void updateInstances();
void updateMesh(PMesh mesh, Component::Transform& transform);
void createDescriptors();
void loadMesh(MeshId id, Array<Meshlet> meshlets);
MeshId allocateVertexData(uint64 numVertices);
+1
View File
@@ -6,6 +6,7 @@ using namespace Seele::System;
KeyboardInput::KeyboardInput(PScene scene)
: ComponentSystem<Component::KeyboardInput>(scene)
{
std::memset(keys.data(), 0, sizeof(keys));
}
KeyboardInput::~KeyboardInput()
+7 -17
View File
@@ -1,32 +1,22 @@
#include "MeshUpdater.h"
#include "Component/Mesh.h"
using namespace Seele;
using namespace Seele::System;
MeshUpdater::MeshUpdater(PScene scene)
: SystemBase(scene)
: ComponentSystem<Component::Transform, Component::Mesh>(scene)
{
scene->view<Component::Mesh>([&](entt::entity id, Component::Mesh& mesh) {
meshEntities.add(id);
});
scene->constructCallback<Component::Mesh>().connect<&MeshUpdater::on_construct>(this);
scene->destroyCallback<Component::Mesh>().connect<&MeshUpdater::on_destroy>(this);
}
MeshUpdater::~MeshUpdater()
{
}
void MeshUpdater::update()
void MeshUpdater::update(Component::Transform& transform, Component::Mesh& comp)
{
}
void MeshUpdater::on_construct(entt::registry& reg, entt::entity id)
{
meshEntities.add(id);
}
void MeshUpdater::on_destroy(entt::registry& reg, entt::entity id)
{
meshEntities.remove(id, false);
for (auto& mesh : comp.asset->meshes)
{
mesh->vertexData->updateMesh(mesh, transform);
}
}
+3 -6
View File
@@ -1,5 +1,5 @@
#pragma once
#include "SystemBase.h"
#include "ComponentSystem.h"
#include "Component/Transform.h"
#include "Component/Mesh.h"
@@ -7,16 +7,13 @@ namespace Seele
{
namespace System
{
class MeshUpdater : public SystemBase
class MeshUpdater : public ComponentSystem<Component::Transform, Component::Mesh>
{
public:
MeshUpdater(PScene scene);
virtual ~MeshUpdater();
virtual void update() override;
virtual void update(Component::Transform& transform, Component::Mesh& mesh) override;
private:
Array<entt::entity> meshEntities;
void on_construct(entt::registry& reg, entt::entity id);
void on_destroy(entt::registry& reg, entt::entity id);
};
} // namespace System
} // namespace Seele