diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m index 3792d80327..04a5bff596 100644 --- a/src/gpu/metal/SDL_gpu_metal.m +++ b/src/gpu/metal/SDL_gpu_metal.m @@ -4166,33 +4166,40 @@ static SDL_GPUDevice *METAL_CreateDevice(bool debugMode, bool preferLowPower, SD { @autoreleasepool { MetalRenderer *renderer; - - // Allocate and zero out the renderer - renderer = (MetalRenderer *)SDL_calloc(1, sizeof(MetalRenderer)); + id device = NULL; // Create the Metal device and command queue #ifdef SDL_PLATFORM_MACOS if (preferLowPower) { NSArray> *devices = MTLCopyAllDevices(); - for (id device in devices) { - if (device.isLowPower) { - renderer->device = device; + for (id candidate in devices) { + if (candidate.isLowPower) { + device = candidate; break; } } } #endif - if (renderer->device == NULL) { - renderer->device = MTLCreateSystemDefaultDevice(); + if (device == NULL) { + device = MTLCreateSystemDefaultDevice(); + if (device == NULL) { + SDL_SetError("Failed to create Metal device"); + return NULL; + } } - renderer->queue = [renderer->device newCommandQueue]; + + // Allocate and zero out the renderer + renderer = (MetalRenderer *)SDL_calloc(1, sizeof(MetalRenderer)); + + renderer->device = device; + renderer->queue = [device newCommandQueue]; // Print driver info SDL_LogInfo(SDL_LOG_CATEGORY_GPU, "SDL_GPU Driver: Metal"); SDL_LogInfo( SDL_LOG_CATEGORY_GPU, "Metal Device: %s", - [renderer->device.name UTF8String]); + [device.name UTF8String]); // Remember debug mode renderer->debugMode = debugMode;