ObjectiveCRuntime.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. namespace Veldrid.MetalBindings
  5. {
  6. public static unsafe class ObjectiveCRuntime
  7. {
  8. private const string ObjCLibrary = "/usr/lib/libobjc.A.dylib";
  9. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  10. public static extern void objc_msgSend(IntPtr receiver, Selector selector);
  11. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  12. public static extern void objc_msgSend(IntPtr receiver, Selector selector, float a);
  13. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  14. public static extern void objc_msgSend(IntPtr receiver, Selector selector, double a);
  15. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  16. public static extern void objc_msgSend(IntPtr receiver, Selector selector, CGRect a);
  17. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  18. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, uint b);
  19. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  20. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, NSRange b);
  21. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  22. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLSize a, MTLSize b);
  23. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  24. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr c, UIntPtr d, MTLSize e);
  25. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  26. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLClearColor a);
  27. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  28. public static extern void objc_msgSend(IntPtr receiver, Selector selector, CGSize a);
  29. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  30. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, UIntPtr b, UIntPtr c);
  31. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  32. public static extern void objc_msgSend(IntPtr receiver, Selector selector, void* a, UIntPtr b, UIntPtr c);
  33. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  34. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLPrimitiveType a, UIntPtr b, UIntPtr c, UIntPtr d, UIntPtr e);
  35. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  36. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLPrimitiveType a, UIntPtr b, UIntPtr c, UIntPtr d);
  37. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  38. public static extern void objc_msgSend(IntPtr receiver, Selector selector, NSRange a);
  39. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  40. public static extern void objc_msgSend(IntPtr receiver, Selector selector, UIntPtr a);
  41. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  42. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLCommandBufferHandler a);
  43. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  44. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, UIntPtr b);
  45. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  46. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLViewport a);
  47. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  48. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLScissorRect a);
  49. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  50. public static extern void objc_msgSend(IntPtr receiver, Selector selector, void* a, uint b, UIntPtr c);
  51. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  52. public static extern void objc_msgSend(IntPtr receiver, Selector selector, void* a, UIntPtr b);
  53. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  54. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLPrimitiveType a, UIntPtr b, MTLIndexType c, IntPtr d, UIntPtr e, UIntPtr f);
  55. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  56. public static extern void objc_msgSend(IntPtr receiver, Selector selector, MTLPrimitiveType a, MTLBuffer b, UIntPtr c);
  57. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  58. public static extern void objc_msgSend(
  59. IntPtr receiver,
  60. Selector selector,
  61. MTLPrimitiveType a,
  62. UIntPtr b,
  63. MTLIndexType c,
  64. IntPtr d,
  65. UIntPtr e,
  66. UIntPtr f,
  67. IntPtr g,
  68. UIntPtr h);
  69. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  70. public static extern void objc_msgSend(
  71. IntPtr receiver,
  72. Selector selector,
  73. MTLPrimitiveType a,
  74. MTLIndexType b,
  75. MTLBuffer c,
  76. UIntPtr d,
  77. MTLBuffer e,
  78. UIntPtr f);
  79. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  80. public static extern void objc_msgSend(
  81. IntPtr receiver,
  82. Selector selector,
  83. MTLBuffer a,
  84. UIntPtr b,
  85. MTLBuffer c,
  86. UIntPtr d,
  87. UIntPtr e);
  88. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  89. public static extern void objc_msgSend(
  90. IntPtr receiver,
  91. Selector selector,
  92. IntPtr a,
  93. UIntPtr b,
  94. UIntPtr c,
  95. UIntPtr d,
  96. MTLSize e,
  97. IntPtr f,
  98. UIntPtr g,
  99. UIntPtr h,
  100. MTLOrigin i);
  101. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  102. public static extern void objc_msgSend(
  103. IntPtr receiver,
  104. Selector selector,
  105. MTLRegion a,
  106. UIntPtr b,
  107. UIntPtr c,
  108. IntPtr d,
  109. UIntPtr e,
  110. UIntPtr f);
  111. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  112. public static extern void objc_msgSend(
  113. IntPtr receiver,
  114. Selector selector,
  115. MTLTexture a,
  116. UIntPtr b,
  117. UIntPtr c,
  118. MTLOrigin d,
  119. MTLSize e,
  120. MTLBuffer f,
  121. UIntPtr g,
  122. UIntPtr h,
  123. UIntPtr i);
  124. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  125. public static extern void objc_msgSend(
  126. IntPtr receiver,
  127. Selector selector,
  128. MTLTexture sourceTexture,
  129. UIntPtr sourceSlice,
  130. UIntPtr sourceLevel,
  131. MTLOrigin sourceOrigin,
  132. MTLSize sourceSize,
  133. MTLTexture destinationTexture,
  134. UIntPtr destinationSlice,
  135. UIntPtr destinationLevel,
  136. MTLOrigin destinationOrigin);
  137. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  138. public static extern byte* bytePtr_objc_msgSend(IntPtr receiver, Selector selector);
  139. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  140. public static extern CGSize CGSize_objc_msgSend(IntPtr receiver, Selector selector);
  141. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  142. public static extern byte byte_objc_msgSend(IntPtr receiver, Selector selector);
  143. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  144. public static extern Bool8 bool8_objc_msgSend(IntPtr receiver, Selector selector);
  145. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  146. public static extern Bool8 bool8_objc_msgSend(IntPtr receiver, Selector selector, UIntPtr a);
  147. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  148. public static extern Bool8 bool8_objc_msgSend(IntPtr receiver, Selector selector, IntPtr a);
  149. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  150. public static extern Bool8 bool8_objc_msgSend(IntPtr receiver, Selector selector, UIntPtr a, IntPtr b);
  151. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  152. public static extern Bool8 bool8_objc_msgSend(IntPtr receiver, Selector selector, uint a);
  153. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  154. public static extern uint uint_objc_msgSend(IntPtr receiver, Selector selector);
  155. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  156. public static extern float float_objc_msgSend(IntPtr receiver, Selector selector);
  157. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  158. public static extern CGFloat CGFloat_objc_msgSend(IntPtr receiver, Selector selector);
  159. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  160. public static extern double double_objc_msgSend(IntPtr receiver, Selector selector);
  161. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  162. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
  163. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  164. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr a);
  165. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  166. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, out NSError error);
  167. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  168. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, uint a, uint b, NSRange c, NSRange d);
  169. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  170. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, MTLComputePipelineDescriptor a, uint b, IntPtr c, out NSError error);
  171. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  172. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, uint a);
  173. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  174. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, UIntPtr a);
  175. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  176. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, IntPtr b, out NSError error);
  177. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  178. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr a, UIntPtr b);
  179. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  180. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, UIntPtr b, MTLResourceOptions c);
  181. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  182. public static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, void* a, UIntPtr b, MTLResourceOptions c);
  183. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  184. public static extern UIntPtr UIntPtr_objc_msgSend(IntPtr receiver, Selector selector);
  185. public static T objc_msgSend<T>(IntPtr receiver, Selector selector) where T : struct
  186. {
  187. IntPtr value = IntPtr_objc_msgSend(receiver, selector);
  188. return Unsafe.AsRef<T>(&value);
  189. }
  190. public static T objc_msgSend<T>(IntPtr receiver, Selector selector, IntPtr a) where T : struct
  191. {
  192. IntPtr value = IntPtr_objc_msgSend(receiver, selector, a);
  193. return Unsafe.AsRef<T>(&value);
  194. }
  195. public static string string_objc_msgSend(IntPtr receiver, Selector selector)
  196. {
  197. return objc_msgSend<NSString>(receiver, selector).GetValue();
  198. }
  199. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  200. public static extern void objc_msgSend(IntPtr receiver, Selector selector, byte b);
  201. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  202. public static extern void objc_msgSend(IntPtr receiver, Selector selector, Bool8 b);
  203. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  204. public static extern void objc_msgSend(IntPtr receiver, Selector selector, uint b);
  205. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  206. public static extern void objc_msgSend(IntPtr receiver, Selector selector, float a, float b, float c, float d);
  207. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  208. public static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr b);
  209. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend_stret")]
  210. public static extern void objc_msgSend_stret(void* retPtr, IntPtr receiver, Selector selector);
  211. public static T objc_msgSend_stret<T>(IntPtr receiver, Selector selector) where T : struct
  212. {
  213. T ret = default(T);
  214. objc_msgSend_stret(Unsafe.AsPointer(ref ret), receiver, selector);
  215. return ret;
  216. }
  217. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  218. public static extern MTLClearColor MTLClearColor_objc_msgSend(IntPtr receiver, Selector selector);
  219. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  220. public static extern MTLSize MTLSize_objc_msgSend(IntPtr receiver, Selector selector);
  221. [DllImport(ObjCLibrary, EntryPoint = "objc_msgSend")]
  222. public static extern CGRect CGRect_objc_msgSend(IntPtr receiver, Selector selector);
  223. // TODO: This should check the current processor type, struct size, etc.
  224. // At the moment there is no need because all existing occurences of
  225. // this can safely use the non-stret versions everywhere.
  226. public static bool UseStret<T>() => false;
  227. [DllImport(ObjCLibrary)]
  228. public static extern IntPtr sel_registerName(byte* namePtr);
  229. [DllImport(ObjCLibrary)]
  230. public static extern byte* sel_getName(IntPtr selector);
  231. [DllImport(ObjCLibrary)]
  232. public static extern IntPtr objc_getClass(byte* namePtr);
  233. [DllImport(ObjCLibrary)]
  234. public static extern ObjCClass object_getClass(IntPtr obj);
  235. [DllImport(ObjCLibrary)]
  236. public static extern IntPtr class_getProperty(ObjCClass cls, byte* namePtr);
  237. [DllImport(ObjCLibrary)]
  238. public static extern byte* class_getName(ObjCClass cls);
  239. [DllImport(ObjCLibrary)]
  240. public static extern byte* property_copyAttributeValue(IntPtr property, byte* attributeNamePtr);
  241. [DllImport(ObjCLibrary)]
  242. public static extern Selector method_getName(ObjectiveCMethod method);
  243. [DllImport(ObjCLibrary)]
  244. public static extern ObjectiveCMethod* class_copyMethodList(ObjCClass cls, out uint outCount);
  245. [DllImport(ObjCLibrary)]
  246. public static extern void free(IntPtr receiver);
  247. public static void retain(IntPtr receiver) => objc_msgSend(receiver, "retain");
  248. public static void release(IntPtr receiver) => objc_msgSend(receiver, "release");
  249. public static ulong GetRetainCount(IntPtr receiver) => (ulong)UIntPtr_objc_msgSend(receiver, "retainCount");
  250. }
  251. }