diff --git a/CMakeLists.txt b/CMakeLists.txt index c0645ae..d9837b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,8 @@ add_subdirectory(src/) if(WIN32) add_custom_target(dll_copy ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_ROOT}/slang.dll $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_ROOT}/slang-glslang.dll $ COMMAND_EXPAND_LISTS DEPENDS Editor) elseif(APPLE) diff --git a/external/slang b/external/slang index 8362c2d..484c1e6 160000 --- a/external/slang +++ b/external/slang @@ -1 +1 @@ -Subproject commit 8362c2d46e2da0c20fbd3daf511ccdf425f9a1f0 +Subproject commit 484c1e618dddf586360c03f90e6c27ece1065acd diff --git a/res/shaders/LightCulling.slang b/res/shaders/LightCulling.slang index 0b55f09..bcc1b48 100644 --- a/res/shaders/LightCulling.slang +++ b/res/shaders/LightCulling.slang @@ -22,7 +22,7 @@ struct CullingParams RWTexture2D oLightGrid; RWTexture2D tLightGrid; }; -layout(set=2) + ParameterBlock pCullingParams; // Debug //Texture2D lightCountHeatMap; diff --git a/res/shaders/MeshletBasePass.slang b/res/shaders/MeshletBasePass.slang index 9c1da09..d709e3a 100644 --- a/res/shaders/MeshletBasePass.slang +++ b/res/shaders/MeshletBasePass.slang @@ -65,12 +65,6 @@ struct PrimitiveAttributes uint cull: SV_CullPrimitive; }; -uint unpackPrimitiveIndices(uint index) -{ - uint32_t packed = pScene.primitiveIndices[index / 4]; - return (packed >> (index % 4)) & 0xff; -} - [numthreads(MESH_GROUP_SIZE, 1, 1)] [outputtopology("triangle")] [shader("mesh")] diff --git a/res/shaders/lib/Common.slang b/res/shaders/lib/Common.slang index 7bfaad9..4ff4d90 100644 --- a/res/shaders/lib/Common.slang +++ b/res/shaders/lib/Common.slang @@ -10,7 +10,7 @@ struct ViewParameter float4 cameraPos_WS; float2 screenDimensions; } -uniform ParameterBlock pViewParams; +ParameterBlock pViewParams; float4 clipToView(float4 clip) { diff --git a/res/shaders/lib/DispatchParams.slang b/res/shaders/lib/DispatchParams.slang index c8772e7..e3a00a0 100644 --- a/res/shaders/lib/DispatchParams.slang +++ b/res/shaders/lib/DispatchParams.slang @@ -8,5 +8,4 @@ struct DispatchParams uint pad1; RWStructuredBuffer frustums; } -layout(set=1) ParameterBlock pDispatchParams; \ No newline at end of file diff --git a/res/shaders/lib/LightEnv.slang b/res/shaders/lib/LightEnv.slang index 608ef05..23509fb 100644 --- a/res/shaders/lib/LightEnv.slang +++ b/res/shaders/lib/LightEnv.slang @@ -63,5 +63,4 @@ struct LightEnv StructuredBuffer pointLights; uint numPointLights; }; -layout(set=3) ParameterBlock pLightEnv; diff --git a/res/shaders/lib/Material.slang b/res/shaders/lib/Material.slang index 7c15a9c..da0c53c 100644 --- a/res/shaders/lib/Material.slang +++ b/res/shaders/lib/Material.slang @@ -8,5 +8,4 @@ interface IMaterial BRDF prepare(MaterialParameter input); }; -layout(set=4) ParameterBlock pMaterial; diff --git a/res/shaders/lib/Scene.slang b/res/shaders/lib/Scene.slang index 8556b68..914eea5 100644 --- a/res/shaders/lib/Scene.slang +++ b/res/shaders/lib/Scene.slang @@ -38,9 +38,8 @@ struct Scene StructuredBuffer instances; StructuredBuffer meshData; StructuredBuffer meshletInfos; - // uint8_t is not valid in DXIL - StructuredBuffer primitiveIndices; + StructuredBuffer primitiveIndices; StructuredBuffer vertexIndices; }; -uniform ParameterBlock pScene; +ParameterBlock pScene; diff --git a/src/Engine/Graphics/Descriptor.h b/src/Engine/Graphics/Descriptor.h index 2ac0772..185cd77 100644 --- a/src/Engine/Graphics/Descriptor.h +++ b/src/Engine/Graphics/Descriptor.h @@ -8,8 +8,8 @@ namespace Gfx { struct DescriptorBinding { uint32 binding = 0; SeDescriptorType descriptorType = SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - SeImageViewType textureType; - uint32 descriptorCount = 0x7fff; + SeImageViewType textureType = SE_IMAGE_VIEW_TYPE_2D; + uint32 descriptorCount = 1; SeDescriptorBindingFlags bindingFlags = 0; SeShaderStageFlags shaderStages = SE_SHADER_STAGE_ALL; Gfx::SeDescriptorAccessTypeFlags access = SE_DESCRIPTOR_ACCESS_READ_ONLY_BIT; diff --git a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp index 2e7aea1..263e322 100644 --- a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp +++ b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp @@ -123,13 +123,6 @@ void LightCullingPass::publishOutputs() cullingLayout->addDescriptorLayout(dispatchParamsLayout); cullingLayout->addDescriptorLayout(cullingDescriptorLayout); cullingLayout->addDescriptorLayout(lightEnv->getDescriptorLayout()); - Map mapping; - mapping["pViewParams"] = 1; - mapping["pDispatchParams"] = 2; - mapping["pCullingParams"] = 0; - mapping["pLightEnv"] = 3; - cullingLayout->addMapping(mapping); - cullingLayout->create(); ShaderCreateInfo createInfo = { .name = "Culling", @@ -139,6 +132,7 @@ void LightCullingPass::publishOutputs() .rootSignature = cullingLayout, }; cullingShader = graphics->createComputeShader(createInfo); + cullingLayout->create(); Gfx::ComputePipelineCreateInfo pipelineInfo; pipelineInfo.computeShader = cullingShader; @@ -215,15 +209,9 @@ void LightCullingPass::setupFrustums() dispatchParamsLayout = graphics->createDescriptorLayout("pDispatchParams"); dispatchParamsLayout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 0, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER, }); dispatchParamsLayout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 1, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER, .access = Gfx::SE_DESCRIPTOR_ACCESS_WRITE_ONLY_BIT }); - dispatchParamsLayout->create(); frustumLayout = graphics->createPipelineLayout("FrustumLayout"); frustumLayout->addDescriptorLayout(viewParamsLayout); frustumLayout->addDescriptorLayout(dispatchParamsLayout); - Map mapping; - mapping["pViewParams"] = 0; - mapping["pDispatchParams"] = 1; - frustumLayout->addMapping(mapping); - frustumLayout->create(); ShaderCreateInfo createInfo = { .name = "Frustum", .mainModule = "ComputeFrustums", @@ -233,6 +221,9 @@ void LightCullingPass::setupFrustums() }; std::cout << "Compiling frustumShader" << std::endl; frustumShader = graphics->createComputeShader(createInfo); + // Have to compile shader before finalizing layout as parameters get mapped later + frustumLayout->create(); + dispatchParamsLayout->create(); Gfx::ComputePipelineCreateInfo pipelineInfo; pipelineInfo.computeShader = frustumShader; diff --git a/src/Engine/Graphics/Shader.cpp b/src/Engine/Graphics/Shader.cpp index da5b592..1991a1c 100644 --- a/src/Engine/Graphics/Shader.cpp +++ b/src/Engine/Graphics/Shader.cpp @@ -81,14 +81,6 @@ void ShaderCompiler::compile() layout->addDescriptorLayout(vd->getVertexDataLayout()); layout->addDescriptorLayout(vd->getInstanceDataLayout()); layout->addDescriptorLayout(mat->getDescriptorLayout()); - Map mapping; - mapping["pLightCullingData"] = 1; - mapping["pMaterial"] = 2; - mapping["pViewParams"] = 3; - mapping["pVertexData"] = 4; - mapping["pScene"] = 5; - mapping["pLightEnv"] = 6; - layout->addMapping(mapping); permutation.setMaterial(mat->getName()); createShaders(permutation, std::move(layout)); } @@ -98,11 +90,6 @@ void ShaderCompiler::compile() OPipelineLayout layout = graphics->createPipelineLayout(pass.baseLayout->getName(), pass.baseLayout); layout->addDescriptorLayout(vd->getVertexDataLayout()); layout->addDescriptorLayout(vd->getInstanceDataLayout()); - Map mapping; - mapping["pViewParams"] = 1; - mapping["pVertexData"] = 2; - mapping["pScene"] = 3; - layout->addMapping(mapping); createShaders(permutation, std::move(layout)); } } diff --git a/src/Engine/Graphics/Vulkan/Shader.cpp b/src/Engine/Graphics/Vulkan/Shader.cpp index 031f763..755b2b8 100644 --- a/src/Engine/Graphics/Vulkan/Shader.cpp +++ b/src/Engine/Graphics/Vulkan/Shader.cpp @@ -28,11 +28,11 @@ uint32 Seele::Vulkan::Shader::getShaderHash() const return hash; } -void Shader::create(const ShaderCreateInfo& createInfo) +void Shader::create(ShaderCreateInfo createInfo) { Map paramMapping; Slang::ComPtr kernelBlob = generateShader(createInfo, SLANG_SPIRV, paramMapping); - const_cast(createInfo.rootSignature.getHandle())->addMapping(paramMapping); + createInfo.rootSignature->addMapping(paramMapping); VkShaderModuleCreateInfo moduleInfo = { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, @@ -44,16 +44,4 @@ void Shader::create(const ShaderCreateInfo& createInfo) VK_CHECK(vkCreateShaderModule(graphics->getDevice(), &moduleInfo, nullptr, &module)); hash = CRC::Calculate(kernelBlob->getBufferPointer(), kernelBlob->getBufferSize(), CRC::CRC_32(), hash); - /* - specializedComponent->getEntryPointCode( - 0, - 1, - kernelBlob.writeRef(), - diagnostics.writeRef() - ); - CHECK_DIAGNOSTICS(); - std::ofstream shaderStream(createInfo.name + createInfo.entryPoint + ".glsl"); - shaderStream << (char*)kernelBlob->getBufferPointer(); - shaderStream.close(); - */ } \ No newline at end of file diff --git a/src/Engine/Graphics/Vulkan/Shader.h b/src/Engine/Graphics/Vulkan/Shader.h index 9998647..e0e1ba5 100644 --- a/src/Engine/Graphics/Vulkan/Shader.h +++ b/src/Engine/Graphics/Vulkan/Shader.h @@ -15,7 +15,7 @@ public: Shader(PGraphics graphics, VkShaderStageFlags stage); virtual ~Shader(); - void create(const ShaderCreateInfo& createInfo); + void create(ShaderCreateInfo createInfo); constexpr VkShaderModule getModuleHandle() const { diff --git a/src/Engine/Graphics/slang-compile.cpp b/src/Engine/Graphics/slang-compile.cpp index 8fadd44..ac0264a 100644 --- a/src/Engine/Graphics/slang-compile.cpp +++ b/src/Engine/Graphics/slang-compile.cpp @@ -16,13 +16,17 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create } slang::SessionDesc sessionDesc; sessionDesc.flags = 0; - slang::CompilerOptionEntry option; - option.name = slang::CompilerOptionName::IgnoreCapabilities; - option.value = slang::CompilerOptionValue(); - option.value.kind = slang::CompilerOptionValueKind::Int; - option.value.intValue0 = 1; - sessionDesc.compilerOptionEntries = &option; - sessionDesc.compilerOptionEntryCount = 1; + slang::CompilerOptionEntry option[2]; + option[0].name = slang::CompilerOptionName::DumpIntermediates; + option[0].value = slang::CompilerOptionValue(); + option[0].value.kind = slang::CompilerOptionValueKind::Int; + option[0].value.intValue0 = 1; + option[1].name = slang::CompilerOptionName::IgnoreCapabilities; + option[1].value = slang::CompilerOptionValue(); + option[1].value.kind = slang::CompilerOptionValueKind::Int; + option[1].value.intValue0 = 1; + sessionDesc.compilerOptionEntries = option; + sessionDesc.compilerOptionEntryCount = 2; sessionDesc.defaultMatrixLayoutMode = SLANG_MATRIX_LAYOUT_COLUMN_MAJOR; Array macros; for(const auto& [key, val] : createInfo.defines) @@ -37,8 +41,8 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create slang::TargetDesc targetDesc; targetDesc.profile = globalSession->findProfile("sm_6_6"); targetDesc.format = target; - targetDesc.compilerOptionEntryCount = 1; - targetDesc.compilerOptionEntries = &option; + targetDesc.compilerOptionEntryCount = 2; + targetDesc.compilerOptionEntries = option; sessionDesc.targetCount = 1; sessionDesc.targets = &targetDesc; StaticArray searchPaths = {"shaders/", "shaders/lib/", "shaders/generated/"}; @@ -99,16 +103,11 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create CHECK_DIAGNOSTICS(); slang::ProgramLayout* signature = specializedComponent->getLayout(0, diagnostics.writeRef()); CHECK_DIAGNOSTICS(); - auto entry = signature->findEntryPointByName(createInfo.entryPoint.c_str()); - uint32 offset = 0; - if(target == SLANG_DXIL) - { - offset = 1;// idk why - } for(size_t i = 0; i < signature->getParameterCount(); ++i) { auto param = signature->getParameterByIndex(i); - paramMapping[param->getName()] = offset++; + paramMapping[param->getName()] = param->getBindingIndex(); + std::cout << "Parameter " << param->getName() << " index " << param->getBindingIndex() << std::endl; } return kernelBlob; }