More ray tracing changes
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
#include "Containers/Array.h"
|
#include "Containers/Array.h"
|
||||||
#include "Initializer.h"
|
#include "Initializer.h"
|
||||||
#include "MinimalEngine.h"
|
#include "MinimalEngine.h"
|
||||||
#include "Query.h"
|
|
||||||
#include "RenderTarget.h"
|
#include "RenderTarget.h"
|
||||||
#include "Resources.h"
|
#include "Resources.h"
|
||||||
|
|
||||||
@@ -32,8 +31,15 @@ DECLARE_REF(ComputePipeline)
|
|||||||
DECLARE_REF(RenderCommand)
|
DECLARE_REF(RenderCommand)
|
||||||
DECLARE_REF(ComputeCommand)
|
DECLARE_REF(ComputeCommand)
|
||||||
DECLARE_REF(OcclusionQuery)
|
DECLARE_REF(OcclusionQuery)
|
||||||
|
DECLARE_REF(PipelineStatisticsQuery)
|
||||||
DECLARE_REF(BottomLevelAS)
|
DECLARE_REF(BottomLevelAS)
|
||||||
DECLARE_REF(TopLevelAS)
|
DECLARE_REF(TopLevelAS)
|
||||||
|
DECLARE_REF(RayGenShader)
|
||||||
|
DECLARE_REF(AnyHitShader)
|
||||||
|
DECLARE_REF(ClosestHitShader)
|
||||||
|
DECLARE_REF(MissShader)
|
||||||
|
DECLARE_REF(IntersectionShader)
|
||||||
|
DECLARE_REF(CallableShader)
|
||||||
class Graphics {
|
class Graphics {
|
||||||
public:
|
public:
|
||||||
Graphics();
|
Graphics();
|
||||||
@@ -93,6 +99,12 @@ class Graphics {
|
|||||||
virtual OBottomLevelAS createBottomLevelAccelerationStructure(const BottomLevelASCreateInfo& createInfo) = 0;
|
virtual OBottomLevelAS createBottomLevelAccelerationStructure(const BottomLevelASCreateInfo& createInfo) = 0;
|
||||||
virtual OTopLevelAS createTopLevelAccelerationStructure(const TopLevelASCreateInfo& 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:
|
protected:
|
||||||
QueueFamilyMapping queueMapping;
|
QueueFamilyMapping queueMapping;
|
||||||
OShaderCompiler shaderCompiler;
|
OShaderCompiler shaderCompiler;
|
||||||
|
|||||||
@@ -224,7 +224,15 @@ struct ComputePipelineCreateInfo {
|
|||||||
Gfx::PComputeShader computeShader = nullptr;
|
Gfx::PComputeShader computeShader = nullptr;
|
||||||
Gfx::PPipelineLayout pipelineLayout = nullptr;
|
Gfx::PPipelineLayout pipelineLayout = nullptr;
|
||||||
};
|
};
|
||||||
DECLARE_REF(ShaderBuffer)
|
struct RayTracingPipelineCreateInfo {
|
||||||
|
PPipelineLayout pipelineLayout = nullptr;
|
||||||
|
PRayGenShader rayGenShader = nullptr;
|
||||||
|
Array<PClosestHitShader> closestHitShaders;
|
||||||
|
Array<PAnyHitShader> anyHitShaders;
|
||||||
|
Array<PIntersectionShader> intersectionShaders;
|
||||||
|
Array<PMissShader> missShaders;
|
||||||
|
Array<PCallableShader> callableShaders;
|
||||||
|
};
|
||||||
struct BottomLevelASCreateInfo {
|
struct BottomLevelASCreateInfo {
|
||||||
PMesh mesh;
|
PMesh mesh;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -71,6 +71,13 @@ class MissShader {
|
|||||||
};
|
};
|
||||||
DEFINE_REF(MissShader)
|
DEFINE_REF(MissShader)
|
||||||
|
|
||||||
|
class IntersectionShader {
|
||||||
|
public:
|
||||||
|
IntersectionShader() {}
|
||||||
|
virtual ~IntersectionShader() {}
|
||||||
|
};
|
||||||
|
DEFINE_REF(IntersectionShader)
|
||||||
|
|
||||||
class CallableShader {
|
class CallableShader {
|
||||||
public:
|
public:
|
||||||
CallableShader() {}
|
CallableShader() {}
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ void RenderCommand::bindPipeline(Gfx::PGraphicsPipeline gfxPipeline) {
|
|||||||
pipeline = gfxPipeline.cast<GraphicsPipeline>();
|
pipeline = gfxPipeline.cast<GraphicsPipeline>();
|
||||||
pipeline->bind(handle);
|
pipeline->bind(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderCommand::bindDescriptor(Gfx::PDescriptorSet descriptorSet, Array<uint32> dynamicOffsets) {
|
void RenderCommand::bindDescriptor(Gfx::PDescriptorSet descriptorSet, Array<uint32> dynamicOffsets) {
|
||||||
assert(threadId == std::this_thread::get_id());
|
assert(threadId == std::this_thread::get_id());
|
||||||
auto descriptor = descriptorSet.cast<DescriptorSet>();
|
auto descriptor = descriptorSet.cast<DescriptorSet>();
|
||||||
@@ -268,6 +269,7 @@ void RenderCommand::bindDescriptor(const Array<Gfx::PDescriptorSet>& descriptorS
|
|||||||
dynamicOffsets.size(), dynamicOffsets.data());
|
dynamicOffsets.size(), dynamicOffsets.data());
|
||||||
delete[] sets;
|
delete[] sets;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderCommand::bindVertexBuffer(const Array<Gfx::PVertexBuffer>& streams) {
|
void RenderCommand::bindVertexBuffer(const Array<Gfx::PVertexBuffer>& streams) {
|
||||||
assert(threadId == std::this_thread::get_id());
|
assert(threadId == std::this_thread::get_id());
|
||||||
Array<VkBuffer> buffers(streams.size());
|
Array<VkBuffer> buffers(streams.size());
|
||||||
@@ -281,6 +283,7 @@ void RenderCommand::bindVertexBuffer(const Array<Gfx::PVertexBuffer>& streams) {
|
|||||||
};
|
};
|
||||||
vkCmdBindVertexBuffers(handle, 0, (uint32)streams.size(), buffers.data(), offsets.data());
|
vkCmdBindVertexBuffers(handle, 0, (uint32)streams.size(), buffers.data(), offsets.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderCommand::bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) {
|
void RenderCommand::bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) {
|
||||||
assert(threadId == std::this_thread::get_id());
|
assert(threadId == std::this_thread::get_id());
|
||||||
PIndexBuffer buf = indexBuffer.cast<IndexBuffer>();
|
PIndexBuffer buf = indexBuffer.cast<IndexBuffer>();
|
||||||
@@ -313,6 +316,8 @@ void RenderCommand::drawMeshIndirect(Gfx::PShaderBuffer buffer, uint64 offset, u
|
|||||||
vkCmdDrawMeshTasksIndirectEXT(handle, buffer.cast<ShaderBuffer>()->getHandle(), offset, drawCount, stride);
|
vkCmdDrawMeshTasksIndirectEXT(handle, buffer.cast<ShaderBuffer>()->getHandle(), offset, drawCount, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderCommand::traceRays() { vkCmdTraceRaysKHR(handle, ); }
|
||||||
|
|
||||||
ComputeCommand::ComputeCommand(PGraphics graphics, VkCommandPool cmdPool) : graphics(graphics), owner(cmdPool) {
|
ComputeCommand::ComputeCommand(PGraphics graphics, VkCommandPool cmdPool) : graphics(graphics), owner(cmdPool) {
|
||||||
VkCommandBufferAllocateInfo allocInfo = {
|
VkCommandBufferAllocateInfo allocInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ class RenderCommand : public Gfx::RenderCommand {
|
|||||||
virtual void drawMesh(uint32 groupX, uint32 groupY, uint32 groupZ) override;
|
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 drawMeshIndirect(Gfx::PShaderBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride) override;
|
||||||
|
|
||||||
|
virtual void traceRays();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PGraphicsPipeline pipeline;
|
PGraphicsPipeline pipeline;
|
||||||
bool ready;
|
bool ready;
|
||||||
|
|||||||
@@ -319,6 +319,42 @@ Gfx::OTopLevelAS Graphics::createTopLevelAccelerationStructure(const Gfx::TopLev
|
|||||||
return new TopLevelAS(this, createInfo);
|
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) {
|
PCommandPool Graphics::getQueueCommands(Gfx::QueueType queueType) {
|
||||||
switch (queueType) {
|
switch (queueType) {
|
||||||
case Gfx::QueueType::GRAPHICS:
|
case Gfx::QueueType::GRAPHICS:
|
||||||
|
|||||||
@@ -77,6 +77,13 @@ class Graphics : public Gfx::Graphics {
|
|||||||
virtual Gfx::OBottomLevelAS createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) override;
|
virtual Gfx::OBottomLevelAS createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) override;
|
||||||
virtual Gfx::OTopLevelAS createTopLevelAccelerationStructure(const Gfx::TopLevelASCreateInfo& 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:
|
protected:
|
||||||
Array<const char*> getRequiredExtensions();
|
Array<const char*> getRequiredExtensions();
|
||||||
void initInstance(GraphicsInitializer initInfo);
|
void initInstance(GraphicsInitializer initInfo);
|
||||||
|
|||||||
@@ -465,3 +465,7 @@ PComputePipeline PipelineCache::createPipeline(Gfx::ComputePipelineCreateInfo co
|
|||||||
graphicsPipelines[hash] = std::move(pipeline);
|
graphicsPipelines[hash] = std::move(pipeline);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRayTracingPipeline PipelineCache::createPipeline(Gfx::RayTracingPipelineCreateInfo createInfo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Pipeline.h"
|
#include "Pipeline.h"
|
||||||
|
#include "RayTracing.h"
|
||||||
|
|
||||||
namespace Seele {
|
namespace Seele {
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
@@ -11,6 +12,8 @@ class PipelineCache {
|
|||||||
PGraphicsPipeline createPipeline(Gfx::MeshPipelineCreateInfo createInfo);
|
PGraphicsPipeline createPipeline(Gfx::MeshPipelineCreateInfo createInfo);
|
||||||
PComputePipeline createPipeline(Gfx::ComputePipelineCreateInfo createInfo);
|
PComputePipeline createPipeline(Gfx::ComputePipelineCreateInfo createInfo);
|
||||||
|
|
||||||
|
PRayTracingPipeline createPipeline(Gfx::RayTracingPipelineCreateInfo createInfo);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Map<uint32, OGraphicsPipeline> graphicsPipelines;
|
Map<uint32, OGraphicsPipeline> graphicsPipelines;
|
||||||
Map<uint32, OComputePipeline> computePipelines;
|
Map<uint32, OComputePipeline> computePipelines;
|
||||||
|
|||||||
@@ -29,5 +29,12 @@ class TopLevelAS : public Gfx::TopLevelAS {
|
|||||||
VkAccelerationStructureKHR handle;
|
VkAccelerationStructureKHR handle;
|
||||||
};
|
};
|
||||||
DEFINE_REF(TopLevelAS)
|
DEFINE_REF(TopLevelAS)
|
||||||
|
|
||||||
|
class RayTracingPipeline : public Gfx::RayTracingPipeline
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
DEFINE_REF(RayTracingPipeline)
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
} // namespace Seele
|
} // namespace Seele
|
||||||
@@ -47,5 +47,20 @@ DEFINE_REF(FragmentShader)
|
|||||||
DEFINE_REF(ComputeShader)
|
DEFINE_REF(ComputeShader)
|
||||||
DEFINE_REF(TaskShader)
|
DEFINE_REF(TaskShader)
|
||||||
DEFINE_REF(MeshShader)
|
DEFINE_REF(MeshShader)
|
||||||
|
|
||||||
|
// Ray Tracing
|
||||||
|
using RayGenShader = ShaderBase<Gfx::RayGenShader, VK_SHADER_STAGE_RAYGEN_BIT_KHR>;
|
||||||
|
using AnyHitShader = ShaderBase<Gfx::AnyHitShader, VK_SHADER_STAGE_ANY_HIT_BIT_KHR>;
|
||||||
|
using ClosestHitShader = ShaderBase<Gfx::ClosestHitShader, VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR>;
|
||||||
|
using MissShader = ShaderBase<Gfx::MissShader, VK_SHADER_STAGE_MISS_BIT_KHR>;
|
||||||
|
using IntersectionShader = ShaderBase<Gfx::IntersectionShader, VK_SHADER_STAGE_INTERSECTION_BIT_KHR>;
|
||||||
|
using CallableShader = ShaderBase<Gfx::CallableShader, VK_SHADER_STAGE_CALLABLE_BIT_KHR>;
|
||||||
|
|
||||||
|
DEFINE_REF(RayGenShader)
|
||||||
|
DEFINE_REF(AnyHitShader)
|
||||||
|
DEFINE_REF(ClosestHitShader)
|
||||||
|
DEFINE_REF(MissShader)
|
||||||
|
DEFINE_REF(IntersectionShader)
|
||||||
|
DEFINE_REF(CallableShader)
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
} // namespace Seele
|
} // namespace Seele
|
||||||
Reference in New Issue
Block a user