Use latest Level Zero RT API (#595)

* Update vendored Level Zero ze_api.h to upstream
* Migrate Embree RTAS integration from EXP to EXT API
* Check for relaxed allocation limit L0 extension before using it
This commit is contained in:
Stefan Werner
2026-05-29 11:12:15 +02:00
committed by GitHub
parent fcae907bf1
commit 7ba9359784
8 changed files with 6124 additions and 654 deletions
+12 -8
View File
@@ -665,18 +665,22 @@ namespace embree
bool ze_rtas_builder = false;
for (uint32_t i=0; i<extensions.size(); i++)
{
if (strncmp("ZE_experimental_rtas_builder",extensions[i].name,sizeof(extensions[i].name)) == 0)
if (strncmp("ZE_extension_rtas",extensions[i].name,sizeof(extensions[i].name)) == 0) {
ze_rtas_builder = true;
}
if (strncmp("ZE_experimental_relaxed_allocation_limits", extensions[i].name, sizeof(extensions[i].name)) == 0) {
hasRelaxedAllocationLimits = true;
}
}
if (!ze_rtas_builder)
throw_RTCError(RTC_ERROR_LEVEL_ZERO_RAYTRACING_SUPPORT_MISSING, "ZE_experimental_rtas_builder extension not found. Please install a recent driver. On Linux, make sure that the package intel-level-zero-gpu-raytracing is installed");
throw_RTCError(RTC_ERROR_LEVEL_ZERO_RAYTRACING_SUPPORT_MISSING, "ZE_extension_rtas extension not found. Please install a recent driver. On Linux, make sure that the package intel-level-zero-gpu-raytracing is installed");
result = ZeWrapper::initRTASBuilder(hDriver);
if (result == ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE) {
throw_RTCError(RTC_ERROR_LEVEL_ZERO_RAYTRACING_SUPPORT_MISSING, "cannot load ZE_experimental_rtas_builder extension. Please install a recent driver. On Linux, make sure that the package intel-level-zero-gpu-raytracing is installed");
throw_RTCError(RTC_ERROR_LEVEL_ZERO_RAYTRACING_SUPPORT_MISSING, "cannot load ZE_extension_rtas extension. Please install a recent driver. On Linux, make sure that the package intel-level-zero-gpu-raytracing is installed");
}
if (result != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "cannot initialize ZE_experimental_rtas_builder extension");
throw_RTCError(RTC_ERROR_UNKNOWN, "cannot initialize ZE_extension_rtas extension");
if (State::verbosity(1))
{
@@ -684,12 +688,12 @@ namespace embree
}
/* check if extension library can get loaded */
ze_rtas_parallel_operation_exp_handle_t hParallelOperation;
result = ZeWrapper::zeRTASParallelOperationCreateExp(hDriver, &hParallelOperation);
ze_rtas_parallel_operation_ext_handle_t hParallelOperation;
result = ZeWrapper::zeRTASParallelOperationCreateExt(hDriver, &hParallelOperation);
if (result == ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE)
throw_RTCError(RTC_ERROR_UNKNOWN, "Level Zero RTAS Build Extension cannot get loaded");
if (result == ZE_RESULT_SUCCESS)
ZeWrapper::zeRTASParallelOperationDestroyExp(hParallelOperation);
ZeWrapper::zeRTASParallelOperationDestroyExt(hParallelOperation);
gpu_maxWorkGroupSize = getGPUDevice().get_info<sycl::info::device::max_work_group_size>();
gpu_maxComputeUnits = getGPUDevice().get_info<sycl::info::device::max_compute_units>();
@@ -704,7 +708,7 @@ namespace embree
std::cout << std::endl;
}
dispatchGlobalsPtr = zeRTASInitExp(gpu_device, gpu_context);
dispatchGlobalsPtr = zeRTASInit(gpu_device, gpu_context);
}
DeviceGPU::~DeviceGPU()
+4 -1
View File
@@ -209,7 +209,8 @@ namespace embree
unsigned int gpu_maxWorkGroupSize;
unsigned int gpu_maxComputeUnits;
bool hasRelaxedAllocationLimits = false;
public:
void* dispatchGlobalsPtr = nullptr;
@@ -218,6 +219,8 @@ namespace embree
inline sycl::context &getGPUContext() { return gpu_context; }
inline unsigned int getGPUMaxWorkGroupSize() { return gpu_maxWorkGroupSize; }
inline bool relaxedAllocationLimitsSupported() const { return hasRelaxedAllocationLimits; }
void init_rthw_level_zero();
void init_rthw_opencl();
+5877 -439
View File
File diff suppressed because it is too large Load Diff
+61 -61
View File
@@ -35,16 +35,16 @@ static decltype(zeDriverGetExtensionProperties)* zeDriverGetExtensionPropertiesI
static decltype(zeDeviceGetProperties)* zeDeviceGetPropertiesInternal = nullptr;
static decltype(zeDeviceGetModuleProperties)* zeDeviceGetModulePropertiesInternal = nullptr;
static decltype(zeRTASBuilderCreateExp)* zeRTASBuilderCreateExpInternal = nullptr;
static decltype(zeRTASBuilderDestroyExp)* zeRTASBuilderDestroyExpInternal = nullptr;
static decltype(zeDriverRTASFormatCompatibilityCheckExp)* zeDriverRTASFormatCompatibilityCheckExpInternal = nullptr;
static decltype(zeRTASBuilderGetBuildPropertiesExp)* zeRTASBuilderGetBuildPropertiesExpInternal = nullptr;
static decltype(zeRTASBuilderBuildExp)* zeRTASBuilderBuildExpInternal = nullptr;
static decltype(zeRTASBuilderCreateExt)* zeRTASBuilderCreateExtInternal = nullptr;
static decltype(zeRTASBuilderDestroyExt)* zeRTASBuilderDestroyExtInternal = nullptr;
static decltype(zeDriverRTASFormatCompatibilityCheckExt)* zeDriverRTASFormatCompatibilityCheckExtInternal = nullptr;
static decltype(zeRTASBuilderGetBuildPropertiesExt)* zeRTASBuilderGetBuildPropertiesExtInternal = nullptr;
static decltype(zeRTASBuilderBuildExt)* zeRTASBuilderBuildExtInternal = nullptr;
static decltype(zeRTASParallelOperationCreateExp)* zeRTASParallelOperationCreateExpInternal = nullptr;
static decltype(zeRTASParallelOperationDestroyExp)* zeRTASParallelOperationDestroyExpInternal = nullptr;
static decltype(zeRTASParallelOperationGetPropertiesExp)* zeRTASParallelOperationGetPropertiesExpInternal = nullptr;
static decltype(zeRTASParallelOperationJoinExp)* zeRTASParallelOperationJoinExpInternal = nullptr;
static decltype(zeRTASParallelOperationCreateExt)* zeRTASParallelOperationCreateExtInternal = nullptr;
static decltype(zeRTASParallelOperationDestroyExt)* zeRTASParallelOperationDestroyExtInternal = nullptr;
static decltype(zeRTASParallelOperationGetPropertiesExt)* zeRTASParallelOperationGetPropertiesExtInternal = nullptr;
static decltype(zeRTASParallelOperationJoinExt)* zeRTASParallelOperationJoinExtInternal = nullptr;
template<typename T>
T find_symbol(void* handle, std::string const& symbol) {
@@ -94,31 +94,31 @@ ze_result_t selectLevelZeroRTASBuilder(ze_driver_handle_t hDriver)
if (ZeWrapper::rtas_builder_selected)
return ZE_RESULT_SUCCESS;
auto zeRTASBuilderCreateExpTemp = find_symbol<decltype(zeRTASBuilderCreateExp)*>(handle,"zeRTASBuilderCreateExp");
auto zeRTASBuilderDestroyExpTemp = find_symbol<decltype(zeRTASBuilderDestroyExp)*>(handle,"zeRTASBuilderDestroyExp");
auto zeRTASBuilderCreateExtTemp = find_symbol<decltype(zeRTASBuilderCreateExt)*>(handle,"zeRTASBuilderCreateExt");
auto zeRTASBuilderDestroyExtTemp = find_symbol<decltype(zeRTASBuilderDestroyExt)*>(handle,"zeRTASBuilderDestroyExt");
ze_rtas_builder_exp_desc_t builderDesc = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXP_DESC };
ze_rtas_builder_exp_handle_t hBuilder = nullptr;
ze_result_t err = zeRTASBuilderCreateExpTemp(hDriver, &builderDesc, &hBuilder);
ze_rtas_builder_ext_desc_t builderDesc = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXT_DESC, nullptr, ZE_RTAS_BUILDER_EXT_VERSION_CURRENT };
ze_rtas_builder_ext_handle_t hBuilder = nullptr;
ze_result_t err = zeRTASBuilderCreateExtTemp(hDriver, &builderDesc, &hBuilder);
/* when ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE is reported extension cannot get loaded */
if (err == ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE)
return err;
if (err == ZE_RESULT_SUCCESS)
zeRTASBuilderDestroyExpTemp(hBuilder);
zeRTASBuilderDestroyExtTemp(hBuilder);
zeRTASBuilderCreateExpInternal = zeRTASBuilderCreateExpTemp;
zeRTASBuilderDestroyExpInternal = zeRTASBuilderDestroyExpTemp;
zeRTASBuilderCreateExtInternal = zeRTASBuilderCreateExtTemp;
zeRTASBuilderDestroyExtInternal = zeRTASBuilderDestroyExtTemp;
zeDriverRTASFormatCompatibilityCheckExpInternal = find_symbol<decltype(zeDriverRTASFormatCompatibilityCheckExp)*>(handle,"zeDriverRTASFormatCompatibilityCheckExp");
zeRTASBuilderGetBuildPropertiesExpInternal = find_symbol<decltype(zeRTASBuilderGetBuildPropertiesExp)*>(handle,"zeRTASBuilderGetBuildPropertiesExp");
zeRTASBuilderBuildExpInternal = find_symbol<decltype(zeRTASBuilderBuildExp)*>(handle,"zeRTASBuilderBuildExp");
zeDriverRTASFormatCompatibilityCheckExtInternal = find_symbol<decltype(zeDriverRTASFormatCompatibilityCheckExt)*>(handle,"zeDriverRTASFormatCompatibilityCheckExt");
zeRTASBuilderGetBuildPropertiesExtInternal = find_symbol<decltype(zeRTASBuilderGetBuildPropertiesExt)*>(handle,"zeRTASBuilderGetBuildPropertiesExt");
zeRTASBuilderBuildExtInternal = find_symbol<decltype(zeRTASBuilderBuildExt)*>(handle,"zeRTASBuilderBuildExt");
zeRTASParallelOperationCreateExpInternal = find_symbol<decltype(zeRTASParallelOperationCreateExp)*>(handle,"zeRTASParallelOperationCreateExp");
zeRTASParallelOperationDestroyExpInternal = find_symbol<decltype(zeRTASParallelOperationDestroyExp)*>(handle,"zeRTASParallelOperationDestroyExp");
zeRTASParallelOperationGetPropertiesExpInternal = find_symbol<decltype(zeRTASParallelOperationGetPropertiesExp)*>(handle,"zeRTASParallelOperationGetPropertiesExp");
zeRTASParallelOperationJoinExpInternal = find_symbol<decltype(zeRTASParallelOperationJoinExp)*>(handle,"zeRTASParallelOperationJoinExp");
zeRTASParallelOperationCreateExtInternal = find_symbol<decltype(zeRTASParallelOperationCreateExt)*>(handle,"zeRTASParallelOperationCreateExt");
zeRTASParallelOperationDestroyExtInternal = find_symbol<decltype(zeRTASParallelOperationDestroyExt)*>(handle,"zeRTASParallelOperationDestroyExt");
zeRTASParallelOperationGetPropertiesExtInternal = find_symbol<decltype(zeRTASParallelOperationGetPropertiesExt)*>(handle,"zeRTASParallelOperationGetPropertiesExt");
zeRTASParallelOperationJoinExtInternal = find_symbol<decltype(zeRTASParallelOperationJoinExt)*>(handle,"zeRTASParallelOperationJoinExt");
ZeWrapper::rtas_builder_selected = true;
return ZE_RESULT_SUCCESS;
@@ -214,12 +214,12 @@ ze_result_t validate(ze_device_handle_t hDevice)
return ZE_RESULT_SUCCESS;
}
ze_result_t validate(ze_rtas_device_exp_properties_t* pProperties)
{
ze_result_t validate(ze_rtas_device_ext_properties_t* pProperties)
{
if (pProperties == nullptr)
return ZE_RESULT_ERROR_INVALID_NULL_POINTER;
if (pProperties->stype != ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXP_PROPERTIES)
if (pProperties->stype != ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXT_PROPERTIES)
return ZE_RESULT_ERROR_INVALID_ENUMERATION;
//if (!checkDescChain((zet_base_desc_t_*)pProperties))
@@ -244,84 +244,84 @@ ze_result_t ZeWrapper::zeDeviceGetModuleProperties(ze_device_handle_t ze_handle,
return zeDeviceGetModulePropertiesInternal(ze_handle, props);
}
ze_result_t ZeWrapper::zeRTASBuilderCreateExp(ze_driver_handle_t hDriver, const ze_rtas_builder_exp_desc_t *pDescriptor, ze_rtas_builder_exp_handle_t *phBuilder)
ze_result_t ZeWrapper::zeRTASBuilderCreateExt(ze_driver_handle_t hDriver, const ze_rtas_builder_ext_desc_t *pDescriptor, ze_rtas_builder_ext_handle_t *phBuilder)
{
if (!handle || !zeRTASBuilderCreateExpInternal)
if (!handle || !zeRTASBuilderCreateExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASBuilderCreateExpInternal(hDriver,pDescriptor,phBuilder);
return zeRTASBuilderCreateExtInternal(hDriver,pDescriptor,phBuilder);
}
ze_result_t ZeWrapper::zeRTASBuilderDestroyExp(ze_rtas_builder_exp_handle_t hBuilder)
ze_result_t ZeWrapper::zeRTASBuilderDestroyExt(ze_rtas_builder_ext_handle_t hBuilder)
{
if (!handle || !zeRTASBuilderDestroyExpInternal)
if (!handle || !zeRTASBuilderDestroyExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASBuilderDestroyExpInternal(hBuilder);
return zeRTASBuilderDestroyExtInternal(hBuilder);
}
ze_result_t ZeWrapper::zeDriverRTASFormatCompatibilityCheckExp( ze_driver_handle_t hDriver,
const ze_rtas_format_exp_t accelFormat,
const ze_rtas_format_exp_t otherAccelFormat)
ze_result_t ZeWrapper::zeDriverRTASFormatCompatibilityCheckExt(ze_driver_handle_t hDriver,
const ze_rtas_format_ext_t accelFormat,
const ze_rtas_format_ext_t otherAccelFormat)
{
if (!handle || !zeDriverRTASFormatCompatibilityCheckExpInternal)
if (!handle || !zeDriverRTASFormatCompatibilityCheckExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeDriverRTASFormatCompatibilityCheckExpInternal( hDriver, accelFormat, otherAccelFormat);
return zeDriverRTASFormatCompatibilityCheckExtInternal(hDriver, accelFormat, otherAccelFormat);
}
ze_result_t ZeWrapper::zeRTASBuilderGetBuildPropertiesExp(ze_rtas_builder_exp_handle_t hBuilder,
const ze_rtas_builder_build_op_exp_desc_t* args,
ze_rtas_builder_exp_properties_t* pProp)
ze_result_t ZeWrapper::zeRTASBuilderGetBuildPropertiesExt(ze_rtas_builder_ext_handle_t hBuilder,
const ze_rtas_builder_build_op_ext_desc_t* args,
ze_rtas_builder_ext_properties_t* pProp)
{
if (!handle || !zeRTASBuilderGetBuildPropertiesExpInternal)
if (!handle || !zeRTASBuilderGetBuildPropertiesExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASBuilderGetBuildPropertiesExpInternal(hBuilder, args, pProp);
return zeRTASBuilderGetBuildPropertiesExtInternal(hBuilder, args, pProp);
}
ze_result_t ZeWrapper::zeRTASBuilderBuildExp(ze_rtas_builder_exp_handle_t hBuilder,
const ze_rtas_builder_build_op_exp_desc_t* args,
ze_result_t ZeWrapper::zeRTASBuilderBuildExt(ze_rtas_builder_ext_handle_t hBuilder,
const ze_rtas_builder_build_op_ext_desc_t* args,
void *pScratchBuffer, size_t scratchBufferSizeBytes,
void *pRtasBuffer, size_t rtasBufferSizeBytes,
ze_rtas_parallel_operation_exp_handle_t hParallelOperation,
void *pBuildUserPtr, ze_rtas_aabb_exp_t *pBounds, size_t *pRtasBufferSizeBytes)
ze_rtas_parallel_operation_ext_handle_t hParallelOperation,
void *pBuildUserPtr, ze_rtas_aabb_ext_t *pBounds, size_t *pRtasBufferSizeBytes)
{
if (!handle || !zeRTASBuilderBuildExpInternal)
if (!handle || !zeRTASBuilderBuildExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASBuilderBuildExpInternal(hBuilder, args, pScratchBuffer, scratchBufferSizeBytes, pRtasBuffer, rtasBufferSizeBytes,
return zeRTASBuilderBuildExtInternal(hBuilder, args, pScratchBuffer, scratchBufferSizeBytes, pRtasBuffer, rtasBufferSizeBytes,
hParallelOperation, pBuildUserPtr, pBounds, pRtasBufferSizeBytes);
}
ze_result_t ZeWrapper::zeRTASParallelOperationCreateExp(ze_driver_handle_t hDriver, ze_rtas_parallel_operation_exp_handle_t* phParallelOperation)
ze_result_t ZeWrapper::zeRTASParallelOperationCreateExt(ze_driver_handle_t hDriver, ze_rtas_parallel_operation_ext_handle_t* phParallelOperation)
{
if (!handle || !zeRTASParallelOperationCreateExpInternal)
if (!handle || !zeRTASParallelOperationCreateExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASParallelOperationCreateExpInternal(hDriver, phParallelOperation);
return zeRTASParallelOperationCreateExtInternal(hDriver, phParallelOperation);
}
ze_result_t ZeWrapper::zeRTASParallelOperationDestroyExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation )
ze_result_t ZeWrapper::zeRTASParallelOperationDestroyExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation)
{
if (!handle || !zeRTASParallelOperationDestroyExpInternal)
if (!handle || !zeRTASParallelOperationDestroyExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASParallelOperationDestroyExpInternal( hParallelOperation );
return zeRTASParallelOperationDestroyExtInternal(hParallelOperation);
};
ze_result_t ZeWrapper::zeRTASParallelOperationGetPropertiesExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation, ze_rtas_parallel_operation_exp_properties_t* pProperties )
ze_result_t ZeWrapper::zeRTASParallelOperationGetPropertiesExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation, ze_rtas_parallel_operation_ext_properties_t* pProperties)
{
if (!handle || !zeRTASParallelOperationGetPropertiesExpInternal)
if (!handle || !zeRTASParallelOperationGetPropertiesExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASParallelOperationGetPropertiesExpInternal( hParallelOperation, pProperties );
return zeRTASParallelOperationGetPropertiesExtInternal(hParallelOperation, pProperties);
}
ze_result_t ZeWrapper::zeRTASParallelOperationJoinExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation)
ze_result_t ZeWrapper::zeRTASParallelOperationJoinExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation)
{
if (!handle || !zeRTASParallelOperationJoinExpInternal)
if (!handle || !zeRTASParallelOperationJoinExtInternal)
throw std::runtime_error("ZeWrapper not initialized, call ZeWrapper::init() first.");
return zeRTASParallelOperationJoinExpInternal(hParallelOperation);
return zeRTASParallelOperationJoinExtInternal(hParallelOperation);
}
+16 -20
View File
@@ -5,10 +5,6 @@
#include "ze_api.h"
#if !defined(ZE_RTAS_BUILDER_EXP_NAME)
#include "ze_rtas.h"
#endif
//////////////////////
// Debug extension
@@ -40,25 +36,25 @@ struct ZeWrapper
static ze_result_t zeDeviceGetProperties(ze_device_handle_t, ze_device_properties_t*);
static ze_result_t zeDeviceGetModuleProperties(ze_device_handle_t, ze_device_module_properties_t*);
static ze_result_t zeRTASBuilderCreateExp(ze_driver_handle_t hDriver, const ze_rtas_builder_exp_desc_t *pDescriptor, ze_rtas_builder_exp_handle_t *phBuilder);
static ze_result_t zeRTASBuilderDestroyExp(ze_rtas_builder_exp_handle_t hBuilder);
static ze_result_t zeDriverRTASFormatCompatibilityCheckExp( ze_driver_handle_t hDriver,
const ze_rtas_format_exp_t accelFormat,
const ze_rtas_format_exp_t otherAccelFormat);
static ze_result_t zeRTASBuilderGetBuildPropertiesExp(ze_rtas_builder_exp_handle_t hBuilder,
const ze_rtas_builder_build_op_exp_desc_t* args,
ze_rtas_builder_exp_properties_t* pProp);
static ze_result_t zeRTASBuilderBuildExp(ze_rtas_builder_exp_handle_t hBuilder,
const ze_rtas_builder_build_op_exp_desc_t* args,
static ze_result_t zeRTASBuilderCreateExt(ze_driver_handle_t hDriver, const ze_rtas_builder_ext_desc_t *pDescriptor, ze_rtas_builder_ext_handle_t *phBuilder);
static ze_result_t zeRTASBuilderDestroyExt(ze_rtas_builder_ext_handle_t hBuilder);
static ze_result_t zeDriverRTASFormatCompatibilityCheckExt(ze_driver_handle_t hDriver,
const ze_rtas_format_ext_t accelFormat,
const ze_rtas_format_ext_t otherAccelFormat);
static ze_result_t zeRTASBuilderGetBuildPropertiesExt(ze_rtas_builder_ext_handle_t hBuilder,
const ze_rtas_builder_build_op_ext_desc_t* args,
ze_rtas_builder_ext_properties_t* pProp);
static ze_result_t zeRTASBuilderBuildExt(ze_rtas_builder_ext_handle_t hBuilder,
const ze_rtas_builder_build_op_ext_desc_t* args,
void *pScratchBuffer, size_t scratchBufferSizeBytes,
void *pRtasBuffer, size_t rtasBufferSizeBytes,
ze_rtas_parallel_operation_exp_handle_t hParallelOperation,
void *pBuildUserPtr, ze_rtas_aabb_exp_t *pBounds, size_t *pRtasBufferSizeBytes);
ze_rtas_parallel_operation_ext_handle_t hParallelOperation,
void *pBuildUserPtr, ze_rtas_aabb_ext_t *pBounds, size_t *pRtasBufferSizeBytes);
static ze_result_t zeRTASParallelOperationCreateExp(ze_driver_handle_t hDriver, ze_rtas_parallel_operation_exp_handle_t* phParallelOperation);
static ze_result_t zeRTASParallelOperationDestroyExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation );
static ze_result_t zeRTASParallelOperationGetPropertiesExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation, ze_rtas_parallel_operation_exp_properties_t* pProperties );
static ze_result_t zeRTASParallelOperationJoinExp( ze_rtas_parallel_operation_exp_handle_t hParallelOperation);
static ze_result_t zeRTASParallelOperationCreateExt(ze_driver_handle_t hDriver, ze_rtas_parallel_operation_ext_handle_t* phParallelOperation);
static ze_result_t zeRTASParallelOperationDestroyExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation);
static ze_result_t zeRTASParallelOperationGetPropertiesExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation, ze_rtas_parallel_operation_ext_properties_t* pProperties);
static ze_result_t zeRTASParallelOperationJoinExt(ze_rtas_parallel_operation_ext_handle_t hParallelOperation);
static bool rtas_builder_selected;
};
+151 -122
View File
@@ -45,7 +45,7 @@ namespace embree
}
};
void* zeRTASInitExp(sycl::device device, sycl::context context)
void* zeRTASInit(sycl::device device, sycl::context context)
{
if (ZeWrapper::init() != ZE_RESULT_SUCCESS)
return nullptr;
@@ -114,10 +114,10 @@ namespace embree
{
//std::cout << extensions[i].name << " version " << extensions[i].version << std::endl;
if (strncmp("ZE_extension_raytracing",extensions[i].name,sizeof(extensions[i].name)) == 0)
if (strncmp(ZE_RAYTRACING_EXT_NAME,extensions[i].name,sizeof(extensions[i].name)) == 0)
ze_extension_ray_tracing = true;
if (strncmp("ZE_experimental_rtas_builder",extensions[i].name,sizeof(extensions[i].name)) == 0)
if (strncmp(ZE_RTAS_EXT_NAME,extensions[i].name,sizeof(extensions[i].name)) == 0)
ze_rtas_builder = true;
}
if (!ze_extension_ray_tracing)
@@ -172,12 +172,34 @@ namespace embree
return pvc;
}
static bool hasDriverExtension(ze_driver_handle_t hDriver, const char* extensionName)
{
uint32_t count = 0;
ze_result_t result = ZeWrapper::zeDriverGetExtensionProperties(hDriver, &count, nullptr);
if (result != ZE_RESULT_SUCCESS)
return false;
std::vector<ze_driver_extension_properties_t> extensions(count);
result = ZeWrapper::zeDriverGetExtensionProperties(hDriver, &count, extensions.data());
if (result != ZE_RESULT_SUCCESS)
return false;
for (uint32_t i = 0; i < count; i++)
{
if (strncmp(extensionName, extensions[i].name, sizeof(extensions[i].name)) == 0)
return true;
}
return false;
}
void* rthwifAllocAccelBuffer(Device* embree_device, size_t bytes, sycl::device device, sycl::context context, sycl::usm::alloc alloc_type)
{
ze_context_handle_t hContext = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(context);
ze_device_handle_t hDevice = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(device);
sycl::platform platform = device.get_platform();
ze_driver_handle_t hDriver = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(platform);
ze_rtas_device_exp_properties_t rtasProp = { ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXP_PROPERTIES };
ze_rtas_device_ext_properties_t rtasProp = { ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXT_PROPERTIES };
ze_device_properties_t devProp = { ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES, &rtasProp };
ze_result_t err = ZeWrapper::zeDeviceGetProperties(hDevice, &devProp );
if (err != ZE_RESULT_SUCCESS)
@@ -192,10 +214,17 @@ namespace embree
relaxed.stype = ZE_STRUCTURE_TYPE_RELAXED_ALLOCATION_LIMITS_EXP_DESC;
relaxed.pNext = &rt_desc;
relaxed.flags = ZE_RELAXED_ALLOCATION_LIMITS_EXP_FLAG_MAX_SIZE;
bool hasRelaxedAllocationLimits = false;
if (embree_device) {
DeviceGPU* gpu_device = dynamic_cast<DeviceGPU*>(embree_device);
if (gpu_device)
hasRelaxedAllocationLimits = gpu_device->relaxedAllocationLimitsSupported();
}
ze_memory_compression_hints_ext_desc_t compressed;
compressed.stype = ZE_STRUCTURE_TYPE_MEMORY_COMPRESSION_HINTS_EXT_DESC;
compressed.pNext = &relaxed;
compressed.pNext = hasRelaxedAllocationLimits ? (void*) &relaxed : (void*) &rt_desc;
compressed.flags = ZE_MEMORY_COMPRESSION_HINTS_EXT_FLAG_UNCOMPRESSED;
ze_device_mem_alloc_desc_t device_desc;
@@ -251,27 +280,27 @@ namespace embree
throw_RTCError(RTC_ERROR_OUT_OF_MEMORY,"rtas memory free failed");
}
struct GEOMETRY_INSTANCE_DESC : ze_rtas_builder_instance_geometry_info_exp_t
struct GEOMETRY_INSTANCE_DESC : ze_rtas_builder_instance_geometry_info_ext_t
{
ze_rtas_transform_float3x4_aligned_column_major_exp_t xfmdata;
ze_rtas_transform_float3x4_aligned_column_major_ext_t xfmdata;
};
struct GEOMETRY_TYPE
{
GEOMETRY_TYPE(ze_rtas_builder_geometry_type_exp_t type, size_t extraBytes = 0)
GEOMETRY_TYPE(ze_rtas_builder_geometry_type_ext_t type, size_t extraBytes = 0)
: type(type), extraBytes(extraBytes) {}
ze_rtas_builder_geometry_type_exp_t type;
ze_rtas_builder_geometry_type_ext_t type;
size_t extraBytes;
};
size_t sizeof_RTHWIF_GEOMETRY(GEOMETRY_TYPE type)
{
switch (type.type) {
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_TRIANGLES : return sizeof(ze_rtas_builder_triangles_geometry_info_exp_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_QUADS : return sizeof(ze_rtas_builder_quads_geometry_info_exp_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL: return sizeof(ze_rtas_builder_procedural_geometry_info_exp_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE : return sizeof(ze_rtas_builder_instance_geometry_info_exp_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_TRIANGLES : return sizeof(ze_rtas_builder_triangles_geometry_info_ext_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_QUADS : return sizeof(ze_rtas_builder_quads_geometry_info_ext_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL: return sizeof(ze_rtas_builder_procedural_geometry_info_ext_t)+type.extraBytes;
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE : return sizeof(ze_rtas_builder_instance_geometry_info_ext_t)+type.extraBytes;
default: assert(false); return 0;
}
}
@@ -279,69 +308,69 @@ namespace embree
size_t alignof_RTHWIF_GEOMETRY(GEOMETRY_TYPE type)
{
switch (type.type) {
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_TRIANGLES : return alignof(ze_rtas_builder_triangles_geometry_info_exp_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_QUADS : return alignof(ze_rtas_builder_quads_geometry_info_exp_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL: return alignof(ze_rtas_builder_procedural_geometry_info_exp_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE : return alignof(ze_rtas_builder_instance_geometry_info_exp_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_TRIANGLES : return alignof(ze_rtas_builder_triangles_geometry_info_ext_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_QUADS : return alignof(ze_rtas_builder_quads_geometry_info_ext_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL: return alignof(ze_rtas_builder_procedural_geometry_info_ext_t);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE : return alignof(ze_rtas_builder_instance_geometry_info_ext_t);
default: assert(false); return 0;
}
}
ze_rtas_builder_geometry_exp_flags_t getGeometryFlags(Scene* scene, Geometry* geom)
ze_rtas_builder_geometry_ext_flags_t getGeometryFlags(Scene* scene, Geometry* geom)
{
/* invoke any hit callback when Embree filter functions are present */
ze_rtas_builder_geometry_exp_flags_t gflags = 0;
ze_rtas_builder_geometry_ext_flags_t gflags = 0;
if (geom->hasArgumentFilterFunctions() || geom->hasGeometryFilterFunctions())
gflags = ZE_RTAS_BUILDER_GEOMETRY_EXP_FLAG_NON_OPAQUE;
gflags = ZE_RTAS_BUILDER_GEOMETRY_EXT_FLAG_NON_OPAQUE;
#if defined(EMBREE_RAY_MASK)
/* invoke any hit callback when high mask bits are enabled */
if (geom->mask & 0xFFFFFF80)
gflags = ZE_RTAS_BUILDER_GEOMETRY_EXP_FLAG_NON_OPAQUE;
gflags = ZE_RTAS_BUILDER_GEOMETRY_EXT_FLAG_NON_OPAQUE;
#endif
return gflags;
}
void createGeometryDesc(ze_rtas_builder_triangles_geometry_info_exp_t* out, Scene* scene, TriangleMesh* geom)
void createGeometryDesc(ze_rtas_builder_triangles_geometry_info_ext_t* out, Scene* scene, TriangleMesh* geom)
{
memset(out,0,sizeof(ze_rtas_builder_triangles_geometry_info_exp_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_TRIANGLES;
memset(out,0,sizeof(ze_rtas_builder_triangles_geometry_info_ext_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_TRIANGLES;
out->geometryFlags = getGeometryFlags(scene,geom);
out->geometryMask = mask32_to_mask8(geom->mask);
out->triangleFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_TRIANGLE_INDICES_UINT32;
out->vertexFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_FLOAT3;
out->pTriangleBuffer = (ze_rtas_triangle_indices_uint32_exp_t*) geom->triangles.getPtr();
out->triangleFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_TRIANGLE_INDICES_UINT32;
out->vertexFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_FLOAT3;
out->pTriangleBuffer = (ze_rtas_triangle_indices_uint32_ext_t*) geom->triangles.getPtr();
out->triangleCount = geom->triangles.size();
out->triangleStride = geom->triangles.getStride();
out->pVertexBuffer = (ze_rtas_float3_exp_t*) geom->vertices0.getPtr();
out->pVertexBuffer = (ze_rtas_float3_ext_t*) geom->vertices0.getPtr();
out->vertexCount = geom->vertices0.size();
out->vertexStride = geom->vertices0.getStride();
}
void createGeometryDesc(ze_rtas_builder_quads_geometry_info_exp_t* out, Scene* scene, QuadMesh* geom)
void createGeometryDesc(ze_rtas_builder_quads_geometry_info_ext_t* out, Scene* scene, QuadMesh* geom)
{
memset(out,0,sizeof(ze_rtas_builder_quads_geometry_info_exp_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_QUADS;
memset(out,0,sizeof(ze_rtas_builder_quads_geometry_info_ext_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_QUADS;
out->geometryFlags = getGeometryFlags(scene,geom);
out->geometryMask = mask32_to_mask8(geom->mask);
out->quadFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_QUAD_INDICES_UINT32;
out->vertexFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_FLOAT3;
out->pQuadBuffer = (ze_rtas_quad_indices_uint32_exp_t*) geom->quads.getPtr();
out->quadFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_QUAD_INDICES_UINT32;
out->vertexFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_FLOAT3;
out->pQuadBuffer = (ze_rtas_quad_indices_uint32_ext_t*) geom->quads.getPtr();
out->quadCount = geom->quads.size();
out->quadStride = geom->quads.getStride();
out->pVertexBuffer = (ze_rtas_float3_exp_t*) geom->vertices0.getPtr();
out->pVertexBuffer = (ze_rtas_float3_ext_t*) geom->vertices0.getPtr();
out->vertexCount = geom->vertices0.size();
out->vertexStride = geom->vertices0.getStride();
}
void getProceduralAABB(ze_rtas_geometry_aabbs_exp_cb_params_t* params)
void getProceduralAABB(ze_rtas_geometry_aabbs_ext_cb_params_t* params)
{
assert(params->stype == ZE_STRUCTURE_TYPE_RTAS_GEOMETRY_AABBS_EXP_CB_PARAMS);
assert(params->stype == ZE_STRUCTURE_TYPE_RTAS_GEOMETRY_AABBS_EXT_CB_PARAMS);
BBox1f time_range = * (BBox1f*) params->pBuildUserPtr;
Geometry* geom = (Geometry*) params->pGeomUserPtr;
ze_rtas_aabb_exp_t* boundsOut = params->pBoundsOut;
ze_rtas_aabb_ext_t* boundsOut = params->pBoundsOut;
for (uint32_t i=0; i<params->primIDCount; i++)
{
@@ -379,14 +408,14 @@ namespace embree
}
};
void createGeometryDescProcedural(ze_rtas_builder_procedural_geometry_info_exp_t* out, Scene* scene, Geometry* geom)
void createGeometryDescProcedural(ze_rtas_builder_procedural_geometry_info_ext_t* out, Scene* scene, Geometry* geom)
{
uint32_t numPrimitives = geom->size();
if (GridMesh* mesh = dynamic_cast<GridMesh*>(geom))
numPrimitives = mesh->getNumTotalQuads(); // FIXME: slow
memset(out,0,sizeof(ze_rtas_builder_procedural_geometry_info_exp_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL;
memset(out,0,sizeof(ze_rtas_builder_procedural_geometry_info_ext_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL;
out->geometryFlags = 0;
out->geometryMask = mask32_to_mask8(geom->mask);
out->primCount = numPrimitives;
@@ -398,64 +427,64 @@ namespace embree
{
assert(geom->gsubtype == AccelSet::GTY_SUBTYPE_INSTANCE_QUATERNION);
memset(out,0,sizeof(GEOMETRY_INSTANCE_DESC));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE;
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE;
out->instanceFlags = 0;
out->geometryMask = mask32_to_mask8(geom->mask);
out->instanceUserID = 0;
const AffineSpace3fa local2world = geom->getLocal2World();
out->transformFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_FLOAT3X4_ALIGNED_COLUMN_MAJOR;
out->transformFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_FLOAT3X4_ALIGNED_COLUMN_MAJOR;
out->pTransform = (float*) &out->xfmdata;
out->pBounds = (ze_rtas_aabb_exp_t*) &dynamic_cast<Scene*>(geom->object)->accelBuffer.getBounds();
out->xfmdata = *(ze_rtas_transform_float3x4_aligned_column_major_exp_t*) &local2world;
out->pBounds = (ze_rtas_aabb_ext_t*) &dynamic_cast<Scene*>(geom->object)->accelBuffer.getBounds();
out->xfmdata = *(ze_rtas_transform_float3x4_aligned_column_major_ext_t*) &local2world;
out->pAccelerationStructure = dynamic_cast<Scene*>(geom->object)->accelBuffer.getAccelBufferDeviceData(0);
}
void createGeometryDesc(ze_rtas_builder_instance_geometry_info_exp_t* out, Scene* scene, Instance* geom)
void createGeometryDesc(ze_rtas_builder_instance_geometry_info_ext_t* out, Scene* scene, Instance* geom)
{
assert(geom->gsubtype == AccelSet::GTY_SUBTYPE_DEFAULT);
memset(out,0,sizeof(ze_rtas_builder_instance_geometry_info_exp_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE;
memset(out,0,sizeof(ze_rtas_builder_instance_geometry_info_ext_t));
out->geometryType = ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE;
out->instanceFlags = 0;
out->geometryMask = mask32_to_mask8(geom->mask);
out->instanceUserID = 0;
out->transformFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXP_FLOAT3X4_ALIGNED_COLUMN_MAJOR;
out->transformFormat = ZE_RTAS_BUILDER_INPUT_DATA_FORMAT_EXT_FLOAT3X4_ALIGNED_COLUMN_MAJOR;
out->pTransform = (float*) &geom->local2world[0];
out->pBounds = (ze_rtas_aabb_exp_t*) &dynamic_cast<Scene*>(geom->object)->accelBuffer.getBounds();
out->pBounds = (ze_rtas_aabb_ext_t*) &dynamic_cast<Scene*>(geom->object)->accelBuffer.getBounds();
out->pAccelerationStructure = dynamic_cast<Scene*>(geom->object)->accelBuffer.getAccelBufferDeviceData(0);
}
void createGeometryDesc(char* out, Scene* scene, Geometry* geom, GEOMETRY_TYPE type)
{
switch (type.type) {
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_TRIANGLES : return createGeometryDesc((ze_rtas_builder_triangles_geometry_info_exp_t*)out,scene,dynamic_cast<TriangleMesh*>(geom));
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_QUADS : return createGeometryDesc((ze_rtas_builder_quads_geometry_info_exp_t*)out,scene,dynamic_cast<QuadMesh*>(geom));
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL: return createGeometryDescProcedural((ze_rtas_builder_procedural_geometry_info_exp_t*)out,scene,geom);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE:
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_TRIANGLES : return createGeometryDesc((ze_rtas_builder_triangles_geometry_info_ext_t*)out,scene,dynamic_cast<TriangleMesh*>(geom));
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_QUADS : return createGeometryDesc((ze_rtas_builder_quads_geometry_info_ext_t*)out,scene,dynamic_cast<QuadMesh*>(geom));
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL: return createGeometryDescProcedural((ze_rtas_builder_procedural_geometry_info_ext_t*)out,scene,geom);
case ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE:
if (type.extraBytes) return createGeometryDesc((GEOMETRY_INSTANCE_DESC*)out,scene,dynamic_cast<Instance*>(geom));
else return createGeometryDesc((ze_rtas_builder_instance_geometry_info_exp_t*)out,scene,dynamic_cast<Instance*>(geom));
else return createGeometryDesc((ze_rtas_builder_instance_geometry_info_ext_t*)out,scene,dynamic_cast<Instance*>(geom));
default: assert(false);
}
}
ze_rtas_builder_build_quality_hint_exp_t convertBuildQuality(RTCBuildQuality quality_flags)
ze_rtas_builder_build_quality_hint_ext_t convertBuildQuality(RTCBuildQuality quality_flags)
{
switch (quality_flags) {
case RTC_BUILD_QUALITY_LOW : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXP_LOW;
case RTC_BUILD_QUALITY_MEDIUM : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXP_MEDIUM;
case RTC_BUILD_QUALITY_HIGH : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXP_HIGH;
case RTC_BUILD_QUALITY_REFIT : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXP_LOW;
default : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXP_MEDIUM;
case RTC_BUILD_QUALITY_LOW : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXT_LOW;
case RTC_BUILD_QUALITY_MEDIUM : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXT_MEDIUM;
case RTC_BUILD_QUALITY_HIGH : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXT_HIGH;
case RTC_BUILD_QUALITY_REFIT : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXT_LOW;
default : return ZE_RTAS_BUILDER_BUILD_QUALITY_HINT_EXT_MEDIUM;
}
}
ze_rtas_builder_build_op_exp_flags_t convertBuildFlags(RTCSceneFlags scene_flags, RTCBuildQuality quality_flags)
ze_rtas_builder_build_op_ext_flags_t convertBuildFlags(RTCSceneFlags scene_flags, RTCBuildQuality quality_flags)
{
ze_rtas_builder_build_op_exp_flags_t result = 0;
if (scene_flags & RTC_SCENE_FLAG_COMPACT) result |= ZE_RTAS_BUILDER_BUILD_OP_EXP_FLAG_COMPACT;
ze_rtas_builder_build_op_ext_flags_t result = 0;
if (scene_flags & RTC_SCENE_FLAG_COMPACT) result |= ZE_RTAS_BUILDER_BUILD_OP_EXT_FLAG_COMPACT;
/* only in high quality build mode spatial splits are allowed in Embree */
if (quality_flags != RTC_BUILD_QUALITY_HIGH)
result |= ZE_RTAS_BUILDER_BUILD_OP_EXP_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION;
result |= ZE_RTAS_BUILDER_BUILD_OP_EXT_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION;
return result;
}
@@ -474,9 +503,9 @@ namespace embree
ze_driver_handle_t hDriver = sycl::get_native<sycl::backend::ext_oneapi_level_zero>(platform);
/* create L0 builder object */
ze_rtas_builder_exp_desc_t builderDesc = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXP_DESC };
ze_rtas_builder_exp_handle_t hBuilder = nullptr;
ze_result_t err = ZeWrapper::zeRTASBuilderCreateExp(hDriver, &builderDesc, &hBuilder);
ze_rtas_builder_ext_desc_t builderDesc = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXT_DESC, nullptr, ZE_RTAS_BUILDER_EXT_VERSION_CURRENT };
ze_rtas_builder_ext_handle_t hBuilder = nullptr;
ze_result_t err = ZeWrapper::zeRTASBuilderCreateExt(hDriver, &builderDesc, &hBuilder);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "ze_rtas_builder creation failed");
@@ -484,59 +513,59 @@ namespace embree
{
/* no HW support for MB yet */
if (scene->get(geomID)->numTimeSegments() > 0)
return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL;
return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL;
switch (scene->get(geomID)->getType()) {
case Geometry::GTY_FLAT_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ROUND_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_LINEAR_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_CONE_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_FLAT_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ROUND_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_LINEAR_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_CONE_LINEAR_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_FLAT_BEZIER_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ROUND_BEZIER_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_BEZIER_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_FLAT_BEZIER_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ROUND_BEZIER_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_BEZIER_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_FLAT_BSPLINE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ROUND_BSPLINE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_BSPLINE_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_FLAT_BSPLINE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ROUND_BSPLINE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_BSPLINE_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_FLAT_HERMITE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ROUND_HERMITE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_HERMITE_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_FLAT_HERMITE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ROUND_HERMITE_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_HERMITE_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_FLAT_CATMULL_ROM_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ROUND_CATMULL_ROM_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_CATMULL_ROM_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_FLAT_CATMULL_ROM_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ROUND_CATMULL_ROM_CURVE : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_CATMULL_ROM_CURVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_TRIANGLE_MESH: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_TRIANGLES; break;
case Geometry::GTY_QUAD_MESH : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_QUADS; break;
case Geometry::GTY_GRID_MESH : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_SUBDIV_MESH : assert(false); return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_TRIANGLE_MESH: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_TRIANGLES; break;
case Geometry::GTY_QUAD_MESH : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_QUADS; break;
case Geometry::GTY_GRID_MESH : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_SUBDIV_MESH : assert(false); return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_SPHERE_POINT : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_DISC_POINT : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_DISC_POINT: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_SPHERE_POINT : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_DISC_POINT : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_ORIENTED_DISC_POINT: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_USER_GEOMETRY : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_INSTANCE_ARRAY : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_USER_GEOMETRY : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_INSTANCE_ARRAY : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
#if RTC_MAX_INSTANCE_LEVEL_COUNT < 2
case Geometry::GTY_INSTANCE_CHEAP :
case Geometry::GTY_INSTANCE_EXPENSIVE: {
Instance* instance = scene->get<Instance>(geomID);
Scene* instanced_scene = (Scene*)instance->object;
if (instanced_scene->hasMotionBlur()) return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; // we need to handle instances in procedural mode if instanced scene has motion blur
if (instance->mask & 0xFFFFFF80) return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; // we need to handle instances in procedural mode if high mask bits are set
if (instanced_scene->hasMotionBlur()) return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; // we need to handle instances in procedural mode if instanced scene has motion blur
if (instance->mask & 0xFFFFFF80) return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; // we need to handle instances in procedural mode if high mask bits are set
else if (instance->gsubtype == AccelSet::GTY_SUBTYPE_INSTANCE_QUATERNION)
return GEOMETRY_TYPE(ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE,sizeof(GEOMETRY_INSTANCE_DESC)-sizeof(ze_rtas_builder_instance_geometry_info_exp_t));
else return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_INSTANCE;
return GEOMETRY_TYPE(ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE,sizeof(GEOMETRY_INSTANCE_DESC)-sizeof(ze_rtas_builder_instance_geometry_info_ext_t));
else return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_INSTANCE;
}
#else
case Geometry::GTY_INSTANCE_CHEAP : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_INSTANCE_EXPENSIVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL; break;
case Geometry::GTY_INSTANCE_CHEAP : return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
case Geometry::GTY_INSTANCE_EXPENSIVE: return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL; break;
#endif
default: assert(false); return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXP_PROCEDURAL;
default: assert(false); return ZE_RTAS_BUILDER_GEOMETRY_TYPE_EXT_PROCEDURAL;
}
};
@@ -560,7 +589,7 @@ namespace embree
}
/* fill geomdesc buffers */
mvector<ze_rtas_builder_geometry_info_exp_t*> geomDescr(scene->device, scene->size());
mvector<ze_rtas_builder_geometry_info_ext_t*> geomDescr(scene->device, scene->size());
mvector<char> geomDescrData(scene->device,totalBytes);
size_t offset = 0;
@@ -573,17 +602,17 @@ namespace embree
const GEOMETRY_TYPE type = getType(geomID);
align(offset,alignof_RTHWIF_GEOMETRY(type));
createGeometryDesc(&geomDescrData[offset],scene,scene->get(geomID),type);
geomDescr[geomID] = (ze_rtas_builder_geometry_info_exp_t*) &geomDescrData[offset];
geomDescr[geomID] = (ze_rtas_builder_geometry_info_ext_t*) &geomDescrData[offset];
offset += sizeof_RTHWIF_GEOMETRY(type);
assert(offset <= geomDescrData.size());
}
ze_rtas_parallel_operation_exp_handle_t parallelOperation = nullptr;
err = ZeWrapper::zeRTASParallelOperationCreateExp(hDriver, &parallelOperation);
ze_rtas_parallel_operation_ext_handle_t parallelOperation = nullptr;
err = ZeWrapper::zeRTASParallelOperationCreateExt(hDriver, &parallelOperation);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "parallel operation creation failed");
ze_rtas_device_exp_properties_t rtasProp = { ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXP_PROPERTIES };
ze_rtas_device_ext_properties_t rtasProp = { ZE_STRUCTURE_TYPE_RTAS_DEVICE_EXT_PROPERTIES };
ze_device_properties_t devProp = { ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES, &rtasProp };
err = ZeWrapper::zeDeviceGetProperties(hDevice, &devProp );
if (err != ZE_RESULT_SUCCESS)
@@ -591,15 +620,15 @@ namespace embree
/* estimate static accel size */
BBox1f time_range(0,1);
ze_rtas_aabb_exp_t bounds;
ze_rtas_builder_build_op_exp_desc_t args;
ze_rtas_aabb_ext_t bounds;
ze_rtas_builder_build_op_ext_desc_t args;
memset(&args,0,sizeof(args));
args.stype = ZE_STRUCTURE_TYPE_RTAS_BUILDER_BUILD_OP_EXP_DESC;
args.stype = ZE_STRUCTURE_TYPE_RTAS_BUILDER_BUILD_OP_EXT_DESC;
args.pNext = nullptr;
args.rtasFormat = rtasProp.rtasFormat;
args.buildQuality = convertBuildQuality(scene->quality_flags);
args.buildFlags = convertBuildFlags(scene->scene_flags,scene->quality_flags);
args.ppGeometries = (const ze_rtas_builder_geometry_info_exp_t**) geomDescr.data();
args.ppGeometries = (const ze_rtas_builder_geometry_info_ext_t**) geomDescr.data();
args.numGeometries = geomDescr.size();
/* just for debugging purposes */
@@ -609,8 +638,8 @@ namespace embree
args.pNext = &buildOpDebug;
#endif
ze_rtas_builder_exp_properties_t sizeTotal = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXP_PROPERTIES };
err = ZeWrapper::zeRTASBuilderGetBuildPropertiesExp(hBuilder,&args,&sizeTotal);
ze_rtas_builder_ext_properties_t sizeTotal = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXT_PROPERTIES };
err = ZeWrapper::zeRTASBuilderGetBuildPropertiesExt(hBuilder,&args,&sizeTotal);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN,"BVH size estimate failed");
@@ -622,7 +651,7 @@ namespace embree
while (true)
{
/* estimate size of all mblur BVHs */
ze_rtas_builder_exp_properties_t size = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXP_PROPERTIES };
ze_rtas_builder_ext_properties_t size = { ZE_STRUCTURE_TYPE_RTAS_BUILDER_EXT_PROPERTIES };
size.rtasBufferSizeBytesExpected = maxTimeSegments*sizeTotal.rtasBufferSizeBytesExpected;
size.rtasBufferSizeBytesMaxRequired = maxTimeSegments*sizeTotal.rtasBufferSizeBytesMaxRequired;
size_t bytes = size.rtasBufferSizeBytesExpected;
@@ -642,26 +671,26 @@ namespace embree
size_t accelBufferBytes = sizeTotal.rtasBufferSizeBytesExpected;
bounds = { { INFINITY, INFINITY, INFINITY }, { -INFINITY, -INFINITY, -INFINITY } };
err = ZeWrapper::zeRTASBuilderBuildExp(hBuilder,&args,
err = ZeWrapper::zeRTASBuilderBuildExt(hBuilder,&args,
scratchBuffer.data(),scratchBuffer.size(),
accelBuffer, accelBufferBytes,
parallelOperation,
&time_range, &bounds, nullptr);
if (parallelOperation)
{
assert(err == ZE_RESULT_EXP_RTAS_BUILD_DEFERRED);
assert(err == ZE_RESULT_EXT_RTAS_BUILD_DEFERRED);
ze_rtas_parallel_operation_exp_properties_t prop = { ZE_STRUCTURE_TYPE_RTAS_PARALLEL_OPERATION_EXP_PROPERTIES };
err = ZeWrapper::zeRTASParallelOperationGetPropertiesExp(parallelOperation,&prop);
ze_rtas_parallel_operation_ext_properties_t prop = { ZE_STRUCTURE_TYPE_RTAS_PARALLEL_OPERATION_EXT_PROPERTIES };
err = ZeWrapper::zeRTASParallelOperationGetPropertiesExt(parallelOperation,&prop);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "get max concurrency failed");
parallel_for(prop.maxConcurrency, [&](uint32_t) { err = ZeWrapper::zeRTASParallelOperationJoinExp(parallelOperation); });
parallel_for(prop.maxConcurrency, [&](uint32_t) { err = ZeWrapper::zeRTASParallelOperationJoinExt(parallelOperation); });
}
fullBounds.extend(*(BBox3f*) &bounds);
if (err == ZE_RESULT_EXP_RTAS_BUILD_RETRY)
if (err == ZE_RESULT_EXT_RTAS_BUILD_RETRY)
{
if (sizeTotal.rtasBufferSizeBytesExpected == sizeTotal.rtasBufferSizeBytesMaxRequired)
throw_RTCError(RTC_ERROR_UNKNOWN,"build error");
@@ -672,19 +701,19 @@ namespace embree
if (err != ZE_RESULT_SUCCESS) break;
}
if (err != ZE_RESULT_EXP_RTAS_BUILD_RETRY) break;
if (err != ZE_RESULT_EXT_RTAS_BUILD_RETRY) break;
}
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN,"build error");
/* destroy parallel operation */
err = ZeWrapper::zeRTASParallelOperationDestroyExp(parallelOperation);
err = ZeWrapper::zeRTASParallelOperationDestroyExt(parallelOperation);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "parallel operation destruction failed");
/* destroy rtas builder again */
err = ZeWrapper::zeRTASBuilderDestroyExp(hBuilder);
err = ZeWrapper::zeRTASBuilderDestroyExt(hBuilder);
if (err != ZE_RESULT_SUCCESS)
throw_RTCError(RTC_ERROR_UNKNOWN, "ze_rtas_builder destruction failed");
+1 -1
View File
@@ -17,7 +17,7 @@ namespace embree
void rthwifFreeAccelBuffer(Device* embree_device, void* ptr, size_t bytes, sycl::context context);
void* zeRTASInitExp(sycl::device device, sycl::context context);
void* zeRTASInit(sycl::device device, sycl::context context);
void rthwifCleanup(Device* embree_device, void* dispatchGlobalsPtr, sycl::context context);
+2 -2
View File
@@ -26,10 +26,10 @@ namespace embree {
{
//std::cout << extensions[i].name << " version " << extensions[i].version << std::endl;
if (strncmp("ZE_extension_raytracing",extensions[i].name,sizeof(extensions[i].name)) == 0)
if (strncmp(ZE_RAYTRACING_EXT_NAME ,extensions[i].name,sizeof(extensions[i].name)) == 0)
has_raytracing = true;
if (has_raytracing && strncmp("ZE_experimental_rtas_builder",extensions[i].name,sizeof(extensions[i].name)) == 0) {
if (has_raytracing && strncmp(ZE_RTAS_EXT_NAME, extensions[i].name,sizeof(extensions[i].name)) == 0) {
ze_result_t result_rtas_builder = ZeWrapper::initRTASBuilder(hDriver);
if (result_rtas_builder == ZE_RESULT_ERROR_DEPENDENCY_UNAVAILABLE) {
return;