MPSCopyAllocator 无法初始化
MPSCopyAllocator can't initialize
在Objective-C
我尝试使用这种方法就地编码命令缓冲区。
-(BOOL) encodeToCommandBuffer: (nonnull id <MTLCommandBuffer>)commandBuffer
inPlaceTexture: (__nonnull id <MTLTexture> __strong * __nonnull) texture
fallbackCopyAllocator: (nullable MPSCopyAllocator) copyAllocator
MPS_SWIFT_NAME(encode(commandBuffer:inPlaceTexture:fallbackCopyAllocator:));
我想创建一个新的 MPSCopyAllocator 。
我使用了文档中的以下代码。
MPSCopyAllocator myAllocator = ^id <MTLTexture> _Nonnull (MPSKernel * __nonnull filter, __nonnull id <MTLCommandBuffer> cmdBuf, __nonnull id <MTLTexture> sourceTexture)
{
MTLPixelFormat format = sourceTexture.pixelFormat;
MTLTextureDescriptor *d = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: format width: sourceTexture.width height: sourceTexture.height mipmapped: NO];
id <MTLTexture> result = [cmdBuf.device newTextureWithDescriptor: d];
return result;
/
};
但是我在问题导航器中遇到了语义问题
Incompatible block pointer types initializing '__strong MPSCopyAllocator' (aka 'id<MTLTexture> _Nonnull (^__strong)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer> _Nonnull __strong, id<MTLTexture> _Nonnull __strong)') with an expression of type 'id<MTLTexture> _Nonnull (^)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer> _Nonnull __strong, id<MTLTexture> _Nonnull __strong)'
MPSCopyAllocator 定义
typedef id <MTLTexture> __nonnull NS_RETURNS_RETAINED (^MPSCopyAllocator)( MPSKernel * __nonnull filter,
id <MTLCommandBuffer> __nonnull commandBuffer,
id <MTLTexture> __nonnull sourceTexture);
创建 MPSCopyAllocator 的正确方法是什么?
遗憾的是,在将其分配给变量时,您需要在块定义中包含 NS_RETURNS_RETAINED
:
MPSCopyAllocator allocator = ^id <MTLTexture> NS_RETURNS_RETAINED(MPSKernel *filter,
id <MTLCommandBuffer> commandBuffer,
id <MTLTexture> sourceTexture)
{
// ...
};
为了简洁起见,我在这里省略了可空性注释,因为它们是可选的。
在Objective-C 我尝试使用这种方法就地编码命令缓冲区。
-(BOOL) encodeToCommandBuffer: (nonnull id <MTLCommandBuffer>)commandBuffer
inPlaceTexture: (__nonnull id <MTLTexture> __strong * __nonnull) texture
fallbackCopyAllocator: (nullable MPSCopyAllocator) copyAllocator
MPS_SWIFT_NAME(encode(commandBuffer:inPlaceTexture:fallbackCopyAllocator:));
我想创建一个新的 MPSCopyAllocator 。
我使用了文档中的以下代码。
MPSCopyAllocator myAllocator = ^id <MTLTexture> _Nonnull (MPSKernel * __nonnull filter, __nonnull id <MTLCommandBuffer> cmdBuf, __nonnull id <MTLTexture> sourceTexture)
{
MTLPixelFormat format = sourceTexture.pixelFormat;
MTLTextureDescriptor *d = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: format width: sourceTexture.width height: sourceTexture.height mipmapped: NO];
id <MTLTexture> result = [cmdBuf.device newTextureWithDescriptor: d];
return result;
/
};
但是我在问题导航器中遇到了语义问题
Incompatible block pointer types initializing '__strong MPSCopyAllocator' (aka 'id<MTLTexture> _Nonnull (^__strong)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer> _Nonnull __strong, id<MTLTexture> _Nonnull __strong)') with an expression of type 'id<MTLTexture> _Nonnull (^)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer> _Nonnull __strong, id<MTLTexture> _Nonnull __strong)'
MPSCopyAllocator 定义
typedef id <MTLTexture> __nonnull NS_RETURNS_RETAINED (^MPSCopyAllocator)( MPSKernel * __nonnull filter,
id <MTLCommandBuffer> __nonnull commandBuffer,
id <MTLTexture> __nonnull sourceTexture);
创建 MPSCopyAllocator 的正确方法是什么?
遗憾的是,在将其分配给变量时,您需要在块定义中包含 NS_RETURNS_RETAINED
:
MPSCopyAllocator allocator = ^id <MTLTexture> NS_RETURNS_RETAINED(MPSKernel *filter,
id <MTLCommandBuffer> commandBuffer,
id <MTLTexture> sourceTexture)
{
// ...
};
为了简洁起见,我在这里省略了可空性注释,因为它们是可选的。