@@ -100,6 +100,17 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
100100 bool storage_input_output_16 = false ;
101101 };
102102
103+ struct RaytracingCapabilities {
104+ bool buffer_device_address_support = false ;
105+ bool acceleration_structure_support = false ;
106+ bool raytracing_pipeline_support = false ;
107+ uint32_t shader_group_handle_size = 0 ;
108+ uint32_t shader_group_handle_alignment = 0 ;
109+ uint32_t shader_group_handle_size_aligned = 0 ;
110+ uint32_t shader_group_base_alignment = 0 ;
111+ bool validation = false ;
112+ };
113+
103114 struct DeviceFunctions {
104115 PFN_vkCreateSwapchainKHR CreateSwapchainKHR = nullptr ;
105116 PFN_vkDestroySwapchainKHR DestroySwapchainKHR = nullptr ;
@@ -116,6 +127,10 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
116127
117128 // Debug device fault.
118129 PFN_vkGetDeviceFaultInfoEXT GetDeviceFaultInfoEXT = nullptr ;
130+
131+ // Raytracing extensions.
132+ PFN_vkCreateAccelerationStructureKHR CreateAccelerationStructureKHR = nullptr ;
133+ PFN_vkCreateRayTracingPipelinesKHR CreateRaytracingPipelinesKHR = nullptr ;
119134 };
120135 // Debug marker extensions.
121136 VkDebugReportObjectTypeEXT _convert_to_debug_report_objectType (VkObjectType p_object_type);
@@ -138,6 +153,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
138153 VRSCapabilities vrs_capabilities;
139154 ShaderCapabilities shader_capabilities;
140155 StorageBufferCapabilities storage_buffer_capabilities;
156+ RaytracingCapabilities raytracing_capabilities;
141157 bool pipeline_cache_control_support = false ;
142158 bool device_fault_support = false ;
143159#if defined(VK_TRACK_DEVICE_MEMORY)
@@ -198,6 +214,10 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
198214 VkBufferView vk_view = VK_NULL_HANDLE; // For texel buffers.
199215 };
200216
217+ private:
218+ VkDeviceAddress _buffer_get_device_address (BufferID p_buffer);
219+
220+ public:
201221 virtual BufferID buffer_create (uint64_t p_size, BitField<BufferUsageBits> p_usage, MemoryAllocationType p_allocation_type) override final ;
202222 virtual bool buffer_set_texel_format (BufferID p_buffer, DataFormat p_format) override final ;
203223 virtual void buffer_free (BufferID p_buffer) override final ;
@@ -424,7 +444,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
424444 uint64_t vertex_input_mask = 0 ;
425445 uint32_t fragment_output_mask = 0 ;
426446 uint32_t specialization_constants_count = 0 ;
427- uint32_t is_compute = 0 ;
447+ PipelineType pipeline_type = PipelineType::RASTERIZATION ;
428448 uint32_t compute_local_size[3 ] = {};
429449 uint32_t set_count = 0 ;
430450 uint32_t push_constant_size = 0 ;
@@ -434,11 +454,28 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
434454 };
435455 };
436456
457+ struct RaytracingShaderRegions {
458+ VkStridedDeviceAddressRegionKHR raygen;
459+ uint32_t raygen_count = 0 ;
460+ VkStridedDeviceAddressRegionKHR miss;
461+ uint32_t miss_count = 0 ;
462+ VkStridedDeviceAddressRegionKHR closest_hit;
463+ uint32_t closest_hit_count = 0 ;
464+ VkStridedDeviceAddressRegionKHR call;
465+ uint32_t group_count = 0 ;
466+
467+ // Size of one shader group handle
468+ LocalVector<uint8_t > handles_data;
469+ };
470+
437471 struct ShaderInfo {
438472 VkShaderStageFlags vk_push_constant_stages = 0 ;
439473 TightLocalVector<VkPipelineShaderStageCreateInfo> vk_stages_create_info;
474+ TightLocalVector<VkRayTracingShaderGroupCreateInfoKHR> vk_groups_create_info;
440475 TightLocalVector<VkDescriptorSetLayout> vk_descriptor_set_layouts;
441476 VkPipelineLayout vk_pipeline_layout = VK_NULL_HANDLE;
477+ RaytracingShaderRegions regions;
478+ BufferID sbt_buffer;
442479 };
443480
444481public:
@@ -626,6 +663,50 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
626663
627664 virtual PipelineID compute_pipeline_create (ShaderID p_shader, VectorView<PipelineSpecializationConstant> p_specialization_constants) override final ;
628665
666+ /* *******************/
667+ /* *** RAYTRACING ****/
668+ /* *******************/
669+ struct AccelerationStructureInfo {
670+ VkAccelerationStructureKHR vk_acceleration_structure = VK_NULL_HANDLE;
671+ // Buffer used for the structure
672+ RDD::BufferID buffer;
673+ // Buffer used for building the structure
674+ RDD::BufferID scratch_buffer;
675+ // Buffer used for instances in a TLAS
676+ RDD::BufferID instances_buffer;
677+
678+ // Required for building
679+ VkAccelerationStructureGeometryKHR geometry;
680+ LocalVector<VkAccelerationStructureInstanceKHR> instances;
681+ VkAccelerationStructureBuildGeometryInfoKHR build_info;
682+ VkAccelerationStructureBuildRangeInfoKHR range_info;
683+ };
684+
685+ virtual AccelerationStructureID blas_create (BufferID p_vertex_buffer, uint64_t p_vertex_offset, VertexFormatID p_vertex_format, uint32_t p_vertex_count, BufferID p_index_buffer, IndexBufferFormat p_index_format, uint64_t p_index_offset_bytes, uint32_t p_index_count, BufferID p_transform_buffer, uint64_t p_transform_offset) override final ;
686+ virtual AccelerationStructureID tlas_create (const LocalVector<AccelerationStructureID> &p_blases) override final ;
687+ virtual void acceleration_structure_free (AccelerationStructureID p_acceleration_structure) override final ;
688+
689+ private:
690+ void _acceleration_structure_create (VkAccelerationStructureTypeKHR p_type, VkAccelerationStructureBuildSizesInfoKHR p_size_info, AccelerationStructureInfo *r_accel_info);
691+
692+ public:
693+ // ----- PIPELINE -----
694+
695+ struct RaytracingPipelineInfo {
696+ VkPipeline vk_pipeline;
697+ };
698+
699+ virtual RaytracingPipelineID raytracing_pipeline_create (ShaderID p_shader, VectorView<PipelineSpecializationConstant> p_specialization_constants) override final ;
700+ virtual void raytracing_pipeline_free (RaytracingPipelineID p_pipeline) override final ;
701+
702+ // ----- COMMANDS -----
703+
704+ virtual void command_build_acceleration_structure (CommandBufferID p_cmd_buffer, AccelerationStructureID p_acceleration_structure) override final ;
705+ virtual void command_bind_raytracing_pipeline (CommandBufferID p_cmd_buffer, RaytracingPipelineID p_pipeline) override final ;
706+ virtual void command_bind_raytracing_uniform_set (CommandBufferID p_cmd_buffer, UniformSetID p_uniform_set, ShaderID p_shader, uint32_t p_set_index) override final ;
707+ virtual void command_raytracing_trace_rays (CommandBufferID p_cmd_buffer, RaytracingPipelineID p_pipeline, ShaderID p_shader, uint32_t p_width, uint32_t p_height) override final ;
708+
709+ public:
629710 /* ****************/
630711 /* *** QUERIES ****/
631712 /* ****************/
0 commit comments