767e374dce
Since Embree v3.13.0 supports AARCH64, switch back to the official repo instead of using Embree-aarch64. `thirdparty/embree/patches/godot-changes.patch` should now contain an accurate diff of the changes done to the library.
196 lines
8 KiB
C++
196 lines
8 KiB
C++
// Copyright 2009-2021 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#pragma once
|
|
|
|
#include "default.h"
|
|
|
|
namespace embree
|
|
{
|
|
/* mutex to make printing to cout thread safe */
|
|
extern MutexSys g_printMutex;
|
|
|
|
struct State : public RefCount
|
|
{
|
|
public:
|
|
/*! state construction */
|
|
State ();
|
|
|
|
/*! state destruction */
|
|
~State();
|
|
|
|
/*! verifies that state is correct */
|
|
void verify();
|
|
|
|
/*! parses state from a configuration file */
|
|
bool parseFile(const FileName& fileName);
|
|
|
|
/*! parses the state from a string */
|
|
void parseString(const char* cfg);
|
|
|
|
/*! parses the state from a stream */
|
|
void parse(Ref<TokenStream> cin);
|
|
|
|
/*! prints the state */
|
|
void print();
|
|
|
|
/*! checks if verbosity level is at least N */
|
|
bool verbosity(size_t N);
|
|
|
|
/*! checks if some particular ISA is enabled */
|
|
bool hasISA(const int isa);
|
|
|
|
/*! check whether selected ISA is supported by the HW */
|
|
bool checkISASupport();
|
|
|
|
public:
|
|
std::string tri_accel; //!< acceleration structure to use for triangles
|
|
std::string tri_builder; //!< builder to use for triangles
|
|
std::string tri_traverser; //!< traverser to use for triangles
|
|
|
|
public:
|
|
std::string tri_accel_mb; //!< acceleration structure to use for motion blur triangles
|
|
std::string tri_builder_mb; //!< builder to use for motion blur triangles
|
|
std::string tri_traverser_mb; //!< traverser to use for triangles
|
|
|
|
public:
|
|
std::string quad_accel; //!< acceleration structure to use for quads
|
|
std::string quad_builder; //!< builder to use for quads
|
|
std::string quad_traverser; //!< traverser to use for quads
|
|
|
|
public:
|
|
std::string quad_accel_mb; //!< acceleration structure to use for motion blur quads
|
|
std::string quad_builder_mb; //!< builder to use for motion blur quads
|
|
std::string quad_traverser_mb; //!< traverser to use for motion blur quads
|
|
|
|
public:
|
|
std::string line_accel; //!< acceleration structure to use for line segments
|
|
std::string line_builder; //!< builder to use for line segments
|
|
std::string line_traverser; //!< traverser to use for line segments
|
|
|
|
public:
|
|
std::string line_accel_mb; //!< acceleration structure to use for motion blur line segments
|
|
std::string line_builder_mb; //!< builder to use for motion blur line segments
|
|
std::string line_traverser_mb; //!< traverser to use for motion blur line segments
|
|
|
|
public:
|
|
std::string hair_accel; //!< hair acceleration structure to use
|
|
std::string hair_builder; //!< builder to use for hair
|
|
std::string hair_traverser; //!< traverser to use for hair
|
|
|
|
public:
|
|
std::string hair_accel_mb; //!< acceleration structure to use for motion blur hair
|
|
std::string hair_builder_mb; //!< builder to use for motion blur hair
|
|
std::string hair_traverser_mb; //!< traverser to use for motion blur hair
|
|
|
|
public:
|
|
std::string object_accel; //!< acceleration structure for user geometries
|
|
std::string object_builder; //!< builder for user geometries
|
|
int object_accel_min_leaf_size; //!< minimum leaf size for object acceleration structure
|
|
int object_accel_max_leaf_size; //!< maximum leaf size for object acceleration structure
|
|
|
|
public:
|
|
std::string object_accel_mb; //!< acceleration structure for user geometries
|
|
std::string object_builder_mb; //!< builder for user geometries
|
|
int object_accel_mb_min_leaf_size; //!< minimum leaf size for mblur object acceleration structure
|
|
int object_accel_mb_max_leaf_size; //!< maximum leaf size for mblur object acceleration structure
|
|
|
|
public:
|
|
std::string subdiv_accel; //!< acceleration structure to use for subdivision surfaces
|
|
std::string subdiv_accel_mb; //!< acceleration structure to use for subdivision surfaces
|
|
|
|
public:
|
|
std::string grid_accel; //!< acceleration structure to use for grids
|
|
std::string grid_builder; //!< builder for grids
|
|
std::string grid_accel_mb; //!< acceleration structure to use for motion blur grids
|
|
std::string grid_builder_mb; //!< builder for motion blur grids
|
|
|
|
public:
|
|
float max_spatial_split_replications; //!< maximally replications*N many primitives in accel for spatial splits
|
|
bool useSpatialPreSplits; //!< use spatial pre-splits instead of the full spatial split builder
|
|
size_t tessellation_cache_size; //!< size of the shared tessellation cache
|
|
|
|
public:
|
|
size_t instancing_open_min; //!< instancing opens tree to minimally that number of subtrees
|
|
size_t instancing_block_size; //!< instancing opens tree up to average block size of primitives
|
|
float instancing_open_factor; //!< instancing opens tree up to x times the number of instances
|
|
size_t instancing_open_max_depth; //!< maximum open depth for geometries
|
|
size_t instancing_open_max; //!< instancing opens tree to maximally that number of subtrees
|
|
|
|
public:
|
|
bool float_exceptions; //!< enable floating point exceptions
|
|
int quality_flags;
|
|
int scene_flags;
|
|
size_t verbose; //!< verbosity of output
|
|
size_t benchmark; //!< true
|
|
|
|
public:
|
|
size_t numThreads; //!< number of threads to use in builders
|
|
size_t numUserThreads; //!< number of user provided threads to use in builders
|
|
bool set_affinity; //!< sets affinity for worker threads
|
|
bool start_threads; //!< true when threads should be started at device creation time
|
|
int enabled_cpu_features; //!< CPU ISA features to use
|
|
int enabled_builder_cpu_features; //!< CPU ISA features to use for builders only
|
|
enum FREQUENCY_LEVEL {
|
|
FREQUENCY_SIMD128,
|
|
FREQUENCY_SIMD256,
|
|
FREQUENCY_SIMD512
|
|
} frequency_level; //!< frequency level the app wants to run on (default is SIMD256)
|
|
bool enable_selockmemoryprivilege; //!< configures the SeLockMemoryPrivilege under Windows to enable huge pages
|
|
bool hugepages; //!< true if huge pages should get used
|
|
bool hugepages_success; //!< status for enabling huge pages
|
|
|
|
public:
|
|
size_t alloc_main_block_size; //!< main allocation block size (shared between threads)
|
|
int alloc_num_main_slots; //!< number of such shared blocks to be used to allocate
|
|
size_t alloc_thread_block_size; //!< size of thread local allocator block size
|
|
int alloc_single_thread_alloc; //!< in single mode nodes and leaves use same thread local allocator
|
|
|
|
public:
|
|
|
|
/*! checks if we can use AVX */
|
|
bool canUseAVX() {
|
|
return hasISA(AVX) && frequency_level != FREQUENCY_SIMD128;
|
|
}
|
|
|
|
/*! checks if we can use AVX2 */
|
|
bool canUseAVX2() {
|
|
return hasISA(AVX2) && frequency_level != FREQUENCY_SIMD128;
|
|
}
|
|
|
|
struct ErrorHandler
|
|
{
|
|
public:
|
|
ErrorHandler();
|
|
~ErrorHandler();
|
|
RTCError* error();
|
|
|
|
public:
|
|
tls_t thread_error;
|
|
std::vector<RTCError*> thread_errors;
|
|
MutexSys errors_mutex;
|
|
};
|
|
ErrorHandler errorHandler;
|
|
static ErrorHandler g_errorHandler;
|
|
|
|
public:
|
|
void setErrorFunction(RTCErrorFunction fptr, void* uptr)
|
|
{
|
|
error_function = fptr;
|
|
error_function_userptr = uptr;
|
|
}
|
|
|
|
RTCErrorFunction error_function;
|
|
void* error_function_userptr;
|
|
|
|
public:
|
|
void setMemoryMonitorFunction(RTCMemoryMonitorFunction fptr, void* uptr)
|
|
{
|
|
memory_monitor_function = fptr;
|
|
memory_monitor_userptr = uptr;
|
|
}
|
|
|
|
RTCMemoryMonitorFunction memory_monitor_function;
|
|
void* memory_monitor_userptr;
|
|
};
|
|
}
|