diff --git a/.gitmodules b/.gitmodules index 91ee4d1..b598ae1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,7 @@ url = https://github.com/d-bahr/CRCpp.git [submodule "external/vcpkg"] path = external/vcpkg - url = https://github.com/Microsoft/vcpkg.git \ No newline at end of file + url = https://github.com/Microsoft/vcpkg.git +[submodule "external/slang"] + path = external/slang + url = https://github.com/shader-slang/slang.git diff --git a/external/slang b/external/slang new file mode 160000 index 0000000..ec0224e --- /dev/null +++ b/external/slang @@ -0,0 +1 @@ +Subproject commit ec0224edc3a867bbf059e790ad7b2a1a881a0705 diff --git a/res/shaders/LegacyBasePass.slang b/res/shaders/LegacyBasePass.slang index 21755a3..21ab54e 100644 --- a/res/shaders/LegacyBasePass.slang +++ b/res/shaders/LegacyBasePass.slang @@ -4,11 +4,10 @@ import MaterialParameter; import Scene; [shader("vertex")] -FragmentParameter vertexMain( - uint vertexId: SV_VertexID, - uint instanceId: SV_InstanceID, +FragmentParameter vertexMain( + VertexInput input ){ - InstanceData inst = pScene.instances[instanceId]; - VertexAttributes attr = pVertexData.getAttributes(vertexId); + InstanceData inst = pScene.instances[input.instanceId]; + VertexAttributes attr = pVertexData.getAttributes(input.vertexId); return attr.getParameter(inst.transformMatrix); } \ No newline at end of file diff --git a/res/shaders/lib/VertexData.slang b/res/shaders/lib/VertexData.slang index 2bb39d7..7cee4f9 100644 --- a/res/shaders/lib/VertexData.slang +++ b/res/shaders/lib/VertexData.slang @@ -1,5 +1,11 @@ import MaterialParameter; +struct VertexInput +{ + uint vertexId; + uint instanceId: SV_InstanceID; +} + interface IVertexData { VertexAttributes getAttributes(uint index); diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index d533995..c871ec8 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -338,7 +338,7 @@ void MeshLoader::import(MeshImportArgs args, PMeshAsset meshAsset) aiProcess_GenUVCoords | aiProcess_FindDegenerates)); const aiScene *scene = importer.ApplyPostProcessing(aiProcess_CalcTangentSpace | aiProcess_ImproveCacheLocality); - + Array globalMaterials(scene->mNumMaterials); loadTextures(scene, args.filePath.parent_path(), args.importPath); loadMaterials(scene, args.filePath.stem().string(), args.filePath.parent_path(), args.importPath, globalMaterials); diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index d624840..94d7e97 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -65,9 +65,6 @@ int main() AssetImporter::importMesh(MeshImportArgs{ .filePath= sourcePath / "old_resources/models/cube.fbx", }); - AssetImporter::importMesh(MeshImportArgs{ - .filePath = sourcePath / "old_resources/models/sponza/sponza.gltf", - }); //AssetImporter::importMesh(MeshImportArgs{ // .filePath= sourcePath / "old_resources/models/flameThrower.fbx", // }); diff --git a/src/Engine/Graphics/Graphics.h b/src/Engine/Graphics/Graphics.h index 4eb2b64..3292e43 100644 --- a/src/Engine/Graphics/Graphics.h +++ b/src/Engine/Graphics/Graphics.h @@ -82,6 +82,8 @@ public: virtual ODescriptorLayout createDescriptorLayout(const std::string& name = "") = 0; virtual OPipelineLayout createPipelineLayout(PPipelineLayout baseLayout = nullptr) = 0; + virtual OVertexInput createVertexInput(VertexInputStateCreateInfo createInfo) = 0; + virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) = 0; bool supportMeshShading() const { return meshShadingEnabled; } diff --git a/src/Engine/Graphics/Initializer.h b/src/Engine/Graphics/Initializer.h index f69edeb..5e6f09e 100644 --- a/src/Engine/Graphics/Initializer.h +++ b/src/Engine/Graphics/Initializer.h @@ -118,7 +118,24 @@ struct ShaderCreateInfo Array> typeParameter; Map defines; }; - +struct VertexInputBinding +{ + uint32 binding; + uint32 stride; + Gfx::SeVertexInputRate inputRate; +}; +struct VertexInputAttribute +{ + uint32 location; + uint32 binding; + Gfx::SeFormat format; + uint32 offset; +}; +struct VertexInputStateCreateInfo +{ + Array bindings; + Array attributes; +}; namespace Gfx { struct SePushConstantRange @@ -180,6 +197,7 @@ struct ColorBlendState StaticArray blendConstants; }; +DECLARE_REF(VertexInput) DECLARE_REF(VertexShader) DECLARE_REF(TaskShader) DECLARE_REF(MeshShader) @@ -190,6 +208,7 @@ DECLARE_REF(PipelineLayout) struct LegacyPipelineCreateInfo { SePrimitiveTopology topology; + PVertexInput vertexInput; PVertexShader vertexShader; PFragmentShader fragmentShader; PRenderPass renderPass; diff --git a/src/Engine/Graphics/Pipeline.cpp b/src/Engine/Graphics/Pipeline.cpp index 010f086..7004836 100644 --- a/src/Engine/Graphics/Pipeline.cpp +++ b/src/Engine/Graphics/Pipeline.cpp @@ -3,6 +3,15 @@ using namespace Seele; using namespace Seele::Gfx; +VertexInput::VertexInput(VertexInputStateCreateInfo createInfo) + : createInfo(createInfo) +{ +} + +VertexInput::~VertexInput() +{ +} + GraphicsPipeline::GraphicsPipeline(OPipelineLayout layout) : layout(std::move(layout)) { diff --git a/src/Engine/Graphics/Pipeline.h b/src/Engine/Graphics/Pipeline.h index 81febba..56f9c2a 100644 --- a/src/Engine/Graphics/Pipeline.h +++ b/src/Engine/Graphics/Pipeline.h @@ -6,6 +6,15 @@ namespace Seele { namespace Gfx { +class VertexInput +{ +public: + VertexInput(VertexInputStateCreateInfo createInfo); + virtual ~VertexInput(); + const VertexInputStateCreateInfo& getInfo() const { return createInfo; } +private: + VertexInputStateCreateInfo createInfo; +}; class GraphicsPipeline { public: diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index d8325f4..48cf4e3 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -249,6 +249,11 @@ Gfx::OPipelineLayout Graphics::createPipelineLayout(Gfx::PPipelineLayout baseLay return new PipelineLayout(this, baseLayout); } +Gfx::OVertexInput Graphics::createVertexInput(VertexInputStateCreateInfo createInfo) +{ + return new VertexInput(createInfo); +} + void Graphics::resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) { PTextureBase sourceTex = source.cast(); diff --git a/src/Engine/Graphics/Vulkan/Graphics.h b/src/Engine/Graphics/Vulkan/Graphics.h index 73abcb7..6980123 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.h +++ b/src/Engine/Graphics/Vulkan/Graphics.h @@ -66,6 +66,8 @@ public: virtual Gfx::ODescriptorLayout createDescriptorLayout(const std::string& name = "") override; virtual Gfx::OPipelineLayout createPipelineLayout(Gfx::PPipelineLayout baseLayout = nullptr) override; + virtual Gfx::OVertexInput createVertexInput(VertexInputStateCreateInfo createInfo) override; + virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) override; void vkCmdDrawMeshTasksEXT(VkCommandBuffer handle, uint32 groupX, uint32 groupY, uint32 groupZ); diff --git a/src/Engine/Graphics/Vulkan/Pipeline.cpp b/src/Engine/Graphics/Vulkan/Pipeline.cpp index bb847f7..59404d8 100644 --- a/src/Engine/Graphics/Vulkan/Pipeline.cpp +++ b/src/Engine/Graphics/Vulkan/Pipeline.cpp @@ -5,6 +5,15 @@ using namespace Seele; using namespace Seele::Vulkan; +VertexInput::VertexInput(VertexInputStateCreateInfo createInfo) + : Gfx::VertexInput(createInfo) +{ +} + +VertexInput::~VertexInput() +{ +} + GraphicsPipeline::GraphicsPipeline(PGraphics graphics, VkPipeline handle, Gfx::OPipelineLayout pipelineLayout) : Gfx::GraphicsPipeline(std::move(pipelineLayout)) , graphics(graphics) diff --git a/src/Engine/Graphics/Vulkan/Pipeline.h b/src/Engine/Graphics/Vulkan/Pipeline.h index 174e77a..d459ad7 100644 --- a/src/Engine/Graphics/Vulkan/Pipeline.h +++ b/src/Engine/Graphics/Vulkan/Pipeline.h @@ -6,6 +6,13 @@ namespace Seele { namespace Vulkan { +class VertexInput : public Gfx::VertexInput +{ +public: + VertexInput(VertexInputStateCreateInfo createInfo); + virtual ~VertexInput(); +private: +}; DECLARE_REF(PipelineLayout) DECLARE_REF(Graphics) class GraphicsPipeline : public Gfx::GraphicsPipeline diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.cpp b/src/Engine/Graphics/Vulkan/PipelineCache.cpp index 11e33e1..e2aab87 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/PipelineCache.cpp @@ -52,10 +52,36 @@ PGraphicsPipeline PipelineCache::createPipeline(Gfx::LegacyPipelineCreateInfo gf { PPipelineLayout layout = Gfx::PPipelineLayout(gfxInfo.pipelineLayout).cast(); uint32 hash = layout->getHash(); + const VertexInputStateCreateInfo& vertexInputDesc = gfxInfo.vertexInput->getInfo(); + Array bindings(vertexInputDesc.bindings.size()); + Array attributes(vertexInputDesc.attributes.size()); + for (size_t i = 0; i < bindings.size(); i++) + { + bindings[i] = { + .binding = vertexInputDesc.bindings[i].binding, + .stride = vertexInputDesc.bindings[i].stride, + .inputRate = VkVertexInputRate(vertexInputDesc.bindings[i].inputRate), + }; + } + for (size_t i = 0; i < attributes.size(); i++) + { + attributes[i] = { + .location = vertexInputDesc.attributes[i].location, + .binding = vertexInputDesc.attributes[i].binding, + .format = cast(vertexInputDesc.attributes[i].format), + .offset = vertexInputDesc.attributes[i].offset, + }; + } + hash = CRC::Calculate(bindings.data(), sizeof(VkVertexInputBindingDescription) * bindings.size(), CRC::CRC_32(), hash); + hash = CRC::Calculate(attributes.data(), sizeof(VkVertexInputAttributeDescription) * attributes.size(), CRC::CRC_32(), hash); VkPipelineVertexInputStateCreateInfo vertexInput = { .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, .pNext = nullptr, .flags = 0, + .vertexBindingDescriptionCount = (uint32)bindings.size(), + .pVertexBindingDescriptions = bindings.data(), + .vertexAttributeDescriptionCount = (uint32)attributes.size(), + .pVertexAttributeDescriptions = attributes.data(), }; uint32 stageCount = 0; diff --git a/src/Engine/Graphics/Vulkan/Shader.cpp b/src/Engine/Graphics/Vulkan/Shader.cpp index d0af9d0..4142fa5 100644 --- a/src/Engine/Graphics/Vulkan/Shader.cpp +++ b/src/Engine/Graphics/Vulkan/Shader.cpp @@ -63,7 +63,6 @@ void Shader::create(const ShaderCreateInfo& createInfo) Slang::ComPtr session; CHECK_RESULT(globalSession->createSession(sessionDesc, session.writeRef())); - Slang::ComPtr diagnostics; Array modules; Slang::ComPtr entrypoint;