Я пытаюсь создать только подмножество мипмапов для текстуры, используя вид текстуры, но все мои попытки приводят к тому, что Металл выдает следующую ошибку:
Выполнение буфера команд было прервано из-за ошибки во время выполнения. Проигнорировано (для того, чтобы вызвать предыдущие / чрезмерные ошибки GPU) (код IOAF 4)
Псевдокод:
// This is a texture that is 1024 x 1024 with 11 mipmap levels.
id<MTLTexture> destinationTexture = ...
// Extract all mipmap levels from 256 and smaller
NSRange levelsRange = NSMakeRange(2, 9);
// Create a new texture view for that includes only those levels from the destination texture.
id<MTLTexture> destinationView = [destinationTexture newTextureViewWithPixelFormat:destinationTexture.pixelFormat
textureType:destinationTexture.textureType
levels:levelsRange
slices:NSMakeRange(0, 1)];
// Copy a region from a source texture into the destination view,
// starting at level 0 of the view which, I think, should represent
// level 2 of its parent texture.
[blitEncoder copyFromTexture:sourceTexture
sourceSlice:0
sourceLevel:0
sourceOrigin:sourceOrigin
sourceSize:sourceSize
toTexture:destinationView
destinationSlice:0
destinationLevel:0
destinationOrigin:destinationOrigin];
// Generate mipmaps on the destination view. This causes the crash.
[blitEncoder generateMipmapsForTexture:destinationView];
Мое намерение здесь состоит в том, чтобы быстро визуализировать некоторый контент с более низким разрешением и скопировать его в текстуру, а затем постепенно визуализировать контент с более высоким разрешением. Я мог бы визуализировать контент для каждого уровня mipmap явно, но я надеялся просто выбрать несколько уровней «отсечки», а затем сделать так, чтобы Metal генерировал mipmaps для всех уровней ниже предела.
В существующем состоянии блит корректно выполняется и текстура обновляется, но он падает, если я пытаюсь сгенерировать мипмапы. Если я не сгенерирую mipmaps, то мне нужно будет явно сэмплировать с этого уровня, используя lod()
, тогда как я надеялся использовать вместо этого функцию bias()
для ограничения диапазона.
Трассировка стека:
![Stack Trace](https://i.stack.imgur.com/hNinW.png)