From 5a54530a48939f8dd81307eb3c7afce1714ba895 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Fri, 11 Apr 2025 09:54:09 +0200 Subject: [PATCH] Reintroducing type parameters for vertex data --- res/shaders/lib/Material.slang | 11 ++++++----- res/shaders/lib/StaticMeshVertexData.slang | 4 +--- res/shaders/lib/VertexData.slang | 10 ++++++---- res/shaders/raytracing/ClosestHit.slang | 2 +- src/Editor/Asset/EnvironmentLoader.cpp | 11 ++++++++++- src/Engine/Graphics/RenderPass/RayTracingPass.cpp | 1 + src/Engine/Graphics/Shader.cpp | 2 +- src/Engine/Graphics/Vulkan/Command.cpp | 2 ++ src/Engine/Graphics/slang-compile.cpp | 2 +- src/Engine/Material/Material.cpp | 4 ++-- 10 files changed, 31 insertions(+), 18 deletions(-) diff --git a/res/shaders/lib/Material.slang b/res/shaders/lib/Material.slang index 6669f0a..0653a71 100644 --- a/res/shaders/lib/Material.slang +++ b/res/shaders/lib/Material.slang @@ -1,12 +1,13 @@ import Common; import MaterialParameter; import Scene; +import LightEnv; -//interface IMaterial -//{ -// associatedtype BRDF: IBRDF; -// static BRDF prepare(MaterialParameter input); -//}; +interface IMaterial +{ + associatedtype BRDF: IBRDF; + BRDF prepare(MaterialParameter input); +}; struct MaterialResources { Texture2D textureArray[512]; diff --git a/res/shaders/lib/StaticMeshVertexData.slang b/res/shaders/lib/StaticMeshVertexData.slang index eee80af..2007449 100644 --- a/res/shaders/lib/StaticMeshVertexData.slang +++ b/res/shaders/lib/StaticMeshVertexData.slang @@ -2,7 +2,7 @@ import Common; import VertexData; import MaterialParameter; -struct StaticMeshVertexData +struct StaticMeshVertexData : IVertexData { float uint16ToFloat(uint16_t value) { @@ -34,5 +34,3 @@ struct StaticMeshVertexData StructuredBuffer color; StructuredBuffer texCoords[MAX_TEXCOORDS]; }; -layout(set=1) -ParameterBlock pVertexData; diff --git a/res/shaders/lib/VertexData.slang b/res/shaders/lib/VertexData.slang index f000728..1fddec4 100644 --- a/res/shaders/lib/VertexData.slang +++ b/res/shaders/lib/VertexData.slang @@ -6,7 +6,9 @@ struct VertexInput uint instanceId: SV_InstanceID; } -//interface IVertexData -//{ -// VertexAttributes getAttributes(uint index); -//}; +interface IVertexData +{ + VertexAttributes getAttributes(uint index); +}; +layout(set = 1) +ParameterBlock pVertexData; \ No newline at end of file diff --git a/res/shaders/raytracing/ClosestHit.slang b/res/shaders/raytracing/ClosestHit.slang index e0c71d4..6bb43aa 100644 --- a/res/shaders/raytracing/ClosestHit.slang +++ b/res/shaders/raytracing/ClosestHit.slang @@ -3,7 +3,7 @@ import MaterialParameter; import LightEnv; import Scene; import RayTracingData; -import StaticMeshVertexData; +import VertexData; import Material; import MATERIAL_FILE_NAME; diff --git a/src/Editor/Asset/EnvironmentLoader.cpp b/src/Editor/Asset/EnvironmentLoader.cpp index 93efd20..a0c4e1e 100644 --- a/src/Editor/Asset/EnvironmentLoader.cpp +++ b/src/Editor/Asset/EnvironmentLoader.cpp @@ -133,7 +133,16 @@ void EnvironmentLoader::import(EnvironmentImportArgs args, PEnvironmentMapAsset Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_DONT_CARE, Gfx::SE_ATTACHMENT_STORE_OP_STORE)}, }, - {}, + { + Gfx::SubPassDependency{ + .srcSubpass = 0, + .dstSubpass = ~0U, + .srcStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStage = Gfx::SE_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .srcAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstAccess = Gfx::SE_ACCESS_SHADER_READ_BIT, + } + }, URect{ .size = {SOURCE_RESOLUTION, SOURCE_RESOLUTION}, .offset = {0, 0}, diff --git a/src/Engine/Graphics/RenderPass/RayTracingPass.cpp b/src/Engine/Graphics/RenderPass/RayTracingPass.cpp index c2587c8..10406f4 100644 --- a/src/Engine/Graphics/RenderPass/RayTracingPass.cpp +++ b/src/Engine/Graphics/RenderPass/RayTracingPass.cpp @@ -214,6 +214,7 @@ void RayTracingPass::publishOutputs() { .name = "RayGenMiss", .modules = {"RayGen", "AnyHit", "Miss"}, .entryPoints = {{"raygen", "RayGen"}, {"anyhit", "AnyHit"}, {"miss", "Miss"}}, + .typeParameter = {{"IVertexData", "StaticMeshVertexData"}}, .defines = {{"RAY_TRACING", "1"}}, .rootSignature = pipelineLayout, }; diff --git a/src/Engine/Graphics/Shader.cpp b/src/Engine/Graphics/Shader.cpp index 7c1c762..898370d 100644 --- a/src/Engine/Graphics/Shader.cpp +++ b/src/Engine/Graphics/Shader.cpp @@ -123,7 +123,7 @@ void ShaderCompiler::createShaders(ShaderPermutation permutation, Gfx::OPipeline { createInfo.dumpIntermediate = true; } - //createInfo.typeParameter.add({Pair("IVertexData", permutation.vertexDataName)}); + createInfo.typeParameter.add({Pair("IVertexData", permutation.vertexDataName)}); createInfo.modules.add(permutation.vertexDataName); //createInfo.dumpIntermediate = true; diff --git a/src/Engine/Graphics/Vulkan/Command.cpp b/src/Engine/Graphics/Vulkan/Command.cpp index dd96e4c..891825a 100644 --- a/src/Engine/Graphics/Vulkan/Command.cpp +++ b/src/Engine/Graphics/Vulkan/Command.cpp @@ -344,6 +344,8 @@ void RenderCommand::drawIndexed(uint32 indexCount, uint32 instanceCount, int32 f } void RenderCommand::drawMesh(uint32 groupX, uint32 groupY, uint32 groupZ) { assert(threadId == std::this_thread::get_id()); + if (groupX * groupY * groupZ == 0) // any dimension is 0 + return; vkCmdDrawMeshTasksEXT(handle, groupX, groupY, groupZ); } diff --git a/src/Engine/Graphics/slang-compile.cpp b/src/Engine/Graphics/slang-compile.cpp index dd355e2..d45f096 100644 --- a/src/Engine/Graphics/slang-compile.cpp +++ b/src/Engine/Graphics/slang-compile.cpp @@ -147,12 +147,12 @@ void Seele::beginCompilation(const ShaderCompilationInfo& info, SlangCompileTarg // workaround if (info.name == "RayGenMiss") { - layout->addMapping("pVertexData", 1); layout->addMapping("pScene", 2); layout->addMapping("pLightEnv", 3); layout->addMapping("pResources", 4); layout->addMapping("pRayTracingParams", 5); } + layout->addMapping("pVertexData", 1); // layout->addMapping("pWaterMaterial", 1); } diff --git a/src/Engine/Material/Material.cpp b/src/Engine/Material/Material.cpp index 9001d87..f9255bd 100644 --- a/src/Engine/Material/Material.cpp +++ b/src/Engine/Material/Material.cpp @@ -159,9 +159,9 @@ void Material::load(ArchiveBuffer& buffer) { void Material::compile() { std::ofstream codeStream("./shaders/generated/" + materialName + ".slang"); codeStream << "import MaterialParameter;\n"; - codeStream << "import LightEnv;\n"; codeStream << "import Material;\n"; - codeStream << "struct Material{\n"; + codeStream << "import LightEnv;\n"; + codeStream << "struct Material : IMaterial{\n"; codeStream << "\ttypedef " << brdf.profile << " BRDF;\n"; codeStream << "\tstatic " << brdf.profile << " prepare(MaterialParameter input) {\n"; codeStream << "\t\t" << brdf.profile << " result;\n";