More Ray tracing changes
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,7 @@ public:
|
||||
VmaAllocationInfo info = VmaAllocationInfo();
|
||||
VkMemoryPropertyFlags properties = 0;
|
||||
uint64 size = 0;
|
||||
VkDeviceAddress deviceAddress;
|
||||
};
|
||||
DEFINE_REF(BufferAllocation);
|
||||
class Buffer {
|
||||
@@ -24,6 +25,9 @@ public:
|
||||
Gfx::QueueType &queueType, bool dynamic, std::string name);
|
||||
virtual ~Buffer();
|
||||
VkBuffer getHandle() const { return buffers[currentBuffer]->buffer; }
|
||||
VkDeviceAddress getDeviceAddress() const {
|
||||
return buffers[currentBuffer]->deviceAddress;
|
||||
}
|
||||
PBufferAllocation getAlloc() const { return buffers[currentBuffer]; }
|
||||
uint64 getSize() const { return buffers[currentBuffer]->size; }
|
||||
void *map(bool writeOnly = true);
|
||||
@@ -130,7 +134,8 @@ public:
|
||||
virtual ~ShaderBuffer();
|
||||
virtual void
|
||||
updateContents(const ShaderBufferCreateInfo &createInfo) override;
|
||||
virtual void rotateBuffer(uint64 size, bool preserveContents = false) override;
|
||||
virtual void rotateBuffer(uint64 size,
|
||||
bool preserveContents = false) override;
|
||||
virtual void *mapRegion(uint64 offset, uint64 size, bool writeOnly) override;
|
||||
virtual void unmap() override;
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ target_sources(Engine
|
||||
PipelineCache.cpp
|
||||
Queue.h
|
||||
Queue.cpp
|
||||
RayTracing.h
|
||||
RayTracing.cpp
|
||||
RenderPass.h
|
||||
RenderPass.cpp
|
||||
Resources.h
|
||||
@@ -47,6 +49,7 @@ target_sources(Engine
|
||||
Pipeline.h
|
||||
PipelineCache.h
|
||||
Queue.h
|
||||
RayTracing.h
|
||||
RenderPass.h
|
||||
Resources.h
|
||||
Shader.h
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "Command.h"
|
||||
#include "Graphics.h"
|
||||
#include "Texture.h"
|
||||
#include "CRC.h"
|
||||
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "RenderPass.h"
|
||||
#include "Graphics.h"
|
||||
#include "Texture.h"
|
||||
#include "CRC.h"
|
||||
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include "Allocator.h"
|
||||
#include "Buffer.h"
|
||||
#include "Graphics/Enums.h"
|
||||
#include "Graphics/Graphics.h"
|
||||
#include "Graphics/Initializer.h"
|
||||
#include "PipelineCache.h"
|
||||
#include "Command.h"
|
||||
#include "Descriptor.h"
|
||||
@@ -10,6 +12,7 @@
|
||||
#include "RenderPass.h"
|
||||
#include "Framebuffer.h"
|
||||
#include "Shader.h"
|
||||
#include "RayTracing.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <cstring>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
@@ -291,14 +294,24 @@ void Graphics::resolveTexture(Gfx::PTexture source, Gfx::PTexture destination)
|
||||
vkCmdResolveImage(getGraphicsCommands()->getCommands()->getHandle(), sourceTex->getImage(), cast(sourceTex->getLayout()), destinationTex->getImage(), cast(destinationTex->getLayout()), 1, &resolve);
|
||||
}
|
||||
|
||||
void Graphics::vkCmdDrawMeshTasksEXT(VkCommandBuffer handle, uint32 groupX, uint32 groupY, uint32 groupZ)
|
||||
Gfx::OBottomLevelAS Graphics::createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo)
|
||||
{
|
||||
cmdDrawMeshTasks(handle, groupX, groupY, groupZ);
|
||||
return new BottomLevelAS(this, createInfo);
|
||||
}
|
||||
|
||||
void Graphics::vkCmdDrawMeshTasksIndirectEXT(VkCommandBuffer handle, VkBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride)
|
||||
Gfx::OTopLevelAS Graphics::createTopLevelAccelerationStructure(const Gfx::TopLevelASCreateInfo& createInfo)
|
||||
{
|
||||
cmdDrawMeshTasksIndirect(handle, buffer, offset, drawCount, stride);
|
||||
return new TopLevelAS(this, createInfo);
|
||||
}
|
||||
|
||||
void Graphics::vkCmdDrawMeshTasksEXT(VkCommandBuffer cmd, uint32 groupX, uint32 groupY, uint32 groupZ)
|
||||
{
|
||||
cmdDrawMeshTasks(cmd, groupX, groupY, groupZ);
|
||||
}
|
||||
|
||||
void Graphics::vkCmdDrawMeshTasksIndirectEXT(VkCommandBuffer cmd, VkBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride)
|
||||
{
|
||||
cmdDrawMeshTasksIndirect(cmd, buffer, offset, drawCount, stride);
|
||||
}
|
||||
|
||||
void Graphics::vkSetDebugUtilsObjectNameEXT(VkDebugUtilsObjectNameInfoEXT* info)
|
||||
@@ -395,6 +408,7 @@ void Graphics::initInstance(GraphicsInitializer initInfo)
|
||||
assert(glfwVulkanSupported());
|
||||
VkApplicationInfo appInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
||||
.pNext = nullptr,
|
||||
.pApplicationName = initInfo.applicationName,
|
||||
.applicationVersion = VK_MAKE_VERSION(0, 0, 1),
|
||||
.pEngineName = initInfo.engineName,
|
||||
@@ -415,6 +429,7 @@ void Graphics::initInstance(GraphicsInitializer initInfo)
|
||||
#endif
|
||||
VkInstanceCreateInfo info = {
|
||||
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||
.pNext = nullptr,
|
||||
#if __APPLE__
|
||||
.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR,
|
||||
#endif
|
||||
@@ -562,6 +577,7 @@ void Graphics::createDevice(GraphicsInitializer initializer)
|
||||
.flags = 0,
|
||||
.queueFamilyIndex = familyIndex,
|
||||
.queueCount = numQueuesForFamily,
|
||||
.pQueuePriorities = nullptr,
|
||||
};
|
||||
numPriorities += numQueuesForFamily;
|
||||
queueInfos.add(info);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include "Enums.h"
|
||||
#include "Graphics/Graphics.h"
|
||||
#include <vk_mem_alloc.h>
|
||||
|
||||
@@ -70,6 +69,10 @@ public:
|
||||
|
||||
virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) override;
|
||||
|
||||
// Ray Tracing
|
||||
virtual Gfx::OBottomLevelAS createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) override;
|
||||
virtual Gfx::OTopLevelAS createTopLevelAccelerationStructure(const Gfx::TopLevelASCreateInfo& createInfo) override;
|
||||
|
||||
void vkCmdDrawMeshTasksEXT(VkCommandBuffer handle, uint32 groupX, uint32 groupY, uint32 groupZ);
|
||||
void vkCmdDrawMeshTasksIndirectEXT(VkCommandBuffer handle, VkBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride);
|
||||
void vkSetDebugUtilsObjectNameEXT(VkDebugUtilsObjectNameInfoEXT* info);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "Graphics.h"
|
||||
#include "Allocator.h"
|
||||
#include "Command.h"
|
||||
#include "Enums.h"
|
||||
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
#include "RayTracing.h"
|
||||
#include "Buffer.h"
|
||||
#include "Graphics/Initializer.h"
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
BottomLevelAS::BottomLevelAS(PGraphics graphics, const Gfx::BottomLevelASCreateInfo& createInfo)
|
||||
{
|
||||
VkDeviceOrHostAddressConstKHR vertexDataDeviceAddress = {
|
||||
.deviceAddress = createInfo.positionBuffer.cast<Buffer>()->getDeviceAddress() + createInfo.verticesOffset,
|
||||
};
|
||||
VkDeviceOrHostAddressConstKHR indexDataDeviceAddress = {
|
||||
.deviceAddress = createInfo.indexBuffer.cast<Buffer>()->getDeviceAddress() + createInfo.indicesOffset,
|
||||
};
|
||||
VkAccelerationStructureGeometryKHR accelerationStructureGeometry = {
|
||||
.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR,
|
||||
.pNext = nullptr,
|
||||
.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR,
|
||||
.geometry = {.triangles = {
|
||||
.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR,
|
||||
.pNext = nullptr,
|
||||
.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT,
|
||||
.vertexData = vertexDataDeviceAddress,
|
||||
.vertexStride = sizeof(Vector),
|
||||
.maxVertex = createInfo.positionBuffer->getNumElements(),
|
||||
.indexType = VK_INDEX_TYPE_UINT32,
|
||||
.indexData = indexDataDeviceAddress,
|
||||
}},
|
||||
.flags = VK_GEOMETRY_OPAQUE_BIT_KHR,
|
||||
};
|
||||
|
||||
VkAccelerationStructureBuildRangeInfoKHR buildRangeInfo = {
|
||||
.primitiveCount = createInfo.meshData.numIndices / 3,
|
||||
.primitiveOffset = 0,
|
||||
.firstVertex = 0,
|
||||
.transformOffset = 0
|
||||
};
|
||||
|
||||
VkAccelerationStructureBuildGeometryInfoKHR buildGeometry = {
|
||||
.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR,
|
||||
.pNext = nullptr,
|
||||
.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,
|
||||
.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,
|
||||
};
|
||||
|
||||
VkAccelerationStructureCreateInfoKHR info = {
|
||||
.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR,
|
||||
.pNext = nullptr,
|
||||
.createFlags = 0,
|
||||
};
|
||||
}
|
||||
|
||||
BottomLevelAS::~BottomLevelAS()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TopLevelAS::TopLevelAS(PGraphics graphics, const Gfx::TopLevelASCreateInfo& createInfo)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TopLevelAS::~TopLevelAS()
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
#include "Graphics/Initializer.h"
|
||||
#include "Graphics.h"
|
||||
#include "Graphics/RayTracing.h"
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
namespace Seele
|
||||
{
|
||||
namespace Vulkan
|
||||
{
|
||||
class BottomLevelAS : public Gfx::BottomLevelAS
|
||||
{
|
||||
public:
|
||||
BottomLevelAS(PGraphics graphics, const Gfx::BottomLevelASCreateInfo& createInfo);
|
||||
~BottomLevelAS();
|
||||
private:
|
||||
PGraphics graphics;
|
||||
VkAccelerationStructureKHR handle;
|
||||
};
|
||||
DEFINE_REF(BottomLevelAS)
|
||||
class TopLevelAS : public Gfx::TopLevelAS
|
||||
{
|
||||
public:
|
||||
TopLevelAS(PGraphics graphics, const Gfx::TopLevelASCreateInfo& createInfo);
|
||||
~TopLevelAS();
|
||||
private:
|
||||
PGraphics graphics;
|
||||
VkAccelerationStructureKHR handle;
|
||||
};
|
||||
DEFINE_REF(TopLevelAS)
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "Texture.h"
|
||||
#include "Resources.h"
|
||||
#include "Command.h"
|
||||
#include "CRC.h"
|
||||
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "Texture.h"
|
||||
#include "Command.h"
|
||||
#include "Enums.h"
|
||||
#include <math.h>
|
||||
|
||||
using namespace Seele;
|
||||
|
||||
Reference in New Issue
Block a user