转载请注明出处:https://www.jianshu.com/p/058cb8bf0a63 古道西风瘦啥
环境:unity 2018.2.7f1、xcode 11.2。
升级xcode11后,用unity导出ios工程编译报错Typedef redefinition with different types ('void *' vs 'struct __CVMetalTextureCache *')
解决方法很简单,在CVTextureCache.mm文件中,全局替换:
把 CVMetalTextureCacheRef 替换为 UCVMetalTextureCacheRef、
把 CVMetalTextureRef 替换为 UCVMetalTextureRef。
#include "CVTextureCache.h"
#include "DisplayManager.h"
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
#include <CoreVideo/CVOpenGLESTextureCache.h>
#include "UnityMetalSupport.h"
#if UNITY_CAN_USE_METAL
#include <CoreVideo/CVMetalTextureCache.h>
#else
const CFStringRef kCVPixelBufferMetalCompatibilityKey = CFSTR("MetalCompatibility");
typedef void* UCVMetalTextureCacheRef;
typedef void* UCVMetalTextureRef;
inline CVReturn CVMetalTextureCacheCreate(CFAllocatorRef, CFDictionaryRef, MTLDeviceRef, CFDictionaryRef, UCVMetalTextureCacheRef*) { return 0; }
inline CVReturn CVMetalTextureCacheCreateTextureFromImage(CFAllocatorRef, UCVMetalTextureCacheRef, CVImageBufferRef, CFDictionaryRef, MTLPixelFormat, size_t, size_t, size_t, UCVMetalTextureRef*) { return 0; }
inline void CVMetalTextureCacheFlush(UCVMetalTextureCacheRef, uint64_t options) {}
inline MTLTextureRef CVMetalTextureGetTexture(UCVMetalTextureRef) { return nil; }
inline Boolean CVMetalTextureIsFlipped(UCVMetalTextureRef) { return 0; }
#endif
void* CreateCVTextureCache()
{
void* ret = 0;
CVReturn err = 0;
if (UnitySelectedRenderingAPI() == apiMetal)
err = CVMetalTextureCacheCreate(kCFAllocatorDefault, 0, UnityGetMetalDevice(), 0, (UCVMetalTextureCacheRef*)&ret);
else
err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, 0, UnityGetMainScreenContextGLES(), 0, (CVOpenGLESTextureCacheRef*)&ret);
if (err)
{
::printf("Error at CVOpenGLESTextureCacheCreate: %d", err);
ret = 0;
}
return ret;
}
void FlushCVTextureCache(void* cache)
{
if (UnitySelectedRenderingAPI() == apiMetal)
CVMetalTextureCacheFlush((UCVMetalTextureCacheRef)cache, 0);
else
CVOpenGLESTextureCacheFlush((CVOpenGLESTextureCacheRef)cache, 0);
}
void* CreateTextureFromCVTextureCache(void* cache, void* image, size_t w, size_t h)
{
void* texture = 0;
CVReturn err = 0;
if (UnitySelectedRenderingAPI() == apiMetal)
{
err = CVMetalTextureCacheCreateTextureFromImage(
kCFAllocatorDefault, (UCVMetalTextureCacheRef)cache, (CVImageBufferRef)image, 0,
MTLPixelFormatBGRA8Unorm, w, h, 0, (UCVMetalTextureRef*)&texture
);
}
else
{
err = CVOpenGLESTextureCacheCreateTextureFromImage(
kCFAllocatorDefault, (CVOpenGLESTextureCacheRef)cache, (CVImageBufferRef)image, 0,
GL_TEXTURE_2D, GL_RGBA, (GLsizei)w, (GLsizei)h, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
0, (CVOpenGLESTextureRef*)&texture
);
}
if (err)
{
::printf("Error at CVOpenGLESTextureCacheCreateTextureFromImage: %d", err);
texture = 0;
}
return texture;
}
unsigned GetGLTextureFromCVTextureCache(void* texture)
{
assert(UnitySelectedRenderingAPI() != apiMetal);
return CVOpenGLESTextureGetName((CVOpenGLESTextureRef)texture);
}
id<MTLTexture> GetMetalTextureFromCVTextureCache(void* texture)
{
assert(UnitySelectedRenderingAPI() == apiMetal);
return CVMetalTextureGetTexture((UCVMetalTextureRef)texture);
}
uintptr_t GetTextureFromCVTextureCache(void* texture)
{
if (UnitySelectedRenderingAPI() == apiMetal)
return (uintptr_t)(__bridge void*)GetMetalTextureFromCVTextureCache(texture);
else
return (uintptr_t)GetGLTextureFromCVTextureCache(texture);
}
void* CreatePixelBufferForCVTextureCache(size_t w, size_t h)
{
NSString* apiKey = UnitySelectedRenderingAPI() == apiMetal ? (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey
: (__bridge NSString*)kCVPixelBufferOpenGLESCompatibilityKey;
CVPixelBufferRef pb = 0;
NSDictionary* options = @{ (__bridge NSString*)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA),
(__bridge NSString*)kCVPixelBufferWidthKey: @(w),
(__bridge NSString*)kCVPixelBufferHeightKey: @(h),
apiKey: @(YES),
(__bridge NSString*)kCVPixelBufferIOSurfacePropertiesKey: @{}};
CVPixelBufferCreate(kCFAllocatorDefault, w, h, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)options, &pb);
return pb;
}
void* CreateReadableRTFromCVTextureCache(void* cache, size_t w, size_t h, void** pb)
{
*pb = CreatePixelBufferForCVTextureCache(w, h);
return CreateTextureFromCVTextureCache(cache, *pb, w, h);
}
int IsCVTextureFlipped(void* texture)
{
if (UnitySelectedRenderingAPI() == apiMetal)
return CVMetalTextureIsFlipped((UCVMetalTextureRef)texture);
else
return CVOpenGLESTextureIsFlipped((CVOpenGLESTextureRef)texture);
}