В металлическом приложении iOS я рендеринг на mtkView на фоновом потоке. Я получаю текущий renderDescriptor из представления, используя mtkView.currentRenderPassDescriptor. Я использую этот renderDescriptor для создания MTLRenderCommandEncoder. То, что MTLRenderCommandEncoder иногда имеет несовместимый размер при изменении ориентации: _width и _height отличаются от размера, хранящегося в currentRenderPassDescriptor. Это вызывает проблему при использовании метода setScissor:
Неудачное утверждение `(rect.x (0) + rect.width (1792)) (1792) должно быть <= ширина прохода рендеринга (828) '. </p>
Итак, мои вопросы:
Почему эти два размера отличаются? Откуда берется второй размер?
Как я могу получить доступ к этому второму размеру (MTLRenderCommandEncoder -> _ width), так как он кажется «реальным размером», используемым для проверки метода setScissor?
Это сводка кода:
MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor;
renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear;
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 1);
id<MTLRenderCommandEncoder> renderEncoder =
[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
CGFloat colorAttachementWidth = _passDescriptor.colorAttachments[0].texture.width;
CGFloat colorAttachementHeight = _passDescriptor.colorAttachments[0].texture.height;
MTLScissorRect rect;
rect.x = 0;
rect.y = 0;
rect.width = colorAttachementWidth;
rect.height = colorAttachementHeight;
[renderEncoder setScissorRect:self.scissorRect]; // -> that will trigger the assertion
Это описание MTLRenderCommandEncoder, когда я получаю утверждение:
<MTLDebugRenderCommandEncoder: 0x105e98000> -> <AGXA12FamilyRenderContext: 0x281dc27c0>
label = MyRenderEncoder
device = <AGXA12Device: 0x10aee4000>
name = Apple A12 GPU
descriptor = <MTLRenderPassDescriptorInternal: 0x283d909c0>
Color Attachment 0
texture = <AGXA12FamilyTexture: 0x105f128d0>
label = Drawable
textureType = MTLTextureType2D
pixelFormat = MTLPixelFormatBGRA8Unorm
width = 1792 // <——————————————————— this size is not consistent with the size below
height = 828
depth = 1
arrayLength = 1
mipmapLevelCount = 1
sampleCount = 1
cpuCacheMode = MTLCPUCacheModeDefaultCache
storageMode = MTLStorageModeShared
resourceOptions = MTLResourceCPUCacheModeDefaultCache MTLResourceStorageModeShared
…
level = 0
slice = 0
depthPlane = 0
resolveTexture = <null>
resolveLevel = 0
resolveSlice = 0
resolveDepthPlane = 0
loadAction = MTLLoadActionClear
storeAction = MTLStoreActionStore
storeActionOptions = none
clearColor = (0 0 0 1)
yInvert = NO
...
Depth Attachment:
texture = <AGXA12FamilyTexture: 0x105cb2fc0>
label = Render Depth
textureType = MTLTextureType2D
pixelFormat = MTLPixelFormatDepth32Float
width = 828 // <——————————————————— this size is not consistent
height = 1792
depth = 1
arrayLength = 1
mipmapLevelCount = 1
sampleCount = 1
cpuCacheMode = MTLCPUCacheModeDefaultCache
storageMode = MTLStorageModePrivate
resourceOptions = MTLResourceCPUCacheModeDefaultCache MTLResourceStorageModePrivate
usage = MTLTextureUsageRenderTarget
...