91 lines
3.6 KiB
C
91 lines
3.6 KiB
C
|
/*
|
||
|
* Extended sample base class for ray tracing based samples
|
||
|
*
|
||
|
* Copyright (C) 2020 by Sascha Willems - www.saschawillems.de
|
||
|
*
|
||
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "vulkan/vulkan.h"
|
||
|
#include "vulkanexamplebase.h"
|
||
|
#include "VulkanTools.h"
|
||
|
#include "VulkanDevice.h"
|
||
|
|
||
|
class VulkanRaytracingSample : public VulkanExampleBase
|
||
|
{
|
||
|
protected:
|
||
|
// Update the default render pass with different color attachment load ops
|
||
|
virtual void updateRenderPass();
|
||
|
public:
|
||
|
// Function pointers for ray tracing related stuff
|
||
|
PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;
|
||
|
PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;
|
||
|
PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;
|
||
|
PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;
|
||
|
PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;
|
||
|
PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;
|
||
|
PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;
|
||
|
PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;
|
||
|
PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;
|
||
|
PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;
|
||
|
|
||
|
// Available features and properties
|
||
|
VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingPipelineProperties{};
|
||
|
VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures{};
|
||
|
|
||
|
// Enabled features and properties
|
||
|
VkPhysicalDeviceBufferDeviceAddressFeatures enabledBufferDeviceAddresFeatures{};
|
||
|
VkPhysicalDeviceRayTracingPipelineFeaturesKHR enabledRayTracingPipelineFeatures{};
|
||
|
VkPhysicalDeviceAccelerationStructureFeaturesKHR enabledAccelerationStructureFeatures{};
|
||
|
|
||
|
// Holds information for a ray tracing scratch buffer that is used as a temporary storage
|
||
|
struct ScratchBuffer
|
||
|
{
|
||
|
uint64_t deviceAddress = 0;
|
||
|
VkBuffer handle = VK_NULL_HANDLE;
|
||
|
VkDeviceMemory memory = VK_NULL_HANDLE;
|
||
|
};
|
||
|
|
||
|
// Holds information for a ray tracing acceleration structure
|
||
|
struct AccelerationStructure {
|
||
|
VkAccelerationStructureKHR handle;
|
||
|
uint64_t deviceAddress = 0;
|
||
|
VkDeviceMemory memory;
|
||
|
VkBuffer buffer;
|
||
|
};
|
||
|
|
||
|
// Holds information for a storage image that the ray tracing shaders output to
|
||
|
struct StorageImage {
|
||
|
VkDeviceMemory memory = VK_NULL_HANDLE;
|
||
|
VkImage image = VK_NULL_HANDLE;
|
||
|
VkImageView view = VK_NULL_HANDLE;
|
||
|
VkFormat format;
|
||
|
} storageImage;
|
||
|
|
||
|
// Extends the buffer class and holds information for a shader binding table
|
||
|
class ShaderBindingTable : public vks::Buffer {
|
||
|
public:
|
||
|
VkStridedDeviceAddressRegionKHR stridedDeviceAddressRegion{};
|
||
|
};
|
||
|
|
||
|
// Set to true, to denote that the sample only uses ray queries (changes extension and render pass handling)
|
||
|
bool rayQueryOnly = false;
|
||
|
|
||
|
void enableExtensions();
|
||
|
ScratchBuffer createScratchBuffer(VkDeviceSize size);
|
||
|
void deleteScratchBuffer(ScratchBuffer& scratchBuffer);
|
||
|
void createAccelerationStructure(AccelerationStructure& accelerationStructure, VkAccelerationStructureTypeKHR type, VkAccelerationStructureBuildSizesInfoKHR buildSizeInfo);
|
||
|
void deleteAccelerationStructure(AccelerationStructure& accelerationStructure);
|
||
|
uint64_t getBufferDeviceAddress(VkBuffer buffer);
|
||
|
void createStorageImage(VkFormat format, VkExtent3D extent);
|
||
|
void deleteStorageImage();
|
||
|
VkStridedDeviceAddressRegionKHR getSbtEntryStridedDeviceAddressRegion(VkBuffer buffer, uint32_t handleCount);
|
||
|
void createShaderBindingTable(ShaderBindingTable& shaderBindingTable, uint32_t handleCount);
|
||
|
// Draw the ImGUI UI overlay using a render pass
|
||
|
void drawUI(VkCommandBuffer commandBuffer, VkFramebuffer framebuffer);
|
||
|
|
||
|
virtual void prepare();
|
||
|
};
|