From b5b103e75ca19a8321b7ea0fab502d096cf55298 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Wed, 16 Oct 2019 18:50:01 -0400 Subject: [PATCH] Fix crashes for Metal 3.0 capabilities. Don't allocate MTLHeap of zero size. MVKImage check for device memory when accessing MTLCPUCacheMode.. --- MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm | 3 +++ MoltenVK/MoltenVK/GPUObjects/MVKImage.h | 2 +- MoltenVK/MoltenVK/GPUObjects/MVKImage.mm | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm index c1917373..50301656 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm @@ -178,6 +178,9 @@ bool MVKDeviceMemory::ensureMTLHeap() { // Don't bother if we don't have placement heaps. if (!getDevice()->_pMetalFeatures->placementHeaps) { return true; } + // Can't create MTLHeaps of zero size. + if (_allocationSize == 0) { return true; } + #if MVK_MACOS // MTLHeaps on Mac must use private storage for now. if (_mtlStorageMode != MTLStorageModePrivate) { return true; } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h index f210a13c..2e25267b 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h @@ -216,7 +216,7 @@ public: MTLStorageMode getMTLStorageMode(); /** Returns the Metal CPU cache mode used by this image. */ - inline MTLCPUCacheMode getMTLCPUCacheMode() { return _deviceMemory->getMTLCPUCacheMode(); } + MTLCPUCacheMode getMTLCPUCacheMode(); /** * Returns whether the memory is automatically coherent between device and host. diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm index 827754a4..df00a3bd 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm @@ -487,6 +487,10 @@ MTLStorageMode MVKImage::getMTLStorageMode() { return stgMode; } +MTLCPUCacheMode MVKImage::getMTLCPUCacheMode() { + return _deviceMemory ? _deviceMemory->getMTLCPUCacheMode() : MTLCPUCacheModeDefaultCache; +} + bool MVKImage::isMemoryHostCoherent() { return (getMTLStorageMode() == MTLStorageModeShared); }