[CoreVideo] Make P/Invokes in CVImageBuffer and CVMetalTexture[Cache] have blittable signatures. (#20500)

Contributes towards #15684.
This commit is contained in:
Rolf Bjarne Kvinge 2024-04-25 10:59:44 +02:00 коммит произвёл GitHub
Родитель 2d278f672d
Коммит 3ca9851df7
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 36 добавлений и 30 удалений

Просмотреть файл

@ -83,12 +83,11 @@ namespace CoreVideo {
} }
[DllImport (Constants.CoreVideoLibrary)] [DllImport (Constants.CoreVideoLibrary)]
[return: MarshalAs (UnmanagedType.I1)] extern static /* Boolean */ byte CVImageBufferIsFlipped (/* CVImageBufferRef __nonnull */ IntPtr imageBuffer);
extern static /* Boolean */ bool CVImageBufferIsFlipped (/* CVImageBufferRef __nonnull */ IntPtr imageBuffer);
public bool IsFlipped { public bool IsFlipped {
get { get {
return CVImageBufferIsFlipped (Handle); return CVImageBufferIsFlipped (Handle) != 0;
} }
} }

Просмотреть файл

@ -47,8 +47,7 @@ namespace CoreVideo {
/* CVMetalTextureRef __nonnull */ IntPtr image); /* CVMetalTextureRef __nonnull */ IntPtr image);
[DllImport (Constants.CoreVideoLibrary)] [DllImport (Constants.CoreVideoLibrary)]
[return: MarshalAs (UnmanagedType.I1)] extern static /* Boolean */ byte CVMetalTextureIsFlipped (/* CVMetalTextureRef __nonnull */ IntPtr image);
extern static /* Boolean */ bool CVMetalTextureIsFlipped (/* CVMetalTextureRef __nonnull */ IntPtr image);
[DllImport (Constants.CoreVideoLibrary)] [DllImport (Constants.CoreVideoLibrary)]
extern static void CVMetalTextureGetCleanTexCoords (/* CVMetalTextureRef __nonnull */ IntPtr image, extern static void CVMetalTextureGetCleanTexCoords (/* CVMetalTextureRef __nonnull */ IntPtr image,
@ -63,7 +62,7 @@ namespace CoreVideo {
public bool IsFlipped { public bool IsFlipped {
get { get {
return CVMetalTextureIsFlipped (Handle); return CVMetalTextureIsFlipped (Handle) != 0;
} }
} }

Просмотреть файл

@ -27,12 +27,12 @@ namespace CoreVideo {
public partial class CVMetalTextureCache : NativeObject { public partial class CVMetalTextureCache : NativeObject {
[DllImport (Constants.CoreVideoLibrary)] [DllImport (Constants.CoreVideoLibrary)]
extern static int /* CVReturn = int32_t */ CVMetalTextureCacheCreate ( unsafe extern static CVReturn /* CVReturn = int32_t */ CVMetalTextureCacheCreate (
/* CFAllocatorRef __nullable */ IntPtr allocator, /* CFAllocatorRef __nullable */ IntPtr allocator,
/* CFDictionaryRef __nullable */ IntPtr cacheAttributes, /* CFDictionaryRef __nullable */ IntPtr cacheAttributes,
/* id<MTLDevice> __nonnull */ IntPtr metalDevice, /* id<MTLDevice> __nonnull */ IntPtr metalDevice,
/* CFDictionaryRef __nullable */ IntPtr textureAttributes, /* CFDictionaryRef __nullable */ IntPtr textureAttributes,
/* CVMetalTextureCacheRef __nullable * __nonnull */ out IntPtr cacheOut); /* CVMetalTextureCacheRef __nullable * __nonnull */ IntPtr* cacheOut);
[Preserve (Conditional = true)] [Preserve (Conditional = true)]
internal CVMetalTextureCache (NativeHandle handle, bool owns) internal CVMetalTextureCache (NativeHandle handle, bool owns)
@ -45,11 +45,15 @@ namespace CoreVideo {
if (metalDevice is null) if (metalDevice is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice)); ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice));
CVReturn err = (CVReturn) CVMetalTextureCacheCreate (IntPtr.Zero, IntPtr handle;
CVReturn err;
unsafe {
err = CVMetalTextureCacheCreate (IntPtr.Zero,
IntPtr.Zero, /* change one day to support cache attributes */ IntPtr.Zero, /* change one day to support cache attributes */
metalDevice.Handle, metalDevice.Handle,
textureAttributes.GetHandle (), textureAttributes.GetHandle (),
out var handle); &handle);
}
if (err == CVReturn.Success) if (err == CVReturn.Success)
return handle; return handle;
@ -66,11 +70,15 @@ namespace CoreVideo {
if (metalDevice is null) if (metalDevice is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice)); ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice));
IntPtr handle; IntPtr handle;
if (CVMetalTextureCacheCreate (IntPtr.Zero, CVReturn err;
unsafe {
err = CVMetalTextureCacheCreate (IntPtr.Zero,
IntPtr.Zero, /* change one day to support cache attributes */ IntPtr.Zero, /* change one day to support cache attributes */
metalDevice.Handle, metalDevice.Handle,
IntPtr.Zero, /* change one day to support texture attribuets */ IntPtr.Zero, /* change one day to support texture attribuets */
out handle) == 0) &handle);
}
if (err == 0)
return new CVMetalTextureCache (handle, true); return new CVMetalTextureCache (handle, true);
return null; return null;
} }
@ -85,11 +93,13 @@ namespace CoreVideo {
if (metalDevice is null) if (metalDevice is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice)); ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (metalDevice));
IntPtr handle; IntPtr handle;
creationErr = (CVReturn) CVMetalTextureCacheCreate (IntPtr.Zero, unsafe {
creationErr = CVMetalTextureCacheCreate (IntPtr.Zero,
IntPtr.Zero, /* change one day to support cache attributes */ IntPtr.Zero, /* change one day to support cache attributes */
metalDevice.Handle, metalDevice.Handle,
textureAttributes.GetHandle (), textureAttributes.GetHandle (),
out handle); &handle);
}
if (creationErr == CVReturn.Success) if (creationErr == CVReturn.Success)
return new CVMetalTextureCache (handle, true); return new CVMetalTextureCache (handle, true);
return null; return null;
@ -107,16 +117,18 @@ namespace CoreVideo {
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (imageBuffer)); ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (imageBuffer));
IntPtr texture; IntPtr texture;
errorCode = CVMetalTextureCacheCreateTextureFromImage ( unsafe {
allocator: IntPtr.Zero, errorCode = CVMetalTextureCacheCreateTextureFromImage (
textureCache: Handle, /* textureCache dict, one day we might add it */ allocator: IntPtr.Zero,
sourceImage: imageBuffer.Handle, textureCache: Handle, /* textureCache dict, one day we might add it */
textureAttr: IntPtr.Zero, sourceImage: imageBuffer.Handle,
format: (nuint) (ulong) format, textureAttr: IntPtr.Zero,
width: width, format: (nuint) (ulong) format,
height: height, width: width,
planeIndex: planeIndex, height: height,
textureOut: out texture); planeIndex: planeIndex,
textureOut: &texture);
}
if (errorCode != 0) if (errorCode != 0)
return null; return null;
return new CVMetalTexture (texture, true); return new CVMetalTexture (texture, true);
@ -132,7 +144,7 @@ namespace CoreVideo {
} }
[DllImport (Constants.CoreVideoLibrary)] [DllImport (Constants.CoreVideoLibrary)]
extern static CVReturn CVMetalTextureCacheCreateTextureFromImage ( unsafe extern static CVReturn CVMetalTextureCacheCreateTextureFromImage (
/* CFAllocatorRef __nullable */ IntPtr allocator, /* CFAllocatorRef __nullable */ IntPtr allocator,
/* CVMetalTextureCacheRef __nonnull */ IntPtr textureCache, /* CVMetalTextureCacheRef __nonnull */ IntPtr textureCache,
/* CVImageBufferRef __nonnull */ IntPtr sourceImage, /* CVImageBufferRef __nonnull */ IntPtr sourceImage,
@ -141,7 +153,7 @@ namespace CoreVideo {
/* size_t */ nint width, /* size_t */ nint width,
/* size_t */ nint height, /* size_t */ nint height,
/* size_t */ nint planeIndex, /* size_t */ nint planeIndex,
/* CVMetalTextureRef __nullable * __nonnull */ out IntPtr textureOut); /* CVMetalTextureRef __nullable * __nonnull */ IntPtr* textureOut);
} }
} }

Просмотреть файл

@ -64,7 +64,6 @@ namespace Cecil.Tests {
"AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSend(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSend(System.IntPtr,System.IntPtr)",
"AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper_stret(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper_stret(System.IntPtr,System.IntPtr)",
"AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper(System.IntPtr,System.IntPtr)",
"CoreVideo.CVReturn CoreVideo.CVMetalTextureCache::CVMetalTextureCacheCreateTextureFromImage(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.UIntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr&)",
"CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreate(System.IntPtr,System.IntPtr,System.IntPtr,CoreVideo.CVPixelFormatType,System.IntPtr,System.IntPtr&)", "CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreate(System.IntPtr,System.IntPtr,System.IntPtr,CoreVideo.CVPixelFormatType,System.IntPtr,System.IntPtr&)",
"CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreateResolvedAttributesDictionary(System.IntPtr,System.IntPtr,System.IntPtr&)", "CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreateResolvedAttributesDictionary(System.IntPtr,System.IntPtr,System.IntPtr&)",
"CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreateWithBytes(System.IntPtr,System.IntPtr,System.IntPtr,CoreVideo.CVPixelFormatType,System.IntPtr,System.IntPtr,method System.Void *(System.IntPtr,System.IntPtr),System.IntPtr,System.IntPtr,System.IntPtr&)", "CoreVideo.CVReturn CoreVideo.CVPixelBuffer::CVPixelBufferCreateWithBytes(System.IntPtr,System.IntPtr,System.IntPtr,CoreVideo.CVPixelFormatType,System.IntPtr,System.IntPtr,method System.Void *(System.IntPtr,System.IntPtr),System.IntPtr,System.IntPtr,System.IntPtr&)",
@ -153,8 +152,6 @@ namespace Cecil.Tests {
"Security.SslStatus Security.SslContext::SSLRead(System.IntPtr,System.Byte*,System.IntPtr,System.IntPtr&)", "Security.SslStatus Security.SslContext::SSLRead(System.IntPtr,System.Byte*,System.IntPtr,System.IntPtr&)",
"Security.SslStatus Security.SslContext::SSLSetSessionOption(System.IntPtr,Security.SslSessionOption,System.Boolean)", "Security.SslStatus Security.SslContext::SSLSetSessionOption(System.IntPtr,Security.SslSessionOption,System.Boolean)",
"Security.SslStatus Security.SslContext::SSLWrite(System.IntPtr,System.Byte*,System.IntPtr,System.IntPtr&)", "Security.SslStatus Security.SslContext::SSLWrite(System.IntPtr,System.Byte*,System.IntPtr,System.IntPtr&)",
"System.Boolean CoreVideo.CVImageBuffer::CVImageBufferIsFlipped(System.IntPtr)",
"System.Boolean CoreVideo.CVMetalTexture::CVMetalTextureIsFlipped(System.IntPtr)",
"System.Boolean CoreVideo.CVPixelBuffer::CVPixelBufferIsPlanar(System.IntPtr)", "System.Boolean CoreVideo.CVPixelBuffer::CVPixelBufferIsPlanar(System.IntPtr)",
"System.Boolean CoreVideo.CVPixelFormatTypeExtensions::CVIsCompressedPixelFormatAvailable(System.UInt32)", "System.Boolean CoreVideo.CVPixelFormatTypeExtensions::CVIsCompressedPixelFormatAvailable(System.UInt32)",
"System.Boolean Foundation.NSObject::xamarin_set_gchandle_with_flags_safe(System.IntPtr,System.IntPtr,Foundation.NSObject/XamarinGCHandleFlags)", "System.Boolean Foundation.NSObject::xamarin_set_gchandle_with_flags_safe(System.IntPtr,System.IntPtr,Foundation.NSObject/XamarinGCHandleFlags)",
@ -233,7 +230,6 @@ namespace Cecil.Tests {
"System.Int32 AudioUnit.AudioUnit::AudioUnitGetProperty(System.IntPtr,AudioUnit.AudioUnitPropertyIDType,AudioUnit.AudioUnitScopeType,System.UInt32,System.UInt32&,System.UInt32&)", "System.Int32 AudioUnit.AudioUnit::AudioUnitGetProperty(System.IntPtr,AudioUnit.AudioUnitPropertyIDType,AudioUnit.AudioUnitScopeType,System.UInt32,System.UInt32&,System.UInt32&)",
"System.Int32 AudioUnit.AudioUnit::AudioUnitSetProperty(System.IntPtr,AudioUnit.AudioUnitPropertyIDType,AudioUnit.AudioUnitScopeType,System.UInt32,AudioToolbox.AudioStreamBasicDescription&,System.UInt32)", "System.Int32 AudioUnit.AudioUnit::AudioUnitSetProperty(System.IntPtr,AudioUnit.AudioUnitPropertyIDType,AudioUnit.AudioUnitScopeType,System.UInt32,AudioToolbox.AudioStreamBasicDescription&,System.UInt32)",
"System.Int32 AudioUnit.AUGraph::NewAUGraph(System.IntPtr&)", "System.Int32 AudioUnit.AUGraph::NewAUGraph(System.IntPtr&)",
"System.Int32 CoreVideo.CVMetalTextureCache::CVMetalTextureCacheCreate(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr&)",
"System.Int32 ObjCRuntime.Runtime::_NSGetExecutablePath(System.Byte[],System.Int32&)", "System.Int32 ObjCRuntime.Runtime::_NSGetExecutablePath(System.Byte[],System.Int32&)",
"System.Int32 Security.Authorization::AuthorizationCreate(Security.AuthorizationItemSet*,Security.AuthorizationItemSet*,Security.AuthorizationFlags,System.IntPtr&)", "System.Int32 Security.Authorization::AuthorizationCreate(Security.AuthorizationItemSet*,Security.AuthorizationItemSet*,Security.AuthorizationFlags,System.IntPtr&)",
"System.Int32 Security.SecCertificate::SecCertificateCopyCommonName(System.IntPtr,System.IntPtr&)", "System.Int32 Security.SecCertificate::SecCertificateCopyCommonName(System.IntPtr,System.IntPtr&)",