From 89cee2e41a64593aea331cf831dab45e7d315bfa Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Sun, 26 Nov 2023 09:40:48 +0100 Subject: [PATCH] Somewhat working version --- cmake/SuperBuild.cmake | 2 +- external/slang | 2 +- res/shaders/LegacyBasePass.slang | 13 +-- res/shaders/MeshletBasePass.slang | 2 +- .../lib/{Meshlet.slang => Scene.slang} | 2 +- src/Engine/Graphics/VertexData.cpp | 105 +++++------------- src/Engine/Graphics/VertexData.h | 4 +- src/Engine/System/KeyboardInput.cpp | 1 + src/Engine/System/MeshUpdater.cpp | 24 ++-- src/Engine/System/MeshUpdater.h | 9 +- 10 files changed, 44 insertions(+), 120 deletions(-) rename res/shaders/lib/{Meshlet.slang => Scene.slang} (94%) diff --git a/cmake/SuperBuild.cmake b/cmake/SuperBuild.cmake index 226df12..8a3c763 100644 --- a/cmake/SuperBuild.cmake +++ b/cmake/SuperBuild.cmake @@ -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) diff --git a/external/slang b/external/slang index 79677b8..5af36cf 160000 --- a/external/slang +++ b/external/slang @@ -1 +1 @@ -Subproject commit 79677b83870577fbad9ce65a731d3ae8a4c553c1 +Subproject commit 5af36cf4ca7a81d91fb03cdf39e40b6b4175fa2d diff --git a/res/shaders/LegacyBasePass.slang b/res/shaders/LegacyBasePass.slang index faa3596..3f190e9 100644 --- a/res/shaders/LegacyBasePass.slang +++ b/res/shaders/LegacyBasePass.slang @@ -1,18 +1,7 @@ import Common; import VertexData; import MaterialParameter; - -struct InstanceData -{ - float4x4 transformMatrix; -}; - -struct Scene -{ - StructuredBuffer instances; -} -layout(set=2) -ParameterBlock pScene; +import Scene; struct VertexShaderOutput { diff --git a/res/shaders/MeshletBasePass.slang b/res/shaders/MeshletBasePass.slang index b607634..b6eb2a5 100644 --- a/res/shaders/MeshletBasePass.slang +++ b/res/shaders/MeshletBasePass.slang @@ -1,6 +1,6 @@ import Common; import BRDF; -import Meshlet; +import Scene; import VertexData; import MaterialParameter; diff --git a/res/shaders/lib/Meshlet.slang b/res/shaders/lib/Scene.slang similarity index 94% rename from res/shaders/lib/Meshlet.slang rename to res/shaders/lib/Scene.slang index ea0e8ba..4195371 100644 --- a/res/shaders/lib/Meshlet.slang +++ b/res/shaders/lib/Scene.slang @@ -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; diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp index eb79f01..77d02d9 100644 --- a/src/Engine/Graphics/VertexData.cpp +++ b/src/Engine/Graphics/VertexData.cpp @@ -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; + Array 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 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); diff --git a/src/Engine/Graphics/VertexData.h b/src/Engine/Graphics/VertexData.h index df6ac98..189c1ef 100644 --- a/src/Engine/Graphics/VertexData.h +++ b/src/Engine/Graphics/VertexData.h @@ -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 meshlets); MeshId allocateVertexData(uint64 numVertices); diff --git a/src/Engine/System/KeyboardInput.cpp b/src/Engine/System/KeyboardInput.cpp index 802f782..75b75a1 100644 --- a/src/Engine/System/KeyboardInput.cpp +++ b/src/Engine/System/KeyboardInput.cpp @@ -6,6 +6,7 @@ using namespace Seele::System; KeyboardInput::KeyboardInput(PScene scene) : ComponentSystem(scene) { + std::memset(keys.data(), 0, sizeof(keys)); } KeyboardInput::~KeyboardInput() diff --git a/src/Engine/System/MeshUpdater.cpp b/src/Engine/System/MeshUpdater.cpp index 5f9a3a4..12a27b7 100644 --- a/src/Engine/System/MeshUpdater.cpp +++ b/src/Engine/System/MeshUpdater.cpp @@ -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(scene) { - scene->view([&](entt::entity id, Component::Mesh& mesh) { - meshEntities.add(id); - }); - scene->constructCallback().connect<&MeshUpdater::on_construct>(this); - scene->destroyCallback().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); + } } diff --git a/src/Engine/System/MeshUpdater.h b/src/Engine/System/MeshUpdater.h index 673d0a2..c9f6dee 100644 --- a/src/Engine/System/MeshUpdater.h +++ b/src/Engine/System/MeshUpdater.h @@ -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 { public: MeshUpdater(PScene scene); virtual ~MeshUpdater(); - virtual void update() override; + virtual void update(Component::Transform& transform, Component::Mesh& mesh) override; private: - Array meshEntities; - void on_construct(entt::registry& reg, entt::entity id); - void on_destroy(entt::registry& reg, entt::entity id); }; } // namespace System } // namespace Seele \ No newline at end of file