1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use objc2_foundation::*;
use objc2_metal::*;
use crate::*;
/// A description of each copy operation
///
/// See also [Apple's documentation](https://developer.apple.com/documentation/metalperformanceshaders/mpsmatrixcopyoffsets?language=objc)
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct MPSMatrixCopyOffsets {
/// offset to start of source region to read in rows
pub sourceRowOffset: u32,
/// offset to start of source region to read in columns
pub sourceColumnOffset: u32,
/// offset to start of destination region to read in rows
pub destinationRowOffset: u32,
/// offset to start of destination region to read in columns
pub destinationColumnOffset: u32,
}
unsafe impl Encode for MPSMatrixCopyOffsets {
const ENCODING: Encoding = Encoding::Struct(
"?",
&[
<u32>::ENCODING,
<u32>::ENCODING,
<u32>::ENCODING,
<u32>::ENCODING,
],
);
}
unsafe impl RefEncode for MPSMatrixCopyOffsets {
const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
extern_class!(
/// A list of copy operations
///
/// The MPSMatrixCopy filter can do multiple copy operations. For RNN filters, these
/// copies are often small, and are more efficient when grouped together.
/// The MPSMatriceCopyDescriptor provides a container to list the operations.
/// The operations occur in any order, and may not alias.
///
/// See also [Apple's documentation](https://developer.apple.com/documentation/metalperformanceshaders/mpsmatrixcopydescriptor?language=objc)
#[unsafe(super(NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct MPSMatrixCopyDescriptor;
);
extern_conformance!(
unsafe impl NSObjectProtocol for MPSMatrixCopyDescriptor {}
);
impl MPSMatrixCopyDescriptor {
extern_methods!(
#[cfg(feature = "MPSCore")]
/// convenience allocator for single copies
#[unsafe(method(descriptorWithSourceMatrix:destinationMatrix:offsets:))]
#[unsafe(method_family = none)]
pub unsafe fn descriptorWithSourceMatrix_destinationMatrix_offsets(
source_matrix: &MPSMatrix,
destination_matrix: &MPSMatrix,
offsets: MPSMatrixCopyOffsets,
) -> Retained<Self>;
/// initialize a MPSMatrixCopyDescriptor with default values.
///
/// Use -setCopyOperationAtIndex:sourceMatrix:destinationMatrix:copyOffsets
/// to initialize. All indices must be initialized before use.
///
/// Parameter `device`: The device on which the copy will be performed
///
/// Parameter `count`: The number of copy operations the object will encode
///
/// Returns: A MPSMatrixCopyDescriptor. It still needs to be initialized with
/// -setCopyOperationAtIndex:sourceMatrix:destinationMatrix:copyOffsets
#[unsafe(method(initWithDevice:count:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithDevice_count(
this: Allocated<Self>,
device: &ProtocolObject<dyn MTLDevice>,
count: NSUInteger,
) -> Retained<Self>;
#[cfg(feature = "MPSCore")]
/// Initialize a MPSMatrixCopyDescriptor using offsets generated on the CPU
///
/// This is for one at a time intialization of the copy operations
///
/// Parameter `index`: The index of the copy operation
///
/// Parameter `sourceMatrix`: The source matrix for this copy operation
///
/// Parameter `destinationMatrix`: The destination matrix for this copy operation
///
/// Parameter `offsets`: The offsets to use for the copy operation
#[unsafe(method(setCopyOperationAtIndex:sourceMatrix:destinationMatrix:offsets:))]
#[unsafe(method_family = none)]
pub unsafe fn setCopyOperationAtIndex_sourceMatrix_destinationMatrix_offsets(
&self,
index: NSUInteger,
source_matrix: &MPSMatrix,
destination_matrix: &MPSMatrix,
offsets: MPSMatrixCopyOffsets,
);
#[cfg(feature = "MPSCore")]
/// Initialize a MPSMatrixCopyDescriptor using offsets generated on the GPU
///
/// Use this method when the offsets needed are coming from GPU based computation.
///
/// Parameter `sourceMatrices`: A list of matrices from which the matrix data is read
///
/// Parameter `destinationMatrices`: A list of matrices to which to write the data. The count
/// must match the number of source matrices.
///
/// Parameter `offsets`: A MPSVector of type MPSDataTypeUInt32 containing the list of
/// offsets, stored as a packed array of MPSMatrixCopyOffsets.
///
/// Parameter `byteOffset`: A byte offset into the offsets vector where the data starts in 'offsets'.
/// This value must be a multiple of 16.
///
/// Returns: A valid MPSMatrixCopyDescriptor to represent the list of copy operations
#[unsafe(method(initWithSourceMatrices:destinationMatrices:offsetVector:offset:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithSourceMatrices_destinationMatrices_offsetVector_offset(
this: Allocated<Self>,
source_matrices: &NSArray<MPSMatrix>,
destination_matrices: &NSArray<MPSMatrix>,
offsets: Option<&MPSVector>,
byte_offset: NSUInteger,
) -> Retained<Self>;
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
);
}
/// Methods declared on superclass `NSObject`.
impl MPSMatrixCopyDescriptor {
extern_methods!(
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub unsafe fn new() -> Retained<Self>;
);
}
extern_class!(
/// [Apple's documentation](https://developer.apple.com/documentation/metalperformanceshaders/mpsmatrixcopy?language=objc)
#[unsafe(super(MPSKernel, NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
pub struct MPSMatrixCopy;
);
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSCoding for MPSMatrixCopy {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSCopying for MPSMatrixCopy {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
unsafe impl CopyingHelper for MPSMatrixCopy {
type Result = Self;
}
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSObjectProtocol for MPSMatrixCopy {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSSecureCoding for MPSMatrixCopy {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
impl MPSMatrixCopy {
extern_methods!(
#[unsafe(method(initWithDevice:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithDevice(
this: Allocated<Self>,
device: &ProtocolObject<dyn MTLDevice>,
) -> Retained<Self>;
/// Initialize a copy operator
///
/// Parameter `copyRows`: The number of rows to copy for each copy operation
///
/// Parameter `copyColumns`: The number of matrix columns to copy in each copy operation
///
/// Parameter `sourcesAreTransposed`: If YES, the sources are in column major storage order
///
/// Parameter `destinationsAreTransposed`: If YES, the destinations are in column major storage order
#[unsafe(method(initWithDevice:copyRows:copyColumns:sourcesAreTransposed:destinationsAreTransposed:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithDevice_copyRows_copyColumns_sourcesAreTransposed_destinationsAreTransposed(
this: Allocated<Self>,
device: &ProtocolObject<dyn MTLDevice>,
copy_rows: NSUInteger,
copy_columns: NSUInteger,
sources_are_transposed: bool,
destinations_are_transposed: bool,
) -> Retained<Self>;
/// The number of rows to copy for each copy operation
#[unsafe(method(copyRows))]
#[unsafe(method_family = none)]
pub unsafe fn copyRows(&self) -> NSUInteger;
/// The number of columns to copy for each copy operation
#[unsafe(method(copyColumns))]
#[unsafe(method_family = none)]
pub unsafe fn copyColumns(&self) -> NSUInteger;
/// If YES, the sources are in row major storage order
#[unsafe(method(sourcesAreTransposed))]
#[unsafe(method_family = none)]
pub unsafe fn sourcesAreTransposed(&self) -> bool;
/// If YES, the destinations are in row major storage order
#[unsafe(method(destinationsAreTransposed))]
#[unsafe(method_family = none)]
pub unsafe fn destinationsAreTransposed(&self) -> bool;
/// Encode the copy operations to the command buffer
///
///
/// Parameter `commandBuffer`: A valid MTLCommandBuffer to receive the encoded kernel.
///
///
/// Parameter `copyDescriptor`: The descriptor that defines the copy operator
#[unsafe(method(encodeToCommandBuffer:copyDescriptor:))]
#[unsafe(method_family = none)]
pub unsafe fn encodeToCommandBuffer_copyDescriptor(
&self,
command_buffer: &ProtocolObject<dyn MTLCommandBuffer>,
copy_descriptor: &MPSMatrixCopyDescriptor,
);
/// Encode the copy operations to the command buffer.
/// This of the encode version support permuting the outputs with custom vectors of indices.
/// The permutations are defined on the destination indices and are the same for each copy
/// operation.
///
///
/// Parameter `commandBuffer`: A valid MTLCommandBuffer to receive the encoded kernel.
///
///
/// Parameter `copyDescriptor`: The descriptor that defines the copy operator
///
///
/// Parameter `rowPermuteIndices`: If not nil then the output row index is
/// 'rowPermuteIndices[i] + rowOffset' instead of 'i + rowOffset',
/// where 'i' is the local row index of the copy operation.
/// Note: if destinationsAreTransposed is set to YES then the destination
/// transpose is performed before permutations.
///
///
/// Parameter `rowPermuteOffset`: Offset in numbers to apply to the 'rowPermuteIndices' vector.
///
///
/// Parameter `columnPermuteIndices`: If not nil then the output column index is
/// 'columnPermuteIndices[i] + columnOffset' instead of 'i + columnOffset',
/// where 'i' is the local column index of the copy operation.
/// Note: if destinationsAreTransposed is set to YES then the destination
/// transpose is performed before permutations.
///
///
/// Parameter `columnPermuteOffset`: Offset in numbers to apply to the 'columnPermuteIndices' vector.
#[unsafe(method(encodeToCommandBuffer:copyDescriptor:rowPermuteIndices:rowPermuteOffset:columnPermuteIndices:columnPermuteOffset:))]
#[unsafe(method_family = none)]
pub unsafe fn encodeToCommandBuffer_copyDescriptor_rowPermuteIndices_rowPermuteOffset_columnPermuteIndices_columnPermuteOffset(
&self,
command_buffer: &ProtocolObject<dyn MTLCommandBuffer>,
copy_descriptor: &MPSMatrixCopyDescriptor,
row_permute_indices: Option<&MPSVector>,
row_permute_offset: NSUInteger,
column_permute_indices: Option<&MPSVector>,
column_permute_offset: NSUInteger,
);
/// NSSecureCoding compatability
///
/// See
/// MPSKernel#initWithCoder.
/// Parameter `aDecoder`: The NSCoder subclass with your serialized MPSMatrixLookUpAndCopy
///
/// Parameter `device`: The MTLDevice on which to make the MPSMatrixLookUpAndCopy
///
/// Returns: A new MPSMatrixLookUpAndCopy object, or nil if failure.
///
/// # Safety
///
/// `a_decoder` possibly has further requirements.
#[unsafe(method(initWithCoder:device:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithCoder_device(
this: Allocated<Self>,
a_decoder: &NSCoder,
device: &ProtocolObject<dyn MTLDevice>,
) -> Option<Retained<Self>>;
);
}
/// Methods declared on superclass `MPSKernel`.
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
impl MPSMatrixCopy {
extern_methods!(
/// Called by NSCoder to decode MPSKernels
///
/// This isn't the right interface to decode a MPSKernel, but
/// it is the one that NSCoder uses. To enable your NSCoder
/// (e.g. NSKeyedUnarchiver) to set which device to use
/// extend the object to adopt the MPSDeviceProvider
/// protocol. Otherwise, the Metal system default device
/// will be used.
///
/// # Safety
///
/// `a_decoder` possibly has further requirements.
#[unsafe(method(initWithCoder:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithCoder(
this: Allocated<Self>,
a_decoder: &NSCoder,
) -> Option<Retained<Self>>;
);
}
/// Methods declared on superclass `NSObject`.
#[cfg(all(feature = "MPSCore", feature = "MPSKernel"))]
impl MPSMatrixCopy {
extern_methods!(
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub unsafe fn new() -> Retained<Self>;
);
}