Alternative Upload geometry data in parallel to multiple GPUs using the "Multi-Device" #107552

Open
William Leeson wants to merge 137 commits from leesonw/blender-cluster:upload_changed into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 24 additions and 26 deletions
Showing only changes of commit b1be09d449 - Show all commits

View File

@ -168,6 +168,9 @@ protected:
}
virtual BVHLayoutMask get_bvh_layout_mask(uint kernel_features) const = 0;
virtual BVHLayout get_bvh_layout(Device *device, BVHLayout layout) {
return layout;
}
/* statistics */
Stats &stats;
Profiler &profiler;

View File

@ -199,6 +199,24 @@ class MultiDevice : public Device {
return true;
}
BVHLayout get_bvh_layout(Device *device, BVHLayout bvh_layout) override
{
if (bvh_layout == BVH_LAYOUT_MULTI_OPTIX)
bvh_layout = BVH_LAYOUT_OPTIX;
else if (bvh_layout == BVH_LAYOUT_MULTI_METAL)
bvh_layout = BVH_LAYOUT_METAL;
else if (bvh_layout == BVH_LAYOUT_MULTI_HIPRT)
bvh_layout = BVH_LAYOUT_HIPRT;
else if (bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE)
bvh_layout = device->info.type == DEVICE_OPTIX ? BVH_LAYOUT_OPTIX : BVH_LAYOUT_EMBREE;
else if (bvh_layout == BVH_LAYOUT_MULTI_METAL_EMBREE)
bvh_layout = device->info.type == DEVICE_METAL ? BVH_LAYOUT_METAL : BVH_LAYOUT_EMBREE;
else if (bvh_layout == BVH_LAYOUT_MULTI_HIPRT_EMBREE)
bvh_layout = device->info.type == DEVICE_HIPRT ? BVH_LAYOUT_HIPRT : BVH_LAYOUT_EMBREE;
return bvh_layout;
}
void build_bvh(BVH *bvh, DeviceScene *dscene, Progress &progress, bool refit) override
{
/* Try to build and share a single acceleration structure, if possible */
@ -226,21 +244,7 @@ class MultiDevice : public Device {
if (!bvh_multi->sub_bvhs[id]) {
BVHParams params = bvh_multi->params;
if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_OPTIX)
params.bvh_layout = BVH_LAYOUT_OPTIX;
else if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_METAL)
params.bvh_layout = BVH_LAYOUT_METAL;
else if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_HIPRT)
params.bvh_layout = BVH_LAYOUT_HIPRT;
else if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE)
params.bvh_layout = sub->device->info.type == DEVICE_OPTIX ? BVH_LAYOUT_OPTIX :
BVH_LAYOUT_EMBREE;
else if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_METAL_EMBREE)
params.bvh_layout = sub->device->info.type == DEVICE_METAL ? BVH_LAYOUT_METAL :
BVH_LAYOUT_EMBREE;
else if (bvh_multi->params.bvh_layout == BVH_LAYOUT_MULTI_HIPRT_EMBREE)
params.bvh_layout = sub->device->info.type == DEVICE_HIPRT ? BVH_LAYOUT_HIPRT :
BVH_LAYOUT_EMBREE;
params.bvh_layout = get_bvh_layout(sub->device, bvh_multi->params.bvh_layout);
/* Skip building a bottom level acceleration structure for non-instanced geometry on
* Embree (since they are put into the top level directly, see bvh_embree.cpp) */
@ -516,7 +520,7 @@ class MultiDevice : public Device {
// }
// }
// }
//stats.mem_alloc(sub_mem.device_size - existing_size);
stats.mem_alloc(sub_mem.device_size - existing_size);
}
}
});

View File

@ -174,16 +174,7 @@ void GeometryManager::device_update_sub_bvh(Device *device,
// Yes, so setup the device specific sub_bvh in the multi-bvh.
BVHParams bparams = bvh->params;
// Set the layout to the correct one for the device
if (bvh->params.bvh_layout == BVH_LAYOUT_MULTI_OPTIX)
bparams.bvh_layout = BVH_LAYOUT_OPTIX;
else if (bvh->params.bvh_layout == BVH_LAYOUT_MULTI_METAL)
bparams.bvh_layout = BVH_LAYOUT_METAL;
else if (bvh->params.bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE)
bparams.bvh_layout = device->info.type == DEVICE_OPTIX ? BVH_LAYOUT_OPTIX :
BVH_LAYOUT_EMBREE;
else if (bvh->params.bvh_layout == BVH_LAYOUT_MULTI_METAL_EMBREE)
bparams.bvh_layout = device->info.type == DEVICE_METAL ? BVH_LAYOUT_METAL :
BVH_LAYOUT_EMBREE;
bparams.bvh_layout = device->get_bvh(device, bvh->params.bvh_layout);
if (sub_bvh != NULL) {
delete sub_bvh;
}