Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Jones <michael_p_jones@apple.com>2021-12-08 18:07:11 +0300
committerMichael Jones <michael_p_jones@apple.com>2021-12-08 18:08:12 +0300
commite23b54a59f0428399bbf4de5ba007ad764fa80be (patch)
treeae2910fbd1582d952ee1c3dfe959b94227e06832 /intern/cycles/device
parent5e9dba822d8de977909bf170dcae9950535e01af (diff)
Cycles: Fix OS version warnings
This patch suppresses OS version warnings and hides currently unsupported Metal GPUs when enumerating devices. Reviewed By: brecht Differential Revision: https://developer.blender.org/D13506
Diffstat (limited to 'intern/cycles/device')
-rw-r--r--intern/cycles/device/metal/device_impl.mm22
-rw-r--r--intern/cycles/device/metal/kernel.mm4
-rw-r--r--intern/cycles/device/metal/queue.h2
-rw-r--r--intern/cycles/device/metal/queue.mm78
-rw-r--r--intern/cycles/device/metal/util.mm31
5 files changed, 63 insertions, 74 deletions
diff --git a/intern/cycles/device/metal/device_impl.mm b/intern/cycles/device/metal/device_impl.mm
index fd249204646..4ad5a3caebc 100644
--- a/intern/cycles/device/metal/device_impl.mm
+++ b/intern/cycles/device/metal/device_impl.mm
@@ -308,14 +308,12 @@ bool MetalDevice::load_kernels(const uint _kernel_features)
MTLCompileOptions *options = [[MTLCompileOptions alloc] init];
options.fastMathEnabled = YES;
- options.languageVersion = MTLLanguageVersion2_1;
-
- if (@available(macOS 11.0, *)) {
- options.languageVersion = MTLLanguageVersion2_3;
- }
if (@available(macOS 12.0, *)) {
options.languageVersion = MTLLanguageVersion2_4;
}
+ else {
+ return false;
+ }
string metalsrc;
@@ -925,12 +923,14 @@ void MetalDevice::tex_alloc(device_texture &mem)
}
}
- /* Optimize the texture for GPU access. */
- id<MTLCommandBuffer> commandBuffer = [mtlGeneralCommandQueue commandBuffer];
- id<MTLBlitCommandEncoder> blitCommandEncoder = [commandBuffer blitCommandEncoder];
- [blitCommandEncoder optimizeContentsForGPUAccess:mtlTexture];
- [blitCommandEncoder endEncoding];
- [commandBuffer commit];
+ if (@available(macos 10.14, *)) {
+ /* Optimize the texture for GPU access. */
+ id<MTLCommandBuffer> commandBuffer = [mtlGeneralCommandQueue commandBuffer];
+ id<MTLBlitCommandEncoder> blitCommandEncoder = [commandBuffer blitCommandEncoder];
+ [blitCommandEncoder optimizeContentsForGPUAccess:mtlTexture];
+ [blitCommandEncoder endEncoding];
+ [commandBuffer commit];
+ }
/* Set Mapping and tag that we need to (re-)upload to device */
texture_slot_map[slot] = mtlTexture;
diff --git a/intern/cycles/device/metal/kernel.mm b/intern/cycles/device/metal/kernel.mm
index f5c3adbce25..f948a8a0a0f 100644
--- a/intern/cycles/device/metal/kernel.mm
+++ b/intern/cycles/device/metal/kernel.mm
@@ -118,7 +118,9 @@ bool MetalDeviceKernel::load(MetalDevice *device,
computePipelineStateDescriptor.buffers[1].mutability = MTLMutabilityImmutable;
computePipelineStateDescriptor.buffers[2].mutability = MTLMutabilityImmutable;
- computePipelineStateDescriptor.maxTotalThreadsPerThreadgroup = desc.threads_per_threadgroup;
+ if (@available(macos 10.14, *)) {
+ computePipelineStateDescriptor.maxTotalThreadsPerThreadgroup = desc.threads_per_threadgroup;
+ }
computePipelineStateDescriptor.threadGroupSizeIsMultipleOfThreadExecutionWidth = true;
computePipelineStateDescriptor.computeFunction = pso[desc.pso_index].function;
diff --git a/intern/cycles/device/metal/queue.h b/intern/cycles/device/metal/queue.h
index 7aafcb2efe4..64c8bb79c49 100644
--- a/intern/cycles/device/metal/queue.h
+++ b/intern/cycles/device/metal/queue.h
@@ -70,7 +70,9 @@ class MetalDeviceQueue : public DeviceQueue {
id<MTLCommandBuffer> mtlCommandBuffer = nil;
id<MTLComputeCommandEncoder> mtlComputeEncoder = nil;
id<MTLBlitCommandEncoder> mtlBlitEncoder = nil;
+ API_AVAILABLE(macos(10.14), ios(14.0))
id<MTLSharedEvent> shared_event = nil;
+ API_AVAILABLE(macos(10.14), ios(14.0))
MTLSharedEventListener *shared_event_listener = nil;
dispatch_queue_t event_queue;
diff --git a/intern/cycles/device/metal/queue.mm b/intern/cycles/device/metal/queue.mm
index ced01e7b9b6..d04df09f49a 100644
--- a/intern/cycles/device/metal/queue.mm
+++ b/intern/cycles/device/metal/queue.mm
@@ -40,12 +40,14 @@ MetalDeviceQueue::MetalDeviceQueue(MetalDevice *device)
mtlDevice = device->mtlDevice;
mtlCommandQueue = [mtlDevice newCommandQueue];
- shared_event = [mtlDevice newSharedEvent];
- shared_event_id = 1;
+ if (@available(macos 10.14, *)) {
+ shared_event = [mtlDevice newSharedEvent];
+ shared_event_id = 1;
- /* Shareable event listener */
- event_queue = dispatch_queue_create("com.cycles.metal.event_queue", NULL);
- shared_event_listener = [[MTLSharedEventListener alloc] initWithDispatchQueue:event_queue];
+ /* Shareable event listener */
+ event_queue = dispatch_queue_create("com.cycles.metal.event_queue", NULL);
+ shared_event_listener = [[MTLSharedEventListener alloc] initWithDispatchQueue:event_queue];
+ }
wait_semaphore = dispatch_semaphore_create(0);
}
@@ -57,8 +59,10 @@ MetalDeviceQueue::~MetalDeviceQueue()
assert(mtlCommandBuffer == nil);
assert(command_buffers_submitted == command_buffers_completed);
- [shared_event_listener release];
- [shared_event release];
+ if (@available(macos 10.14, *)) {
+ [shared_event_listener release];
+ [shared_event release];
+ }
if (@available(macos 11.0, *)) {
[command_buffer_desc release];
@@ -364,16 +368,18 @@ bool MetalDeviceQueue::synchronize()
if (mtlCommandBuffer) {
uint64_t shared_event_id = this->shared_event_id++;
- __block dispatch_semaphore_t block_sema = wait_semaphore;
- [shared_event notifyListener:shared_event_listener
- atValue:shared_event_id
- block:^(id<MTLSharedEvent> sharedEvent, uint64_t value) {
- dispatch_semaphore_signal(block_sema);
- }];
-
- [mtlCommandBuffer encodeSignalEvent:shared_event value:shared_event_id];
- [mtlCommandBuffer commit];
- dispatch_semaphore_wait(wait_semaphore, DISPATCH_TIME_FOREVER);
+ if (@available(macos 10.14, *)) {
+ __block dispatch_semaphore_t block_sema = wait_semaphore;
+ [shared_event notifyListener:shared_event_listener
+ atValue:shared_event_id
+ block:^(id<MTLSharedEvent> sharedEvent, uint64_t value) {
+ dispatch_semaphore_signal(block_sema);
+ }];
+
+ [mtlCommandBuffer encodeSignalEvent:shared_event value:shared_event_id];
+ [mtlCommandBuffer commit];
+ dispatch_semaphore_wait(wait_semaphore, DISPATCH_TIME_FOREVER);
+ }
[mtlCommandBuffer release];
@@ -536,30 +542,32 @@ id<MTLComputeCommandEncoder> MetalDeviceQueue::get_compute_encoder(DeviceKernel
{
bool concurrent = (kernel < DEVICE_KERNEL_INTEGRATOR_NUM);
- if (mtlComputeEncoder) {
- if (mtlComputeEncoder.dispatchType == concurrent ? MTLDispatchTypeConcurrent :
- MTLDispatchTypeSerial) {
- /* declare usage of MTLBuffers etc */
- prepare_resources(kernel);
+ if (@available(macos 10.14, *)) {
+ if (mtlComputeEncoder) {
+ if (mtlComputeEncoder.dispatchType == concurrent ? MTLDispatchTypeConcurrent :
+ MTLDispatchTypeSerial) {
+ /* declare usage of MTLBuffers etc */
+ prepare_resources(kernel);
- return mtlComputeEncoder;
+ return mtlComputeEncoder;
+ }
+ close_compute_encoder();
}
- close_compute_encoder();
- }
- close_blit_encoder();
+ close_blit_encoder();
- if (!mtlCommandBuffer) {
- mtlCommandBuffer = [mtlCommandQueue commandBuffer];
- [mtlCommandBuffer retain];
- }
+ if (!mtlCommandBuffer) {
+ mtlCommandBuffer = [mtlCommandQueue commandBuffer];
+ [mtlCommandBuffer retain];
+ }
- mtlComputeEncoder = [mtlCommandBuffer
- computeCommandEncoderWithDispatchType:concurrent ? MTLDispatchTypeConcurrent :
- MTLDispatchTypeSerial];
+ mtlComputeEncoder = [mtlCommandBuffer
+ computeCommandEncoderWithDispatchType:concurrent ? MTLDispatchTypeConcurrent :
+ MTLDispatchTypeSerial];
- /* declare usage of MTLBuffers etc */
- prepare_resources(kernel);
+ /* declare usage of MTLBuffers etc */
+ prepare_resources(kernel);
+ }
return mtlComputeEncoder;
}
diff --git a/intern/cycles/device/metal/util.mm b/intern/cycles/device/metal/util.mm
index d2143c389dc..0a8b0ee6f10 100644
--- a/intern/cycles/device/metal/util.mm
+++ b/intern/cycles/device/metal/util.mm
@@ -45,35 +45,12 @@ MetalGPUVendor MetalInfo::get_vendor_from_device_name(string const &device_name)
bool MetalInfo::device_version_check(id<MTLDevice> device)
{
+ /* Metal Cycles doesn't work correctly on macOS versions older than 12.0 */
if (@available(macos 12.0, *)) {
MetalGPUVendor vendor = get_vendor_from_device_name([[device name] UTF8String]);
-
- static const char *forceIntelStr = getenv("CYCLES_METAL_FORCE_INTEL");
- bool forceIntel = forceIntelStr ? (atoi(forceIntelStr) != 0) : false;
-
- if (forceIntel) {
- /* return false for non-Intel GPUs to force selection of Intel */
- if (vendor == METAL_GPU_INTEL) {
- return true;
- }
- }
- else {
- switch (vendor) {
- case METAL_GPU_INTEL:
- /* isLowPower only returns true on machines that have an AMD GPU also
- * For Intel only machines - isLowPower will return false
- */
- if (getenv("CYCLES_METAL_ALLOW_LOW_POWER_GPUS") || !device.isLowPower) {
- return true;
- }
- return false;
- case METAL_GPU_APPLE:
- case METAL_GPU_AMD:
- return true;
- default:
- return false;
- }
- }
+
+ /* Metal Cycles works on Apple Silicon GPUs at present */
+ return (vendor == METAL_GPU_APPLE);
}
return false;