-
Notifications
You must be signed in to change notification settings - Fork 67
Mesh Pipelines #973
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
GDBobby
wants to merge
140
commits into
Devsh-Graphics-Programming:master
Choose a base branch
from
GDBobby:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Mesh Pipelines #973
Changes from all commits
Commits
Show all changes
140 commits
Select commit
Hold shift + click to select a range
867b6b8
Created `nbl::system::to_string` utility function
Przemog1 ac75675
Removed from the `to_string` function specialization of types not pre…
Przemog1 3e5cbde
Restored the removed `system::to_string` specializations
Przemog1 7871e1b
Fixes
Przemog1 e97c681
Updated examples_tests
Przemog1 8d773e5
Updated examples
Przemog1 138fb9b
Updated examples
Przemog1 d81a199
Updated examples
Przemog1 e9dc279
get latest glm
5e30ad9
Extended matrix
Przemog1 95170b9
update gli now
252c777
fixed example 22
d86b4cb
Implemented relative approx compare
Przemog1 f01cee4
Fixed bug in CStdoutLogger
Przemog1 c319660
Every ILogger::log call now uses string literal as its first argument
Przemog1 d3c1e84
initial example
keptsecret babda46
use bxdf creation params struct
keptsecret 462a9b3
triangle and rectangle shapes
keptsecret 7d5d70c
more sampling methods
keptsecret 15801af
spherical rectangle
keptsecret 7419893
fix aniso cache bug
keptsecret cf2476d
init func to modify bxdf params directly
keptsecret 535e18d
bug fixes
keptsecret b45f0a8
fix sampling bugs #2
keptsecret 9d1de16
temporary fix for dxc bug issue 7154
keptsecret 28fd99e
some bug fixes again
keptsecret ed713f8
fix wrong template usage
keptsecret 3de1462
fix typo
keptsecret 3bd988b
fixed some func usage to nbl ver
keptsecret 320bf0e
specify template args
keptsecret 52ad8a9
fix use of static const in func
keptsecret 8aa9903
added more morton order stuff
keptsecret f7b0eef
use new angle adder
keptsecret c29fa62
initialize invalid ndf return to inf, not 0
keptsecret 49db9d6
derive trait from cook torrance base
keptsecret 9eb3a18
fix angle adder
keptsecret f1e3454
optimizations to iridescent fresnel
keptsecret f4755dd
avoid repeat fresnel calc
keptsecret 558177c
mix reflectance w/ transmission in getScaledReflectance
keptsecret 3f92c27
some minor fixes to fresnel orientedEta usage
keptsecret 0580e99
refactor usage of angle adding
keptsecret cb542f2
temp? fix for mix_helper on floats
keptsecret f826120
Created RWMC files
Przemog1 0a864b1
Refactored resolve.hlsl
Przemog1 a86a1b3
added missing typename qualifier
keptsecret df9faf9
minor fixes to spherical rect, latest example
keptsecret e203109
quaternion struct, renamed spherical tri/rect shapes
keptsecret 07bf4d9
make PartitionRandVar in struct and templated
keptsecret ff88a7d
precompute values in linear, bilinear sampling; make box muller a struct
keptsecret 6cb5324
precompute cos_sides, csc_sides in shape spherical_tri
keptsecret 7a4f0d6
Fixed `ResolveAccessor` concept
Przemog1 d97664c
fix spherical tri precompute
keptsecret 0b089b9
make rwmc accumulator match concept
keptsecret 3ba44cb
pack rwmc params to half 2x16
keptsecret 5a80b45
took 1transformation_matrix_utils.hlsl` from Arek's `cameraz` branch
karimsayedre e14e8ec
change quaternion struct name to match what it will be
keptsecret a361548
removed temp fix for mix_helper require
keptsecret 77c29e5
fixes more nan problems + a few bugs in iridescent fresnel
keptsecret 13f8052
fixes iridescent fresnel under transmission
keptsecret a9e7f39
fix wrong get refraction eta in iridescent transmission
keptsecret 6004b83
quantized sequence packing data
keptsecret e456e26
templated quantized sequence
keptsecret d1a5eb5
quantized sequence decode
keptsecret a512e39
quantized sequence get/set values by index, simplify decode func spec…
keptsecret f8f6ab0
quantized sequence encode should right shift input, changed scramble …
keptsecret 4092952
added decode variant for scramble before decode
keptsecret 9794d36
some minor fixes to quantized sequence set, decode
keptsecret cc2263a
fix quantized sequence mask being too small, assert conditions
keptsecret 29bc8b0
fixed problems from merging master
keptsecret 6371e60
fix decode scramble key, shifting discard bits in quantization
keptsecret 59d4f79
fix z component storing too many bits in quantized sequence in vec2 d…
keptsecret 7a8b9a5
mix_helper requirements include bool vectors
keptsecret 0063658
fix iridescent oriented eta bug
keptsecret eb369cf
partitionRandVar stores leftProb, fix minor bugs
keptsecret 92493da
plain const for vector types
keptsecret 38f68a7
fixes to iridescent fresnel, moved getOrientedEtaRcp to dielectric fr…
keptsecret 5c1dc53
adjust mix_helper calling select requirements
keptsecret a846ae4
restore regular triangle stuff, refactor usage
keptsecret eb2679e
minor changes to rwmc usage
keptsecret 8fc944a
remove storing texture inside local var of ResolveAccessorAdaptor
keptsecret f759821
removed accessor, user should provide accessor that matches concept
keptsecret c356749
fix formatting, name
keptsecret 0478e76
added more things to precompute
keptsecret 5c83e69
changes to splatting params precompute for the last time
keptsecret ea1919e
check that eta type of dielectric fresnels should be monochrome
keptsecret 367b9bf
Change `Compile flag error` to `Compile flag warning`
devshgraphicsprogramming e134378
Create docs for NSC prebuilds
AnastaZIuk a16cce2
Remove duplicate partial specialization for truncate and emulated_vec
c1f945f
Updated DXC
Przemog1 a00d122
Adds a flag to NSC to support preprocessing shaders and storing the r…
Fletterio e42cc99
update docker/compiler-explorer submodule
AnastaZIuk 3347a49
update docker/compiler-explorer submodule
AnastaZIuk 7d89326
update docker/compiler-explorer submodule
AnastaZIuk 184c274
added debug draw aabb extension, moved from ex
keptsecret e642b55
removed todos
keptsecret 6e49dc7
support hlsl AABBs, also OBBs with transform
keptsecret 9211c07
minor syntax changes
keptsecret 6267b9f
use hlsl cpp compat matrices, aabb
keptsecret 47f40aa
change batch render to use indexed draw
keptsecret c90dfcf
simplified single AABB draw
keptsecret 17a135c
change batch render to take span of InstanceData
keptsecret 1b7a433
removed vertex buffer, use const vertex array in shader instead
keptsecret 65cf00d
validate creation params, added draw modes at create time
keptsecret 3d9d614
enable debug draw by default
keptsecret 1f423d6
fix embed builtin resource build
keptsecret 1669941
resolve https://github.com/Devsh-Graphics-Programming/Nabla/pull/900#…
AnastaZIuk 789bdbd
fix + optimize aabb vertex calc, includes
keptsecret 00af78c
changed debug_draw library target usage
keptsecret f36ee1a
some fixes to draw aabb
keptsecret cf2cb3e
removed commented out bit
keptsecret 0617056
create pipelineLayout util can takes mode, also create layout if miss…
keptsecret 9edb083
aabb local transform is 3x4, common draw param struct between single …
keptsecret f47e857
write instances data directly to streaming buffer mem
keptsecret 035d632
use single use cmdbuf to fill indices buffer
keptsecret 173995a
roll constructor params into own struct, fix assert in validation
keptsecret b5dd56b
adds a check against double mounting same archive
keptsecret 4965339
return false if the streaming buffer is too small
keptsecret 1a32499
some fixes to using/filling streaming buffer
keptsecret 18b5a4d
combined draw aabb shaders into unified, added precompile shaders to …
keptsecret f54d9b2
restore ifdef for mounting builtin resources, minor fixes to mounting
keptsecret 789e88b
simplified usage of streaming buffer alignments, flush unused memory …
keptsecret b7a03ee
fix calculating remaining instances bytes
keptsecret e8f4d00
check whether spirv exists
keptsecret 0dce95e
try to fit as much as possible even when fail to allocate, go down by…
keptsecret 5373611
update include paths for debug draw ext
AnastaZIuk 48eb604
fix mount logic for debug draw ext, perform tests on builtins on/off
AnastaZIuk 3e5d7cb
Fixed emulated vector template resolution ambiguity
Fletterio a75adfa
include `thmath.hlsl` in `functions.hlsl`
karimsayedre dc6ce11
init
GDBobby 2d9f2f6
i still need to reconcile mesh with compute. its based off graphics r…
GDBobby bf48d8e
graphics are stable - mesh prototype complete
GDBobby 49b2814
still bug catching in example
GDBobby 0842f40
lingering uncommitted changes
GDBobby ed1c527
i still need to reconcile mesh with compute. its based off graphics r…
GDBobby e4abc1f
graphics are stable - mesh prototype complete
GDBobby 7b15bf7
still bug catching in example
GDBobby d4dd56f
i was using dispatch for mesh shaders for some dumb reason (fixed)
GDBobby b591c5e
minor cleanup
GDBobby 4cc53a6
cleaning
GDBobby c86accb
indirect commands are simpler than i expected
GDBobby File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -84,7 +84,7 @@ | |
| url = [email protected]:Devsh-Graphics-Programming/Nabla-Continous-Integration-Python-Framework.git | ||
| [submodule "3rdparty/boost/superproject"] | ||
| path = 3rdparty/boost/superproject | ||
| url = ../boost.git | ||
| url = [email protected]:Devsh-Graphics-Programming/boost.git | ||
| [submodule "3rdparty/argparse"] | ||
| path = 3rdparty/argparse | ||
| url = [email protected]:p-ranav/argparse.git | ||
|
|
@@ -117,7 +117,7 @@ | |
| url = [email protected]:Devsh-Graphics-Programming/glm.git | ||
| [submodule "docker/msvc-winsdk"] | ||
| path = docker/msvc-winsdk | ||
| url = ../docker-nanoserver-msvc-winsdk | ||
| url = [email protected]:Devsh-Graphics-Programming/docker-nanoserver-msvc-winsdk.git | ||
| [submodule "3rdparty/gtl"] | ||
| path = 3rdparty/gtl | ||
| url = https://github.com/greg7mdp/gtl.git | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule dxc
updated
88 files
Submodule glm
updated
1153 files
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule compiler-explorer
updated
4 files
| +2 −5 | .github/workflows/main.yml | |
| +5 −3 | Dockerfile | |
| +34 −9 | README.md | |
| +42 −0 | nabla-glow.svg |
Large diffs are not rendered by default.
Oops, something went wrong.
Submodule examples_tests
updated
369 files
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -74,6 +74,8 @@ class MonoDeviceApplication : public virtual MonoSystemMonoLoggerApplication | |
|
|
||
| const auto supportedPreferredFormats = getPreferredDeviceFeatures().intersectWith(m_physicalDevice->getFeatures()); | ||
| params.featuresToEnable = getRequiredDeviceFeatures().unionWith(supportedPreferredFormats); | ||
| params.featuresToEnable.meshShader = true; | ||
| params.featuresToEnable.taskShader = true; | ||
|
Comment on lines
76
to
+78
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you can't add this to all examples, override the function like the raytracing examples in the mesh shader example |
||
|
|
||
| m_device = m_physicalDevice->createLogicalDevice(std::move(params)); | ||
| if (!m_device) | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| #ifndef _NBL_I_CPU_MESH_PIPELINE_H_INCLUDED_ | ||
| #define _NBL_I_CPU_MESH_PIPELINE_H_INCLUDED_ | ||
|
|
||
|
|
||
| #include "nbl/asset/IMeshPipeline.h" | ||
| #include "nbl/asset/ICPURenderpass.h" | ||
| #include "nbl/asset/ICPUPipeline.h" | ||
|
|
||
|
|
||
| namespace nbl::asset | ||
| { | ||
|
|
||
| class ICPUMeshPipeline final : public ICPUPipeline<IMeshPipeline<ICPUPipelineLayout,ICPURenderpass>> | ||
| { | ||
| using pipeline_base_t = IMeshPipeline<ICPUPipelineLayout, ICPURenderpass>; | ||
| using base_t = ICPUPipeline<pipeline_base_t>; | ||
|
|
||
| public: | ||
|
|
||
| static core::smart_refctd_ptr<ICPUMeshPipeline> create(ICPUPipelineLayout* layout, ICPURenderpass* renderpass = nullptr) | ||
| { | ||
| auto retval = new ICPUMeshPipeline(layout, renderpass); | ||
| return core::smart_refctd_ptr<ICPUMeshPipeline>(retval,core::dont_grab); | ||
| } | ||
|
|
||
| constexpr static inline auto AssetType = ET_MESH_PIPELINE; | ||
| inline E_TYPE getAssetType() const override { return AssetType; } | ||
|
|
||
| inline const SCachedCreationParams& getCachedCreationParams() const | ||
| { | ||
| return pipeline_base_t::getCachedCreationParams(); | ||
| } | ||
|
|
||
| inline SCachedCreationParams& getCachedCreationParams() | ||
| { | ||
| assert(isMutable()); | ||
| return m_params; | ||
| } | ||
|
|
||
| inline std::span<const SShaderSpecInfo> getSpecInfos(const hlsl::ShaderStage stage) const override final | ||
| { | ||
| switch (stage) { | ||
| case hlsl::ShaderStage::ESS_TASK: return { &m_specInfos[0], 1 }; | ||
| case hlsl::ShaderStage::ESS_MESH: return { &m_specInfos[1], 1 }; | ||
| case hlsl::ShaderStage::ESS_FRAGMENT: return { &m_specInfos[2], 1 }; | ||
| } | ||
| return {}; | ||
| } | ||
|
|
||
| inline std::span<SShaderSpecInfo> getSpecInfos(const hlsl::ShaderStage stage) | ||
| { | ||
| return base_t::getSpecInfos(stage); | ||
| } | ||
|
|
||
| SShaderSpecInfo* getSpecInfo(const hlsl::ShaderStage stage) | ||
| { | ||
| if (!isMutable()) return nullptr; | ||
| switch (stage) { | ||
| case hlsl::ShaderStage::ESS_TASK: return &m_specInfos[0]; | ||
| case hlsl::ShaderStage::ESS_MESH: return &m_specInfos[1]; | ||
| case hlsl::ShaderStage::ESS_FRAGMENT: return &m_specInfos[2]; | ||
| } | ||
| return nullptr; | ||
| } | ||
|
|
||
| const SShaderSpecInfo* getSpecInfo(const hlsl::ShaderStage stage) const | ||
| { | ||
| const auto stageIndex = stageToIndex(stage); | ||
| if (stageIndex != -1) | ||
| return &m_specInfos[stageIndex]; | ||
| return nullptr; | ||
| } | ||
|
|
||
| inline bool valid() const override | ||
| { | ||
| if (!m_layout) return false; | ||
| if (!m_layout->valid())return false; | ||
|
|
||
| // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkGraphicsPipelineCreateInfo.html#VUID-VkGraphicsPipelineCreateInfo-dynamicRendering-06576 | ||
| if (!m_renderpass || m_params.subpassIx >= m_renderpass->getSubpassCount()) return false; | ||
|
|
||
| core::bitflag<hlsl::ShaderStage> stagePresence = {}; | ||
| for (auto shader_i = 0u; shader_i < m_specInfos.size(); shader_i++) | ||
| { | ||
| const auto& info = m_specInfos[shader_i]; | ||
| if (info.shader) | ||
| stagePresence |= indexToStage(shader_i); | ||
| } | ||
| return hasRequiredStages(stagePresence); | ||
| } | ||
|
|
||
| protected: | ||
| using base_t::base_t; | ||
| virtual ~ICPUMeshPipeline() override = default; | ||
|
|
||
| std::array<SShaderSpecInfo, MESH_SHADER_STAGE_COUNT> m_specInfos; | ||
|
|
||
| private: | ||
| explicit ICPUMeshPipeline(ICPUPipelineLayout* layout, ICPURenderpass* renderpass) | ||
| : base_t(layout, {}, renderpass) | ||
| {} | ||
|
|
||
| static inline int8_t stageToIndex(const hlsl::ShaderStage stage) | ||
| { | ||
| const auto stageIx = hlsl::findLSB(stage); | ||
| if (stageIx < 0 || stageIx >= MESH_SHADER_STAGE_COUNT || hlsl::bitCount(stage)!=1) | ||
| return -1; | ||
| return stageIx; | ||
| } | ||
|
|
||
| static inline hlsl::ShaderStage indexToStage(const int8_t index) | ||
| { | ||
| switch (index) { | ||
| case 0: return hlsl::ShaderStage::ESS_TASK; | ||
| case 1: return hlsl::ShaderStage::ESS_MESH; | ||
| case 2: return hlsl::ShaderStage::ESS_FRAGMENT; | ||
| } | ||
| return hlsl::ShaderStage::ESS_UNKNOWN; | ||
| } | ||
|
|
||
| inline core::smart_refctd_ptr<base_t> clone_impl(core::smart_refctd_ptr<ICPUPipelineLayout>&& layout, uint32_t depth) const override final | ||
| { | ||
| auto* newPipeline = new ICPUMeshPipeline(layout.get(), m_renderpass.get()); | ||
| newPipeline->m_params = m_params; | ||
|
|
||
| for (auto specInfo_i = 0u; specInfo_i < m_specInfos.size(); specInfo_i++) | ||
| { | ||
| newPipeline->m_specInfos[specInfo_i] = m_specInfos[specInfo_i].clone(depth); | ||
| } | ||
|
|
||
| return core::smart_refctd_ptr<base_t>(newPipeline, core::dont_grab); | ||
| } | ||
|
|
||
| inline void visitDependents_impl(std::function<bool(const IAsset*)> visit) const override | ||
| { | ||
| if (!visit(m_layout.get())) return; | ||
| if (!visit(m_renderpass.get())) return; | ||
| for (const auto& info : m_specInfos) | ||
| if (!visit(info.shader.get())) return; | ||
| } | ||
| }; | ||
|
|
||
| } | ||
|
|
||
| #endif |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| #ifndef _NBL_ASSET_I_MESH_PIPELINE_H_INCLUDED_ | ||
| #define _NBL_ASSET_I_MESH_PIPELINE_H_INCLUDED_ | ||
|
|
||
| #include "nbl/asset/IShader.h" | ||
| #include "nbl/asset/RasterizationStates.h" | ||
| #include "nbl/asset/IPipeline.h" | ||
|
|
||
|
|
||
| namespace nbl::asset { | ||
| class IMeshPipelineBase : public virtual core::IReferenceCounted { | ||
| public: | ||
| constexpr static inline uint8_t MESH_SHADER_STAGE_COUNT = 3u; //i dont know what this is going to be used for yet, might be redundant | ||
| struct SCachedCreationParams final { | ||
| SRasterizationParams rasterization = {}; | ||
| SBlendParams blend = {}; | ||
| uint32_t subpassIx = 0u; //this subpass stuff is eluding me rn. i might just need to crack open the vulkan documentation | ||
| uint8_t requireFullSubgroups = false; | ||
| }; | ||
|
|
||
| }; | ||
|
|
||
| template<typename PipelineLayoutType, typename RenderpassType> | ||
| class IMeshPipeline : public IPipeline<PipelineLayoutType>, public IMeshPipelineBase { | ||
| protected: | ||
| using renderpass_t = RenderpassType; | ||
| //using base_creation_params_t = IPipeline<PipelineLayoutType>;//compute uses this, idk if its necessary yet | ||
| public: | ||
|
|
||
| static inline bool hasRequiredStages(const core::bitflag<hlsl::ShaderStage>& stagePresence) | ||
| { | ||
| // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkGraphicsPipelineCreateInfo.html#VUID-VkGraphicsPipelineCreateInfo-stage-02096 | ||
| if (!stagePresence.hasFlags(hlsl::ShaderStage::ESS_MESH)) { | ||
| return false; | ||
| } | ||
| //i dont quite understand why igraphicspipeline doesnt require a fragment shader. is it not required by vulkan? | ||
| if (!stagePresence.hasFlags(hlsl::ShaderStage::ESS_FRAGMENT)) { | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| inline const SCachedCreationParams& getCachedCreationParams() const { return m_params; } | ||
|
|
||
| protected: | ||
| explicit IMeshPipeline(PipelineLayoutType* layout, const SCachedCreationParams& cachedParams, renderpass_t* renderpass) : | ||
| IPipeline<PipelineLayoutType>(core::smart_refctd_ptr<PipelineLayoutType>(layout)), | ||
| m_params(cachedParams), m_renderpass(core::smart_refctd_ptr<renderpass_t>(renderpass)) | ||
| { | ||
| } | ||
|
|
||
| SCachedCreationParams m_params = {}; | ||
| core::smart_refctd_ptr<renderpass_t> m_renderpass = nullptr; | ||
| }; | ||
|
|
||
| } | ||
|
|
||
|
|
||
| #endif |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
as @AnastaZIuk will tell you, this needs to stay as it was, you need to for the submodules yourself as well.
Its important the submodules are relative.