Vulkan: Push constants #104880

Merged
Jeroen Bakker merged 73 commits from Jeroen-Bakker/blender:vulkan-push-constants into main 2023-03-06 12:29:06 +01:00
11 changed files with 8145 additions and 58 deletions
Showing only changes of commit ec31a09e20 - Show all commits

View File

@ -44,13 +44,21 @@ set(OPENVDB_EXTRA_ARGS
# -DLLVM_DIR=${LIBDIR}/llvm/lib/cmake/llvm # -DLLVM_DIR=${LIBDIR}/llvm/lib/cmake/llvm
) )
set(OPENVDB_PATCH ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff)
if(APPLE)
set(OPENVDB_PATCH
${OPENVDB_PATCH} &&
${PATCH_CMD} -p 0 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_metal.diff
)
endif()
ExternalProject_Add(openvdb ExternalProject_Add(openvdb
URL file://${PACKAGE_DIR}/${OPENVDB_FILE} URL file://${PACKAGE_DIR}/${OPENVDB_FILE}
DOWNLOAD_DIR ${DOWNLOAD_DIR} DOWNLOAD_DIR ${DOWNLOAD_DIR}
URL_HASH ${OPENVDB_HASH_TYPE}=${OPENVDB_HASH} URL_HASH ${OPENVDB_HASH_TYPE}=${OPENVDB_HASH}
CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR}
PREFIX ${BUILD_DIR}/openvdb PREFIX ${BUILD_DIR}/openvdb
PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff PATCH_COMMAND ${OPENVDB_PATCH}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openvdb ${DEFAULT_CMAKE_FLAGS} ${OPENVDB_EXTRA_ARGS} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openvdb ${DEFAULT_CMAKE_FLAGS} ${OPENVDB_EXTRA_ARGS}
INSTALL_DIR ${LIBDIR}/openvdb INSTALL_DIR ${LIBDIR}/openvdb
) )

File diff suppressed because it is too large Load Diff

View File

@ -55,9 +55,8 @@ void device_metal_info(vector<DeviceInfo> &devices)
info.denoisers = DENOISER_NONE; info.denoisers = DENOISER_NONE;
info.id = id; info.id = id;
if (MetalInfo::get_device_vendor(device) == METAL_GPU_AMD) { info.has_nanovdb = MetalInfo::get_device_vendor(device) == METAL_GPU_APPLE;
info.has_light_tree = false; info.has_light_tree = MetalInfo::get_device_vendor(device) != METAL_GPU_AMD;
}
devices.push_back(info); devices.push_back(info);
device_index++; device_index++;

View File

@ -67,9 +67,12 @@ class MetalDevice : public Device {
std::recursive_mutex metal_mem_map_mutex; std::recursive_mutex metal_mem_map_mutex;
/* Bindless Textures */ /* Bindless Textures */
bool is_texture(const TextureInfo &tex);
device_vector<TextureInfo> texture_info; device_vector<TextureInfo> texture_info;
bool need_texture_info; bool need_texture_info;
id<MTLArgumentEncoder> mtlTextureArgEncoder = nil; id<MTLArgumentEncoder> mtlTextureArgEncoder = nil;
id<MTLArgumentEncoder> mtlBufferArgEncoder = nil;
id<MTLBuffer> buffer_bindings_1d = nil;
id<MTLBuffer> texture_bindings_2d = nil; id<MTLBuffer> texture_bindings_2d = nil;
id<MTLBuffer> texture_bindings_3d = nil; id<MTLBuffer> texture_bindings_3d = nil;
std::vector<id<MTLTexture>> texture_slot_map; std::vector<id<MTLTexture>> texture_slot_map;

View File

@ -91,11 +91,6 @@ MetalDevice::MetalDevice(const DeviceInfo &info, Stats &stats, Profiler &profile
} }
} }
texture_bindings_2d = [mtlDevice newBufferWithLength:4096 options:default_storage_mode];
texture_bindings_3d = [mtlDevice newBufferWithLength:4096 options:default_storage_mode];
stats.mem_alloc(texture_bindings_2d.allocatedSize + texture_bindings_3d.allocatedSize);
switch (device_vendor) { switch (device_vendor) {
default: default:
break; break;
@ -156,6 +151,16 @@ MetalDevice::MetalDevice(const DeviceInfo &info, Stats &stats, Profiler &profile
arg_desc_texture.dataType = MTLDataTypeTexture; arg_desc_texture.dataType = MTLDataTypeTexture;
arg_desc_texture.access = MTLArgumentAccessReadOnly; arg_desc_texture.access = MTLArgumentAccessReadOnly;
mtlTextureArgEncoder = [mtlDevice newArgumentEncoderWithArguments:@[ arg_desc_texture ]]; mtlTextureArgEncoder = [mtlDevice newArgumentEncoderWithArguments:@[ arg_desc_texture ]];
MTLArgumentDescriptor *arg_desc_buffer = [[MTLArgumentDescriptor alloc] init];
arg_desc_buffer.dataType = MTLDataTypePointer;
arg_desc_buffer.access = MTLArgumentAccessReadOnly;
mtlBufferArgEncoder = [mtlDevice newArgumentEncoderWithArguments:@[ arg_desc_buffer ]];
buffer_bindings_1d = [mtlDevice newBufferWithLength:8192 options:default_storage_mode];
texture_bindings_2d = [mtlDevice newBufferWithLength:8192 options:default_storage_mode];
texture_bindings_3d = [mtlDevice newBufferWithLength:8192 options:default_storage_mode];
stats.mem_alloc(buffer_bindings_1d.allocatedSize + texture_bindings_2d.allocatedSize +
texture_bindings_3d.allocatedSize);
/* command queue for non-tracing work on the GPU */ /* command queue for non-tracing work on the GPU */
mtlGeneralCommandQueue = [mtlDevice newCommandQueue]; mtlGeneralCommandQueue = [mtlDevice newCommandQueue];
@ -180,6 +185,8 @@ MetalDevice::MetalDevice(const DeviceInfo &info, Stats &stats, Profiler &profile
arg_desc_tex.dataType = MTLDataTypePointer; arg_desc_tex.dataType = MTLDataTypePointer;
arg_desc_tex.access = MTLArgumentAccessReadOnly; arg_desc_tex.access = MTLArgumentAccessReadOnly;
arg_desc_tex.index = index++;
[ancillary_desc addObject:[arg_desc_tex copy]]; /* metal_buf_1d */
arg_desc_tex.index = index++; arg_desc_tex.index = index++;
[ancillary_desc addObject:[arg_desc_tex copy]]; /* metal_tex_2d */ [ancillary_desc addObject:[arg_desc_tex copy]]; /* metal_tex_2d */
arg_desc_tex.index = index++; arg_desc_tex.index = index++;
@ -253,22 +260,26 @@ MetalDevice::~MetalDevice()
* existing_devices_mutex). */ * existing_devices_mutex). */
thread_scoped_lock lock(existing_devices_mutex); thread_scoped_lock lock(existing_devices_mutex);
for (auto &tex : texture_slot_map) { int num_resources = texture_info.size();
if (tex) { for (int res = 0; res < num_resources; res++) {
[tex release]; if (is_texture(texture_info[res])) {
tex = nil; [texture_slot_map[res] release];
texture_slot_map[res] = nil;
} }
} }
flush_delayed_free_list(); flush_delayed_free_list();
if (texture_bindings_2d) { if (texture_bindings_2d) {
stats.mem_free(texture_bindings_2d.allocatedSize + texture_bindings_3d.allocatedSize); stats.mem_free(buffer_bindings_1d.allocatedSize + texture_bindings_2d.allocatedSize +
texture_bindings_3d.allocatedSize);
[buffer_bindings_1d release];
[texture_bindings_2d release]; [texture_bindings_2d release];
[texture_bindings_3d release]; [texture_bindings_3d release];
} }
[mtlTextureArgEncoder release]; [mtlTextureArgEncoder release];
[mtlBufferKernelParamsEncoder release]; [mtlBufferKernelParamsEncoder release];
[mtlBufferArgEncoder release];
[mtlASArgEncoder release]; [mtlASArgEncoder release];
[mtlAncillaryArgEncoder release]; [mtlAncillaryArgEncoder release];
[mtlGeneralCommandQueue release]; [mtlGeneralCommandQueue release];
@ -332,6 +343,9 @@ void MetalDevice::make_source(MetalPipelineType pso_type, const uint kernel_feat
break; break;
case METAL_GPU_APPLE: case METAL_GPU_APPLE:
global_defines += "#define __KERNEL_METAL_APPLE__\n"; global_defines += "#define __KERNEL_METAL_APPLE__\n";
# ifdef WITH_NANOVDB
global_defines += "#define WITH_NANOVDB\n";
# endif
break; break;
} }
@ -546,6 +560,11 @@ void MetalDevice::compile_and_load(int device_id, MetalPipelineType pso_type)
} }
} }
bool MetalDevice::is_texture(const TextureInfo &tex)
{
return (tex.depth > 0 || tex.height > 0);
}
void MetalDevice::load_texture_info() void MetalDevice::load_texture_info()
{ {
if (need_texture_info) { if (need_texture_info) {
@ -557,21 +576,20 @@ void MetalDevice::load_texture_info()
for (int tex = 0; tex < num_textures; tex++) { for (int tex = 0; tex < num_textures; tex++) {
uint64_t offset = tex * sizeof(void *); uint64_t offset = tex * sizeof(void *);
if (is_texture(texture_info[tex]) && texture_slot_map[tex]) {
id<MTLTexture> metal_texture = texture_slot_map[tex]; id<MTLTexture> metal_texture = texture_slot_map[tex];
if (!metal_texture) {
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_2d offset:offset];
[mtlTextureArgEncoder setTexture:nil atIndex:0];
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_3d offset:offset];
[mtlTextureArgEncoder setTexture:nil atIndex:0];
}
else {
MTLTextureType type = metal_texture.textureType; MTLTextureType type = metal_texture.textureType;
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_2d offset:offset]; [mtlTextureArgEncoder setArgumentBuffer:texture_bindings_2d offset:offset];
[mtlTextureArgEncoder setTexture:type == MTLTextureType2D ? metal_texture : nil atIndex:0]; [mtlTextureArgEncoder setTexture:type == MTLTextureType2D ? metal_texture : nil atIndex:0];
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_3d offset:offset]; [mtlTextureArgEncoder setArgumentBuffer:texture_bindings_3d offset:offset];
[mtlTextureArgEncoder setTexture:type == MTLTextureType3D ? metal_texture : nil atIndex:0]; [mtlTextureArgEncoder setTexture:type == MTLTextureType3D ? metal_texture : nil atIndex:0];
} }
else {
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_2d offset:offset];
[mtlTextureArgEncoder setTexture:nil atIndex:0];
[mtlTextureArgEncoder setArgumentBuffer:texture_bindings_3d offset:offset];
[mtlTextureArgEncoder setTexture:nil atIndex:0];
}
} }
if (default_storage_mode == MTLResourceStorageModeManaged) { if (default_storage_mode == MTLResourceStorageModeManaged) {
[texture_bindings_2d didModifyRange:NSMakeRange(0, num_textures * sizeof(void *))]; [texture_bindings_2d didModifyRange:NSMakeRange(0, num_textures * sizeof(void *))];
@ -744,7 +762,6 @@ void MetalDevice::generic_free(device_memory &mem)
mem.shared_pointer = 0; mem.shared_pointer = 0;
/* Free device memory. */ /* Free device memory. */
delayed_free_list.push_back(mmem.mtlBuffer);
mmem.mtlBuffer = nil; mmem.mtlBuffer = nil;
} }
@ -979,7 +996,7 @@ void MetalDevice::global_free(device_memory &mem)
void MetalDevice::tex_alloc_as_buffer(device_texture &mem) void MetalDevice::tex_alloc_as_buffer(device_texture &mem)
{ {
generic_alloc(mem); MetalDevice::MetalMem *mmem = generic_alloc(mem);
generic_copy_to(mem); generic_copy_to(mem);
/* Resize once */ /* Resize once */
@ -988,27 +1005,32 @@ void MetalDevice::tex_alloc_as_buffer(device_texture &mem)
/* Allocate some slots in advance, to reduce amount /* Allocate some slots in advance, to reduce amount
* of re-allocations. */ * of re-allocations. */
texture_info.resize(round_up(slot + 1, 128)); texture_info.resize(round_up(slot + 1, 128));
texture_slot_map.resize(round_up(slot + 1, 128));
} }
mem.info.data = (uint64_t)mem.device_pointer;
/* Set Mapping and tag that we need to (re-)upload to device */
texture_info[slot] = mem.info; texture_info[slot] = mem.info;
uint64_t offset = slot * sizeof(void *);
[mtlBufferArgEncoder setArgumentBuffer:buffer_bindings_1d offset:offset];
[mtlBufferArgEncoder setBuffer:mmem->mtlBuffer offset:0 atIndex:0];
texture_info[slot].data = *(uint64_t *)((uint64_t)buffer_bindings_1d.contents + offset);
texture_slot_map[slot] = nil;
need_texture_info = true; need_texture_info = true;
} }
void MetalDevice::tex_alloc(device_texture &mem) void MetalDevice::tex_alloc(device_texture &mem)
{ {
/* Check that dimensions fit within maximum allowable size. /* Check that dimensions fit within maximum allowable size.
* If 1D texture is allocated, use 1D buffer.
* See: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf */ * See: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf */
if (mem.data_width > 16384 || mem.data_height > 16384) { if (mem.data_height > 0) {
set_error(string_printf( if (mem.data_width > 16384 || mem.data_height > 16384) {
"Texture exceeds maximum allowed size of 16384 x 16384 (requested: %zu x %zu)", set_error(string_printf(
mem.data_width, "Texture exceeds maximum allowed size of 16384 x 16384 (requested: %zu x %zu)",
mem.data_height)); mem.data_width,
return; mem.data_height));
return;
}
} }
MTLStorageMode storage_mode = MTLStorageModeManaged; MTLStorageMode storage_mode = MTLStorageModeManaged;
if (@available(macos 10.15, *)) { if (@available(macos 10.15, *)) {
if ([mtlDevice hasUnifiedMemory] && if ([mtlDevice hasUnifiedMemory] &&
@ -1148,8 +1170,9 @@ void MetalDevice::tex_alloc(device_texture &mem)
bytesPerRow:src_pitch]; bytesPerRow:src_pitch];
} }
else { else {
assert(0);
/* 1D texture, using linear memory. */ /* 1D texture, using linear memory. */
tex_alloc_as_buffer(mem);
return;
} }
mem.device_pointer = (device_ptr)mtlTexture; mem.device_pointer = (device_ptr)mtlTexture;
@ -1173,17 +1196,22 @@ void MetalDevice::tex_alloc(device_texture &mem)
ssize_t min_buffer_length = sizeof(void *) * texture_info.size(); ssize_t min_buffer_length = sizeof(void *) * texture_info.size();
if (!texture_bindings_2d || (texture_bindings_2d.length < min_buffer_length)) { if (!texture_bindings_2d || (texture_bindings_2d.length < min_buffer_length)) {
if (texture_bindings_2d) { if (texture_bindings_2d) {
delayed_free_list.push_back(buffer_bindings_1d);
delayed_free_list.push_back(texture_bindings_2d); delayed_free_list.push_back(texture_bindings_2d);
delayed_free_list.push_back(texture_bindings_3d); delayed_free_list.push_back(texture_bindings_3d);
stats.mem_free(texture_bindings_2d.allocatedSize + texture_bindings_3d.allocatedSize); stats.mem_free(buffer_bindings_1d.allocatedSize + texture_bindings_2d.allocatedSize +
texture_bindings_3d.allocatedSize);
} }
buffer_bindings_1d = [mtlDevice newBufferWithLength:min_buffer_length
options:default_storage_mode];
texture_bindings_2d = [mtlDevice newBufferWithLength:min_buffer_length texture_bindings_2d = [mtlDevice newBufferWithLength:min_buffer_length
options:default_storage_mode]; options:default_storage_mode];
texture_bindings_3d = [mtlDevice newBufferWithLength:min_buffer_length texture_bindings_3d = [mtlDevice newBufferWithLength:min_buffer_length
options:default_storage_mode]; options:default_storage_mode];
stats.mem_alloc(texture_bindings_2d.allocatedSize + texture_bindings_3d.allocatedSize); stats.mem_alloc(buffer_bindings_1d.allocatedSize + texture_bindings_2d.allocatedSize +
texture_bindings_3d.allocatedSize);
} }
} }
@ -1210,12 +1238,18 @@ void MetalDevice::tex_alloc(device_texture &mem)
void MetalDevice::tex_free(device_texture &mem) void MetalDevice::tex_free(device_texture &mem)
{ {
if (mem.data_depth == 0 && mem.data_height == 0) {
generic_free(mem);
return;
}
if (metal_mem_map.count(&mem)) { if (metal_mem_map.count(&mem)) {
std::lock_guard<std::recursive_mutex> lock(metal_mem_map_mutex); std::lock_guard<std::recursive_mutex> lock(metal_mem_map_mutex);
MetalMem &mmem = *metal_mem_map.at(&mem); MetalMem &mmem = *metal_mem_map.at(&mem);
assert(texture_slot_map[mem.slot] == mmem.mtlTexture); assert(texture_slot_map[mem.slot] == mmem.mtlTexture);
texture_slot_map[mem.slot] = nil; if (texture_slot_map[mem.slot] == mmem.mtlTexture)
texture_slot_map[mem.slot] = nil;
if (mmem.mtlTexture) { if (mmem.mtlTexture) {
/* Free bindless texture. */ /* Free bindless texture. */

View File

@ -477,17 +477,21 @@ bool MetalDeviceQueue::enqueue(DeviceKernel kernel,
[metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->texture_bindings_3d [metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->texture_bindings_3d
offset:0 offset:0
atIndex:1]; atIndex:1];
[metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->buffer_bindings_1d
offset:0
atIndex:2];
if (@available(macos 12.0, *)) { if (@available(macos 12.0, *)) {
if (metal_device_->use_metalrt) { if (metal_device_->use_metalrt) {
if (metal_device_->bvhMetalRT) { if (metal_device_->bvhMetalRT) {
id<MTLAccelerationStructure> accel_struct = metal_device_->bvhMetalRT->accel_struct; id<MTLAccelerationStructure> accel_struct = metal_device_->bvhMetalRT->accel_struct;
[metal_device_->mtlAncillaryArgEncoder setAccelerationStructure:accel_struct atIndex:2]; [metal_device_->mtlAncillaryArgEncoder setAccelerationStructure:accel_struct atIndex:3];
[metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->blas_buffer [metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->blas_buffer
offset:0 offset:0
atIndex:7]; atIndex:8];
[metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->blas_lookup_buffer [metal_device_->mtlAncillaryArgEncoder setBuffer:metal_device_->blas_lookup_buffer
offset:0 offset:0
atIndex:8]; atIndex:9];
} }
for (int table = 0; table < METALRT_TABLE_NUM; table++) { for (int table = 0; table < METALRT_TABLE_NUM; table++) {
@ -497,13 +501,13 @@ bool MetalDeviceQueue::enqueue(DeviceKernel kernel,
atIndex:1]; atIndex:1];
[metal_device_->mtlAncillaryArgEncoder [metal_device_->mtlAncillaryArgEncoder
setIntersectionFunctionTable:metal_kernel_pso->intersection_func_table[table] setIntersectionFunctionTable:metal_kernel_pso->intersection_func_table[table]
atIndex:3 + table]; atIndex:4 + table];
[mtlComputeCommandEncoder useResource:metal_kernel_pso->intersection_func_table[table] [mtlComputeCommandEncoder useResource:metal_kernel_pso->intersection_func_table[table]
usage:MTLResourceUsageRead]; usage:MTLResourceUsageRead];
} }
else { else {
[metal_device_->mtlAncillaryArgEncoder setIntersectionFunctionTable:nil [metal_device_->mtlAncillaryArgEncoder setIntersectionFunctionTable:nil
atIndex:3 + table]; atIndex:4 + table];
} }
} }
} }
@ -874,6 +878,7 @@ void MetalDeviceQueue::prepare_resources(DeviceKernel kernel)
/* ancillaries */ /* ancillaries */
[mtlComputeEncoder_ useResource:metal_device_->texture_bindings_2d usage:MTLResourceUsageRead]; [mtlComputeEncoder_ useResource:metal_device_->texture_bindings_2d usage:MTLResourceUsageRead];
[mtlComputeEncoder_ useResource:metal_device_->texture_bindings_3d usage:MTLResourceUsageRead]; [mtlComputeEncoder_ useResource:metal_device_->texture_bindings_3d usage:MTLResourceUsageRead];
[mtlComputeEncoder_ useResource:metal_device_->buffer_bindings_1d usage:MTLResourceUsageRead];
} }
id<MTLComputeCommandEncoder> MetalDeviceQueue::get_compute_encoder(DeviceKernel kernel) id<MTLComputeCommandEncoder> MetalDeviceQueue::get_compute_encoder(DeviceKernel kernel)

View File

@ -5,13 +5,14 @@
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
#ifdef WITH_NANOVDB #if !defined __KERNEL_METAL__
# define NDEBUG /* Disable "assert" in device code */ # ifdef WITH_NANOVDB
# define NANOVDB_USE_INTRINSICS # define NDEBUG /* Disable "assert" in device code */
# include "nanovdb/NanoVDB.h" # define NANOVDB_USE_INTRINSICS
# include "nanovdb/util/SampleFromVoxels.h" # include "nanovdb/NanoVDB.h"
# include "nanovdb/util/SampleFromVoxels.h"
# endif
#endif #endif
/* w0, w1, w2, and w3 are the four cubic B-spline basis functions. */ /* w0, w1, w2, and w3 are the four cubic B-spline basis functions. */
ccl_device float cubic_w0(float a) ccl_device float cubic_w0(float a)
{ {
@ -126,7 +127,7 @@ kernel_tex_image_interp_tricubic(ccl_global const TextureInfo &info, float x, fl
#ifdef WITH_NANOVDB #ifdef WITH_NANOVDB
template<typename T, typename S> template<typename T, typename S>
ccl_device typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_tricubic_nanovdb( ccl_device typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_tricubic_nanovdb(
S &s, float x, float y, float z) ccl_private S &s, float x, float y, float z)
{ {
float px = floorf(x); float px = floorf(x);
float py = floorf(y); float py = floorf(y);
@ -157,13 +158,19 @@ ccl_device typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_tric
g1y * (g0x * s(Vec3f(x0, y1, z1)) + g1x * s(Vec3f(x1, y1, z1)))); g1y * (g0x * s(Vec3f(x0, y1, z1)) + g1x * s(Vec3f(x1, y1, z1))));
} }
# if defined(__KERNEL_METAL__)
template<typename T>
__attribute__((noinline)) typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_nanovdb(
ccl_global const TextureInfo &info, float x, float y, float z, uint interpolation)
# else
template<typename T> template<typename T>
ccl_device_noinline typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_nanovdb( ccl_device_noinline typename nanovdb::NanoGrid<T>::ValueType kernel_tex_image_interp_nanovdb(
ccl_global const TextureInfo &info, float x, float y, float z, uint interpolation) ccl_global const TextureInfo &info, float x, float y, float z, uint interpolation)
# endif
{ {
using namespace nanovdb; using namespace nanovdb;
NanoGrid<T> *const grid = (NanoGrid<T> *)info.data; ccl_global NanoGrid<T> *const grid = (ccl_global NanoGrid<T> *)info.data;
typedef typename nanovdb::NanoGrid<T>::AccessorType AccessorType; typedef typename nanovdb::NanoGrid<T>::AccessorType AccessorType;
AccessorType acc = grid->getAccessor(); AccessorType acc = grid->getAccessor();

View File

@ -290,6 +290,10 @@ typedef metal::raytracing::intersector<triangle_data> metalrt_blas_intersector_t
/* texture bindings and sampler setup */ /* texture bindings and sampler setup */
struct Buffer1DParamsMetal {
device float *buf;
};
struct Texture2DParamsMetal { struct Texture2DParamsMetal {
texture2d<float, access::sample> tex; texture2d<float, access::sample> tex;
}; };
@ -306,6 +310,7 @@ struct MetalRTBlasWrapper {
struct MetalAncillaries { struct MetalAncillaries {
device Texture2DParamsMetal *textures_2d; device Texture2DParamsMetal *textures_2d;
device Texture3DParamsMetal *textures_3d; device Texture3DParamsMetal *textures_3d;
device Buffer1DParamsMetal *buffers;
#ifdef __METALRT__ #ifdef __METALRT__
metalrt_as_type accel_struct; metalrt_as_type accel_struct;

View File

@ -3,6 +3,13 @@
// clang-format off // clang-format off
#ifdef WITH_NANOVDB
# define NDEBUG /* Disable "assert" in device code */
# define NANOVDB_USE_INTRINSICS
# include "nanovdb/NanoVDB.h"
# include "nanovdb/util/SampleFromVoxels.h"
#endif
/* Open the Metal kernel context class /* Open the Metal kernel context class
* Necessary to access resource bindings */ * Necessary to access resource bindings */
class MetalKernelContext { class MetalKernelContext {

View File

@ -214,6 +214,9 @@ std::string AssetLibraryService::root_path_from_library_ref(
if (ELEM(library_reference.type, ASSET_LIBRARY_ALL, ASSET_LIBRARY_LOCAL)) { if (ELEM(library_reference.type, ASSET_LIBRARY_ALL, ASSET_LIBRARY_LOCAL)) {
return ""; return "";
} }
if (ELEM(library_reference.type, ASSET_LIBRARY_ESSENTIALS)) {
return essentials_directory_path();
}
if (ELEM(library_reference.type, ASSET_LIBRARY_ESSENTIALS)) { if (ELEM(library_reference.type, ASSET_LIBRARY_ESSENTIALS)) {
return essentials_directory_path(); return essentials_directory_path();

View File

@ -253,11 +253,20 @@ static void gather_search_link_ops_for_all_assets(const bContext &C,
C, node_tree, socket, library_ref, true, search_link_ops); C, node_tree, socket, library_ref, true, search_link_ops);
} }
AssetLibraryReference library_ref{}; {
library_ref.custom_library_index = -1; AssetLibraryReference library_ref{};
library_ref.type = ASSET_LIBRARY_LOCAL; library_ref.custom_library_index = -1;
gather_search_link_ops_for_asset_library( library_ref.type = ASSET_LIBRARY_ESSENTIALS;
C, node_tree, socket, library_ref, false, search_link_ops); gather_search_link_ops_for_asset_library(
C, node_tree, socket, library_ref, true, search_link_ops);
}
{
AssetLibraryReference library_ref{};
library_ref.custom_library_index = -1;
library_ref.type = ASSET_LIBRARY_LOCAL;
gather_search_link_ops_for_asset_library(
C, node_tree, socket, library_ref, false, search_link_ops);
}
} }
/** /**