Можете ли вы сгенерировать только подмножество mip-карт для текстуры MTL, используя вид текстуры? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать только подмножество мипмапов для текстуры, используя вид текстуры, но все мои попытки приводят к тому, что Металл выдает следующую ошибку:

Выполнение буфера команд было прервано из-за ошибки во время выполнения. Проигнорировано (для того, чтобы вызвать предыдущие / чрезмерные ошибки 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

...