diff --git a/res/shaders/RayTracing.slang b/res/shaders/RayTracing.slang new file mode 100644 index 0000000..e69de29 diff --git a/src/Engine/Graphics/Graphics.h b/src/Engine/Graphics/Graphics.h index 605651e..a8ddf27 100644 --- a/src/Engine/Graphics/Graphics.h +++ b/src/Engine/Graphics/Graphics.h @@ -2,7 +2,6 @@ #include "Containers/Array.h" #include "Initializer.h" #include "MinimalEngine.h" -#include "Query.h" #include "RenderTarget.h" #include "Resources.h" @@ -32,8 +31,15 @@ DECLARE_REF(ComputePipeline) DECLARE_REF(RenderCommand) DECLARE_REF(ComputeCommand) DECLARE_REF(OcclusionQuery) +DECLARE_REF(PipelineStatisticsQuery) DECLARE_REF(BottomLevelAS) DECLARE_REF(TopLevelAS) +DECLARE_REF(RayGenShader) +DECLARE_REF(AnyHitShader) +DECLARE_REF(ClosestHitShader) +DECLARE_REF(MissShader) +DECLARE_REF(IntersectionShader) +DECLARE_REF(CallableShader) class Graphics { public: Graphics(); @@ -93,6 +99,12 @@ class Graphics { virtual OBottomLevelAS createBottomLevelAccelerationStructure(const BottomLevelASCreateInfo& createInfo) = 0; virtual OTopLevelAS createTopLevelAccelerationStructure(const TopLevelASCreateInfo& createInfo) = 0; + virtual ORayGenShader createRayGenShader(const ShaderCreateInfo& createInfo) = 0; + virtual OAnyHitShader createAnyHitShader(const ShaderCreateInfo& createInfo) = 0; + virtual OClosestHitShader createClosestHitShader(const ShaderCreateInfo& createInfo) = 0; + virtual OMissShader createMissShader(const ShaderCreateInfo& createInfo) = 0; + virtual OIntersectionShader createIntersectionShader(const ShaderCreateInfo& createInfo) = 0; + virtual OCallableShader createCallableShader(const ShaderCreateInfo& createInfo) = 0; protected: QueueFamilyMapping queueMapping; OShaderCompiler shaderCompiler; diff --git a/src/Engine/Graphics/Initializer.h b/src/Engine/Graphics/Initializer.h index ec5d21b..3aef7dc 100644 --- a/src/Engine/Graphics/Initializer.h +++ b/src/Engine/Graphics/Initializer.h @@ -224,7 +224,15 @@ struct ComputePipelineCreateInfo { Gfx::PComputeShader computeShader = nullptr; Gfx::PPipelineLayout pipelineLayout = nullptr; }; -DECLARE_REF(ShaderBuffer) +struct RayTracingPipelineCreateInfo { + PPipelineLayout pipelineLayout = nullptr; + PRayGenShader rayGenShader = nullptr; + Array closestHitShaders; + Array anyHitShaders; + Array intersectionShaders; + Array missShaders; + Array callableShaders; +}; struct BottomLevelASCreateInfo { PMesh mesh; }; diff --git a/src/Engine/Graphics/Shader.h b/src/Engine/Graphics/Shader.h index 3385a0d..46be4f8 100644 --- a/src/Engine/Graphics/Shader.h +++ b/src/Engine/Graphics/Shader.h @@ -71,6 +71,13 @@ class MissShader { }; DEFINE_REF(MissShader) +class IntersectionShader { + public: + IntersectionShader() {} + virtual ~IntersectionShader() {} +}; +DEFINE_REF(IntersectionShader) + class CallableShader { public: CallableShader() {} diff --git a/src/Engine/Graphics/Vulkan/Command.cpp b/src/Engine/Graphics/Vulkan/Command.cpp index 407dfa9..401b53b 100644 --- a/src/Engine/Graphics/Vulkan/Command.cpp +++ b/src/Engine/Graphics/Vulkan/Command.cpp @@ -231,6 +231,7 @@ void RenderCommand::bindPipeline(Gfx::PGraphicsPipeline gfxPipeline) { pipeline = gfxPipeline.cast(); pipeline->bind(handle); } + void RenderCommand::bindDescriptor(Gfx::PDescriptorSet descriptorSet, Array dynamicOffsets) { assert(threadId == std::this_thread::get_id()); auto descriptor = descriptorSet.cast(); @@ -268,6 +269,7 @@ void RenderCommand::bindDescriptor(const Array& descriptorS dynamicOffsets.size(), dynamicOffsets.data()); delete[] sets; } + void RenderCommand::bindVertexBuffer(const Array& streams) { assert(threadId == std::this_thread::get_id()); Array buffers(streams.size()); @@ -281,6 +283,7 @@ void RenderCommand::bindVertexBuffer(const Array& streams) { }; vkCmdBindVertexBuffers(handle, 0, (uint32)streams.size(), buffers.data(), offsets.data()); } + void RenderCommand::bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) { assert(threadId == std::this_thread::get_id()); PIndexBuffer buf = indexBuffer.cast(); @@ -313,6 +316,8 @@ void RenderCommand::drawMeshIndirect(Gfx::PShaderBuffer buffer, uint64 offset, u vkCmdDrawMeshTasksIndirectEXT(handle, buffer.cast()->getHandle(), offset, drawCount, stride); } +void RenderCommand::traceRays() { vkCmdTraceRaysKHR(handle, ); } + ComputeCommand::ComputeCommand(PGraphics graphics, VkCommandPool cmdPool) : graphics(graphics), owner(cmdPool) { VkCommandBufferAllocateInfo allocInfo = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, diff --git a/src/Engine/Graphics/Vulkan/Command.h b/src/Engine/Graphics/Vulkan/Command.h index 51265fe..bef3865 100644 --- a/src/Engine/Graphics/Vulkan/Command.h +++ b/src/Engine/Graphics/Vulkan/Command.h @@ -86,6 +86,8 @@ class RenderCommand : public Gfx::RenderCommand { virtual void drawMesh(uint32 groupX, uint32 groupY, uint32 groupZ) override; virtual void drawMeshIndirect(Gfx::PShaderBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride) override; + virtual void traceRays(); + private: PGraphicsPipeline pipeline; bool ready; diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index 232a65e..9d5b328 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -319,6 +319,42 @@ Gfx::OTopLevelAS Graphics::createTopLevelAccelerationStructure(const Gfx::TopLev return new TopLevelAS(this, createInfo); } +Gfx::ORayGenShader Graphics::createRayGenShader(const ShaderCreateInfo& createInfo) { + ORayGenShader shader = new RayGenShader(this); + shader->create(createInfo); + return shader; +} + +Gfx::OAnyHitShader Graphics::createAnyHitShader(const ShaderCreateInfo& createInfo) { + OAnyHitShader shader = new AnyHitShader(this); + shader->create(createInfo); + return shader; +} + +Gfx::OClosestHitShader Graphics::createClosestHitShader(const ShaderCreateInfo& createInfo) { + OClosestHitShader shader = new ClosestHitShader(this); + shader->create(createInfo); + return shader; +} + +Gfx::OMissShader Graphics::createMissShader(const ShaderCreateInfo& createInfo) { + OMissShader shader = new MissShader(this); + shader->create(createInfo); + return shader; +} + +Gfx::OIntersectionShader Graphics::createIntersectionShader(const ShaderCreateInfo& createInfo) { + OIntersectionShader shader = new IntersectionShader(this); + shader->create(createInfo); + return shader; +} + +Gfx::OCallableShader Graphics::createCallableShader(const ShaderCreateInfo& createInfo) { + OCallableShader shader = new CallableShader(this); + shader->create(createInfo); + return shader; +} + PCommandPool Graphics::getQueueCommands(Gfx::QueueType queueType) { switch (queueType) { case Gfx::QueueType::GRAPHICS: diff --git a/src/Engine/Graphics/Vulkan/Graphics.h b/src/Engine/Graphics/Vulkan/Graphics.h index 69002fd..879d446 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.h +++ b/src/Engine/Graphics/Vulkan/Graphics.h @@ -77,6 +77,13 @@ class Graphics : public Gfx::Graphics { virtual Gfx::OBottomLevelAS createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) override; virtual Gfx::OTopLevelAS createTopLevelAccelerationStructure(const Gfx::TopLevelASCreateInfo& createInfo) override; + virtual Gfx::ORayGenShader createRayGenShader(const ShaderCreateInfo& createInfo) override; + virtual Gfx::OAnyHitShader createAnyHitShader(const ShaderCreateInfo& createInfo) override; + virtual Gfx::OClosestHitShader createClosestHitShader(const ShaderCreateInfo& createInfo) override; + virtual Gfx::OMissShader createMissShader(const ShaderCreateInfo& createInfo) override; + virtual Gfx::OIntersectionShader createIntersectionShader(const ShaderCreateInfo& createInfo) override; + virtual Gfx::OCallableShader createCallableShader(const ShaderCreateInfo& createInfo) override; + protected: Array getRequiredExtensions(); void initInstance(GraphicsInitializer initInfo); diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.cpp b/src/Engine/Graphics/Vulkan/PipelineCache.cpp index 6cd64fc..3dc0690 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/PipelineCache.cpp @@ -464,4 +464,8 @@ PComputePipeline PipelineCache::createPipeline(Gfx::ComputePipelineCreateInfo co PComputePipeline result = pipeline; graphicsPipelines[hash] = std::move(pipeline); return result; -} \ No newline at end of file +} + +PRayTracingPipeline PipelineCache::createPipeline(Gfx::RayTracingPipelineCreateInfo createInfo) { + +} diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.h b/src/Engine/Graphics/Vulkan/PipelineCache.h index 88a1a42..8f3816b 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.h +++ b/src/Engine/Graphics/Vulkan/PipelineCache.h @@ -1,5 +1,6 @@ #pragma once #include "Pipeline.h" +#include "RayTracing.h" namespace Seele { namespace Vulkan { @@ -11,6 +12,8 @@ class PipelineCache { PGraphicsPipeline createPipeline(Gfx::MeshPipelineCreateInfo createInfo); PComputePipeline createPipeline(Gfx::ComputePipelineCreateInfo createInfo); + PRayTracingPipeline createPipeline(Gfx::RayTracingPipelineCreateInfo createInfo); + private: Map graphicsPipelines; Map computePipelines; diff --git a/src/Engine/Graphics/Vulkan/RayTracing.h b/src/Engine/Graphics/Vulkan/RayTracing.h index 9b5437b..55d6f27 100644 --- a/src/Engine/Graphics/Vulkan/RayTracing.h +++ b/src/Engine/Graphics/Vulkan/RayTracing.h @@ -29,5 +29,12 @@ class TopLevelAS : public Gfx::TopLevelAS { VkAccelerationStructureKHR handle; }; DEFINE_REF(TopLevelAS) + +class RayTracingPipeline : public Gfx::RayTracingPipeline +{ + public: + private: +}; +DEFINE_REF(RayTracingPipeline) } // namespace Vulkan } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Graphics/Vulkan/Shader.h b/src/Engine/Graphics/Vulkan/Shader.h index 8eaf3dc..1c131f6 100644 --- a/src/Engine/Graphics/Vulkan/Shader.h +++ b/src/Engine/Graphics/Vulkan/Shader.h @@ -47,5 +47,20 @@ DEFINE_REF(FragmentShader) DEFINE_REF(ComputeShader) DEFINE_REF(TaskShader) DEFINE_REF(MeshShader) + +// Ray Tracing +using RayGenShader = ShaderBase; +using AnyHitShader = ShaderBase; +using ClosestHitShader = ShaderBase; +using MissShader = ShaderBase; +using IntersectionShader = ShaderBase; +using CallableShader = ShaderBase; + +DEFINE_REF(RayGenShader) +DEFINE_REF(AnyHitShader) +DEFINE_REF(ClosestHitShader) +DEFINE_REF(MissShader) +DEFINE_REF(IntersectionShader) +DEFINE_REF(CallableShader) } // namespace Vulkan } // namespace Seele \ No newline at end of file