несовместимый размер MTLRenderCommandEncoder во время изменения ориентации - PullRequest
0 голосов
/ 15 октября 2019

В металлическом приложении 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  

    ...
...