/* * Copyright © 2016 Red Hat. * Copyright © 2016 Bas Nieuwenhuizen * * based in part on anv driver which is: * Copyright © 2015 Intel Corporation * * SPDX-License-Identifier: MIT */ #ifndef RADV_RRA_H #define RADV_RRA_H #include "util/simple_mtx.h" #include "util/u_dynarray.h" #include #include #include struct radv_device; struct radv_rra_accel_struct_data { VkEvent build_event; uint64_t va; uint64_t size; struct radv_rra_accel_struct_buffer *buffer; VkAccelerationStructureTypeKHR type; bool is_dead; }; struct radv_rra_accel_struct_buffer { VkBuffer buffer; VkDeviceMemory memory; uint32_t ref_cnt; }; enum radv_rra_ray_history_metadata_type { RADV_RRA_COUNTER_INFO = 1, RADV_RRA_DISPATCH_SIZE = 2, RADV_RRA_TRAVERSAL_FLAGS = 3, }; struct radv_rra_ray_history_metadata_info { enum radv_rra_ray_history_metadata_type type : 32; uint32_t padding; uint64_t size; }; enum radv_rra_pipeline_type { RADV_RRA_PIPELINE_RAY_TRACING, }; struct radv_rra_ray_history_counter { uint32_t dispatch_size[3]; uint32_t hit_shader_count; uint32_t miss_shader_count; uint32_t shader_count; uint64_t pipeline_api_hash; uint32_t mode; uint32_t mask; uint32_t stride; uint32_t data_size; uint32_t lost_token_size; uint32_t ray_id_begin; uint32_t ray_id_end; enum radv_rra_pipeline_type pipeline_type : 32; }; struct radv_rra_ray_history_dispatch_size { uint32_t size[3]; uint32_t padding; }; struct radv_rra_ray_history_traversal_flags { uint32_t box_sort_mode : 1; uint32_t node_ptr_flags : 1; uint32_t reserved : 30; uint32_t padding; }; struct radv_rra_ray_history_metadata { struct radv_rra_ray_history_metadata_info counter_info; struct radv_rra_ray_history_counter counter; struct radv_rra_ray_history_metadata_info dispatch_size_info; struct radv_rra_ray_history_dispatch_size dispatch_size; struct radv_rra_ray_history_metadata_info traversal_flags_info; struct radv_rra_ray_history_traversal_flags traversal_flags; }; static_assert(sizeof(struct radv_rra_ray_history_metadata) == 136, "radv_rra_ray_history_metadata does not match RRA expectations"); struct radv_rra_ray_history_data { struct radv_rra_ray_history_metadata metadata; }; struct radv_rra_trace_data { struct hash_table *accel_structs; struct hash_table_u64 *accel_struct_vas; simple_mtx_t data_mtx; bool validate_as; bool copy_after_build; bool triggered; uint32_t copy_memory_index; struct util_dynarray ray_history; VkBuffer ray_history_buffer; VkDeviceMemory ray_history_memory; void *ray_history_data; uint64_t ray_history_addr; uint32_t ray_history_buffer_size; uint32_t ray_history_resolution_scale; }; struct radv_ray_history_header { uint32_t offset; uint32_t dispatch_index; uint32_t submit_base_index; }; enum radv_packed_token_type { radv_packed_token_end_trace, }; struct radv_packed_token_header { uint32_t launch_index : 29; uint32_t hit : 1; uint32_t token_type : 2; }; struct radv_packed_end_trace_token { struct radv_packed_token_header header; uint32_t accel_struct_lo; uint32_t accel_struct_hi; uint32_t flags : 16; uint32_t dispatch_index : 16; uint32_t sbt_offset : 4; uint32_t sbt_stride : 4; uint32_t miss_index : 16; uint32_t cull_mask : 8; float origin[3]; float tmin; float direction[3]; float tmax; uint32_t iteration_count : 16; uint32_t instance_count : 16; uint32_t ahit_count : 16; uint32_t isec_count : 16; uint32_t primitive_id; uint32_t geometry_id; uint32_t instance_id : 24; uint32_t hit_kind : 8; float t; }; static_assert(sizeof(struct radv_packed_end_trace_token) == 76, "Unexpected radv_packed_end_trace_token size"); VkResult radv_rra_trace_init(struct radv_device *device); void radv_rra_trace_clear_ray_history(VkDevice _device, struct radv_rra_trace_data *data); void radv_radv_rra_accel_struct_buffer_ref(struct radv_rra_accel_struct_buffer *buffer); void radv_rra_accel_struct_buffer_unref(struct radv_device *device, struct radv_rra_accel_struct_buffer *buffer); struct set; void radv_rra_accel_struct_buffers_unref(struct radv_device *device, struct set *buffers); void radv_rra_trace_finish(VkDevice vk_device, struct radv_rra_trace_data *data); void radv_destroy_rra_accel_struct_data(VkDevice device, struct radv_rra_accel_struct_data *data); VkResult radv_rra_dump_trace(VkQueue vk_queue, char *filename); #endif /* RADV_RRA_H */