blob: 4f9d418319b6a9e656f82976b707656a22d8b337 [file] [log] [blame]
/*
* Copyright © 2022 Konstantin Seurer
*
* SPDX-License-Identifier: MIT
*/
#ifndef BVH_BUILD_HELPERS_H
#define BVH_BUILD_HELPERS_H
#include "bvh.h"
#include "vk_build_helpers.h"
TYPE(radv_accel_struct_serialization_header, 8);
TYPE(radv_accel_struct_header, 8);
TYPE(radv_bvh_triangle_node, 4);
TYPE(radv_bvh_aabb_node, 4);
TYPE(radv_bvh_instance_node, 8);
TYPE(radv_bvh_box16_node, 4);
TYPE(radv_bvh_box32_node, 4);
TYPE(radv_gfx12_box_node, 4);
TYPE(radv_gfx12_instance_node, 8);
TYPE(radv_gfx12_instance_node_user_data, 4);
TYPE(radv_gfx12_primitive_node, 4);
uint32_t
id_to_offset(uint32_t id)
{
return (id & (~7u)) << 3;
}
uint32_t
id_to_type(uint32_t id)
{
return id & 7u;
}
uint32_t
pack_node_id(uint32_t offset, uint32_t type)
{
return (offset >> 3) | type;
}
uint64_t
node_to_addr(uint64_t node)
{
node &= ~7ul;
node <<= 19;
return int64_t(node) >> 16;
}
uint64_t
addr_to_node(uint64_t addr)
{
return (addr >> 3) & ((1ul << 45) - 1);
}
uint32_t
ir_type_to_bvh_type(uint32_t type)
{
switch (type) {
case vk_ir_node_triangle:
return radv_bvh_node_triangle;
case vk_ir_node_internal:
return radv_bvh_node_box32;
case vk_ir_node_instance:
return radv_bvh_node_instance;
case vk_ir_node_aabb:
return radv_bvh_node_aabb;
}
/* unreachable in valid nodes */
return RADV_BVH_INVALID_NODE;
}
uint32_t
radv_encode_sbt_offset_and_flags(uint32_t src)
{
uint32_t flags = src >> 24;
uint32_t ret = src & 0xffffffu;
if ((flags & VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR) != 0)
ret |= RADV_INSTANCE_FORCE_OPAQUE;
if ((flags & VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR) == 0)
ret |= RADV_INSTANCE_NO_FORCE_NOT_OPAQUE;
if ((flags & VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR) != 0)
ret |= RADV_INSTANCE_TRIANGLE_FACING_CULL_DISABLE;
if ((flags & VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR) != 0)
ret |= RADV_INSTANCE_TRIANGLE_FLIP_FACING;
return ret;
}
uint64_t
radv_encode_blas_pointer_flags(uint32_t flags, uint32_t geometry_type)
{
uint64_t ptr_flags = 0;
if ((flags & VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR) != 0)
ptr_flags |= RADV_BLAS_POINTER_FORCE_OPAQUE;
if ((flags & VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR) != 0)
ptr_flags |= RADV_BLAS_POINTER_FORCE_NON_OPAQUE;
if ((flags & VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR) != 0 ||
geometry_type == VK_GEOMETRY_TYPE_AABBS_KHR)
ptr_flags |= RADV_BLAS_POINTER_DISABLE_TRI_CULL;
if ((flags & VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR) != 0)
ptr_flags |= RADV_BLAS_POINTER_FLIP_FACING;
if (geometry_type == VK_GEOMETRY_TYPE_TRIANGLES_KHR)
ptr_flags |= RADV_BLAS_POINTER_SKIP_AABBS;
else
ptr_flags |= RADV_BLAS_POINTER_SKIP_TRIANGLES;
return ptr_flags;
}
#endif /* BUILD_HELPERS_H */