I set mipmapped
to YES
in texture2DDescriptorWithPixelFormat
and call generateMipmapsForTexture
method of MTLBlitCommandEncoder
on given texture to automatically generate mipmaps.
The question is if I have set the mipmapped
to YES
, doesn't it means that the resulting image should be mipmapped, why should I need MTLBlitCommandEncoder
to explicit generate mipmaps?
It's a bit confusing, so let's walk through it.
texture2DDescriptorWithPixelFormat
takes format
, width
, height
and mipmapped
as parameters. The mipmapped
parameter is there to tell Metal to calculate the number of mip levels that resulting image will have, since there is no parameter to pass mip level count. Here's how it's described in documentation:
mipmapped
A
Boolean
indicating whether the resulting image should be mipmapped. IfYES
, then themipmapLevelCount
property in the returned descriptor is computed fromwidth
andheight
. IfNO
, thenmipmapLevelCount
is1
.
If you would use newTextureWithDescriptor
with texture descriptor you created explicitly, then there's no mipmapped
parameter, since you explicitly pass number of mip levels in mipmapLevelCount
property of MTLTextureDescriptor
.
Since you create a new texture, there's no reason to generate mipmaps, since the texture is empty.
The generateMipmapsForTexture
method is used to generate mipmaps for a texture that already has mip levels and you just need to populate them with mipmaps generated automatically.
So, to get this straight, mipmapped
parameter just tells Metal to create a texture that has mip levels, that you can later populate (if you want) with generateMipmapsForTexture
(or in some other ways, such as using texture as color attachment in render pass with level specified).