In my iOS project Metal
is used extensively.
Sometimes MTLDevice newTextureWithDescriptor
fails to create a texture.
Texture format is valid, it's a small RGBA 512x512 texture, everything is set up correctly.
When I print MTLDevice.currentAllocatedSize >> 20
it's 1396 MB
on iPhone XR
( A12
processor ).
I've used a lot this thread for max runtime RAM estimate: https://stackoverflow.com/a/15200855/2567725
So I believe for iPhone XR max allowed RAM is 1792 MB
.
I guess the texture is not created because RAM has been exsausted.
So the guestions are:
Is it true that on A12 Metal's
currentAllocatedSize
correlates withCPU
memory, andGPU
memory is "shared" with the CPU one, so1792 MB = GPU+CPU
for iPhone XR ?Is there any way to get the description of Metal error? (now it just returns
nil
innewTextureWithDescriptor
).Is it possible to know how Metal allocation strategy works, e.g. how small available
RAM
should be toMTLDevice newTextureWithDescriptor
returnnil
?
UPDATE:
In some cases, however, MTLDevice.currentAllocatedSize >> 20
is much less, e.g. 14 MB
, so I suspect Metal
has some state corruption. But how to check what's the reason of the error?
The debug description of a texture descriptor:
textureDescriptor.pixelFormat = 70
textureDescriptor.width = 512
textureDescriptor.height = 512
textureDescriptor.textureType = 3
textureDescriptor.usage = 23
textureDescriptor.arrayLength = 1000
textureDescriptor.sampleCount = 1
textureDescriptor.mipmapLevelCount = 1
device.currentAllocatedSize >> 20 = 14