From fe9e28c0860e7a8195d291d0a47b40440e1e3947 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 6 Nov 2023 18:50:25 +0100 Subject: [PATCH] Fix build error on macOS x86, after Metal motion blur workaround Ref #114544 --- intern/cycles/device/metal/bvh.mm | 110 +++++++++++++++--------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/intern/cycles/device/metal/bvh.mm b/intern/cycles/device/metal/bvh.mm index ba86e80f587..45780b4f166 100644 --- a/intern/cycles/device/metal/bvh.mm +++ b/intern/cycles/device/metal/bvh.mm @@ -131,62 +131,6 @@ BVHMetal::~BVHMetal() } } -id make_null_BLAS(id device, id queue) -{ - if (@available(macos 12.0, *)) { - MTLResourceOptions storage_mode = MTLResourceStorageModeManaged; - if (device.hasUnifiedMemory) { - storage_mode = MTLResourceStorageModeShared; - } - - id nullBuf = [device newBufferWithLength:0 options:storage_mode]; - - /* Create an acceleration structure. */ - MTLAccelerationStructureTriangleGeometryDescriptor *geomDesc = - [MTLAccelerationStructureTriangleGeometryDescriptor descriptor]; - geomDesc.vertexBuffer = nullBuf; - geomDesc.vertexBufferOffset = 0; - geomDesc.vertexStride = sizeof(float3); - geomDesc.indexBuffer = nullBuf; - geomDesc.indexBufferOffset = 0; - geomDesc.indexType = MTLIndexTypeUInt32; - geomDesc.triangleCount = 0; - geomDesc.intersectionFunctionTableOffset = 0; - geomDesc.opaque = true; - geomDesc.allowDuplicateIntersectionFunctionInvocation = false; - - MTLPrimitiveAccelerationStructureDescriptor *accelDesc = - [MTLPrimitiveAccelerationStructureDescriptor descriptor]; - accelDesc.geometryDescriptors = @[ geomDesc ]; - accelDesc.usage |= MTLAccelerationStructureUsageExtendedLimits; - - MTLAccelerationStructureSizes accelSizes = [device - accelerationStructureSizesWithDescriptor:accelDesc]; - id accel_struct = [device - newAccelerationStructureWithSize:accelSizes.accelerationStructureSize]; - id scratchBuf = [device newBufferWithLength:accelSizes.buildScratchBufferSize - options:MTLResourceStorageModePrivate]; - id sizeBuf = [device newBufferWithLength:8 options:MTLResourceStorageModeShared]; - id accelCommands = [queue commandBuffer]; - id accelEnc = - [accelCommands accelerationStructureCommandEncoder]; - [accelEnc buildAccelerationStructure:accel_struct - descriptor:accelDesc - scratchBuffer:scratchBuf - scratchBufferOffset:0]; - [accelEnc endEncoding]; - [accelCommands commit]; - [accelCommands waitUntilCompleted]; - - /* free temp resources */ - [scratchBuf release]; - [nullBuf release]; - [sizeBuf release]; - - return accel_struct; - } -} - bool BVHMetal::build_BLAS_mesh(Progress &progress, id device, id queue, @@ -1024,6 +968,60 @@ bool BVHMetal::build_TLAS(Progress &progress, g_bvh_build_throttler.wait_for_all(); if (@available(macos 12.0, *)) { + /* Defined inside available check, for return type to be available. */ + auto make_null_BLAS = [](id device, + id queue) -> id { + MTLResourceOptions storage_mode = MTLResourceStorageModeManaged; + if (device.hasUnifiedMemory) { + storage_mode = MTLResourceStorageModeShared; + } + + id nullBuf = [device newBufferWithLength:0 options:storage_mode]; + + /* Create an acceleration structure. */ + MTLAccelerationStructureTriangleGeometryDescriptor *geomDesc = + [MTLAccelerationStructureTriangleGeometryDescriptor descriptor]; + geomDesc.vertexBuffer = nullBuf; + geomDesc.vertexBufferOffset = 0; + geomDesc.vertexStride = sizeof(float3); + geomDesc.indexBuffer = nullBuf; + geomDesc.indexBufferOffset = 0; + geomDesc.indexType = MTLIndexTypeUInt32; + geomDesc.triangleCount = 0; + geomDesc.intersectionFunctionTableOffset = 0; + geomDesc.opaque = true; + geomDesc.allowDuplicateIntersectionFunctionInvocation = false; + + MTLPrimitiveAccelerationStructureDescriptor *accelDesc = + [MTLPrimitiveAccelerationStructureDescriptor descriptor]; + accelDesc.geometryDescriptors = @[ geomDesc ]; + accelDesc.usage |= MTLAccelerationStructureUsageExtendedLimits; + + MTLAccelerationStructureSizes accelSizes = [device + accelerationStructureSizesWithDescriptor:accelDesc]; + id accel_struct = [device + newAccelerationStructureWithSize:accelSizes.accelerationStructureSize]; + id scratchBuf = [device newBufferWithLength:accelSizes.buildScratchBufferSize + options:MTLResourceStorageModePrivate]; + id sizeBuf = [device newBufferWithLength:8 options:MTLResourceStorageModeShared]; + id accelCommands = [queue commandBuffer]; + id accelEnc = + [accelCommands accelerationStructureCommandEncoder]; + [accelEnc buildAccelerationStructure:accel_struct + descriptor:accelDesc + scratchBuffer:scratchBuf + scratchBufferOffset:0]; + [accelEnc endEncoding]; + [accelCommands commit]; + [accelCommands waitUntilCompleted]; + + /* free temp resources */ + [scratchBuf release]; + [nullBuf release]; + [sizeBuf release]; + + return accel_struct; + }; uint32_t num_instances = 0; uint32_t num_motion_transforms = 0;