use super::*;
bitflags! {
/// See
#[allow(non_upper_case_globals)]
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct MTLIndirectCommandType: NSUInteger {
const Draw = 1 << 0;
const DrawIndexed = 1 << 1;
const DrawPatches = 1 << 2;
const DrawIndexedPatches = 1 << 3;
const ConcurrentDispatch = 1 << 4;
const ConcurrentDispatchThreads = 1 << 5;
}
}
/// See
pub enum MTLIndirectCommandBufferDescriptor {}
foreign_obj_type! {
type CType = MTLIndirectCommandBufferDescriptor;
pub struct IndirectCommandBufferDescriptor;
}
impl IndirectCommandBufferDescriptor {
pub fn new() -> Self {
let class = class!(MTLIndirectCommandBufferDescriptor);
unsafe { msg_send![class, new] }
}
}
impl IndirectCommandBufferDescriptorRef {
pub fn command_types(&self) -> MTLIndirectCommandType {
unsafe { msg_send![self, commandTypes] }
}
pub fn set_command_types(&self, types: MTLIndirectCommandType) {
unsafe { msg_send![self, setCommandTypes: types] }
}
pub fn inherit_buffers(&self) -> bool {
unsafe { msg_send_bool![self, inheritBuffers] }
}
pub fn set_inherit_buffers(&self, inherit: bool) {
unsafe { msg_send![self, setInheritBuffers: inherit] }
}
pub fn inherit_pipeline_state(&self) -> bool {
unsafe { msg_send_bool![self, inheritPipelineState] }
}
pub fn set_inherit_pipeline_state(&self, inherit: bool) {
unsafe { msg_send![self, setInheritPipelineState: inherit] }
}
pub fn max_vertex_buffer_bind_count(&self) -> NSUInteger {
unsafe { msg_send![self, maxVertexBufferBindCount] }
}
pub fn set_max_vertex_buffer_bind_count(&self, count: NSUInteger) {
unsafe { msg_send![self, setMaxVertexBufferBindCount: count] }
}
pub fn max_fragment_buffer_bind_count(&self) -> NSUInteger {
unsafe { msg_send![self, maxFragmentBufferBindCount] }
}
pub fn set_max_fragment_buffer_bind_count(&self, count: NSUInteger) {
unsafe { msg_send![self, setMaxFragmentBufferBindCount: count] }
}
pub fn max_kernel_buffer_bind_count(&self) -> NSUInteger {
unsafe { msg_send![self, maxKernelBufferBindCount] }
}
pub fn set_max_kernel_buffer_bind_count(&self, count: NSUInteger) {
unsafe { msg_send![self, setMaxKernelBufferBindCount: count] }
}
}
/// See
pub enum MTLIndirectCommandBuffer {}
foreign_obj_type! {
type CType = MTLIndirectCommandBuffer;
pub struct IndirectCommandBuffer;
type ParentType = Resource;
}
impl IndirectCommandBufferRef {
pub fn size(&self) -> NSUInteger {
unsafe { msg_send![self, size] }
}
pub fn indirect_render_command_at_index(&self, index: NSUInteger) -> &IndirectRenderCommandRef {
unsafe { msg_send![self, indirectRenderCommandAtIndex: index] }
}
pub fn indirect_compute_command_at_index(
&self,
index: NSUInteger,
) -> &IndirectComputeCommandRef {
unsafe { msg_send![self, indirectComputeCommandAtIndex: index] }
}
pub fn reset_with_range(&self, range: crate::NSRange) {
unsafe { msg_send![self, resetWithRange: range] }
}
}
/// See
pub enum MTLIndirectRenderCommand {}
foreign_obj_type! {
type CType = MTLIndirectRenderCommand;
pub struct IndirectRenderCommand;
}
impl IndirectRenderCommandRef {
pub fn set_render_pipeline_state(&self, pipeline_state: &RenderPipelineStateRef) {
unsafe { msg_send![self, setRenderPipelineState: pipeline_state] }
}
pub fn set_vertex_buffer(
&self,
index: NSUInteger,
buffer: Option<&BufferRef>,
offset: NSUInteger,
) {
unsafe {
msg_send![self,
setVertexBuffer: buffer
offset: offset
atIndex: index
]
}
}
pub fn set_fragment_buffer(
&self,
index: NSUInteger,
buffer: Option<&BufferRef>,
offset: NSUInteger,
) {
unsafe {
msg_send![self,
setFragmentBuffer:buffer
offset:offset
atIndex:index
]
}
}
pub fn draw_primitives(
&self,
primitive_type: MTLPrimitiveType,
vertex_start: NSUInteger,
vertex_count: NSUInteger,
instance_count: NSUInteger,
base_instance: NSUInteger,
) {
unsafe {
msg_send![self,
drawPrimitives: primitive_type
vertexStart: vertex_start
vertexCount: vertex_count
instanceCount: instance_count
baseInstance: base_instance
]
}
}
pub fn draw_indexed_primitives(
&self,
primitive_type: MTLPrimitiveType,
index_count: NSUInteger,
index_type: MTLIndexType,
index_buffer: &BufferRef,
index_buffer_offset: NSUInteger,
instance_count: NSUInteger,
base_vertex: NSUInteger,
base_instance: NSUInteger,
) {
unsafe {
msg_send![self,
drawIndexedPrimitives: primitive_type
indexCount: index_count
indexType: index_type
indexBuffer: index_buffer
indexBufferOffset: index_buffer_offset
instanceCount: instance_count
baseVertex: base_vertex
baseInstance: base_instance
]
}
}
pub fn draw_patches(
&self,
number_of_patch_control_points: NSUInteger,
patch_start: NSUInteger,
patch_count: NSUInteger,
patch_index_buffer: &BufferRef,
patch_index_buffer_offset: NSUInteger,
instance_count: NSUInteger,
base_instance: NSUInteger,
tesselation_factor_buffer: &BufferRef,
tesselation_factor_buffer_offset: NSUInteger,
tesselation_factor_buffer_instance_stride: NSUInteger,
) {
unsafe {
msg_send![self,
drawPatches: number_of_patch_control_points
patchStart: patch_start
patchCount: patch_count
patchIndexBuffer: patch_index_buffer
patchIndexBufferOffset: patch_index_buffer_offset
instanceCount: instance_count
baseInstance: base_instance
tessellationFactorBuffer: tesselation_factor_buffer
tessellationFactorBufferOffset: tesselation_factor_buffer_offset
tessellationFactorBufferInstanceStride: tesselation_factor_buffer_instance_stride
]
}
}
pub fn draw_indexed_patches(
&self,
number_of_patch_control_points: NSUInteger,
patch_start: NSUInteger,
patch_count: NSUInteger,
patch_index_buffer: &BufferRef,
patch_index_buffer_offset: NSUInteger,
control_point_index_buffer: &BufferRef,
control_point_index_buffer_offset: NSUInteger,
instance_count: NSUInteger,
base_instance: NSUInteger,
tesselation_factor_buffer: &BufferRef,
tesselation_factor_buffer_offset: NSUInteger,
tesselation_factor_buffer_instance_stride: NSUInteger,
) {
unsafe {
msg_send![self,
drawIndexedPatches: number_of_patch_control_points
patchStart: patch_start
patchCount: patch_count
patchIndexBuffer: patch_index_buffer
patchIndexBufferOffset: patch_index_buffer_offset
controlPointIndexBuffer: control_point_index_buffer
controlPointIndexBufferOffset: control_point_index_buffer_offset
instanceCount: instance_count
baseInstance: base_instance
tessellationFactorBuffer: tesselation_factor_buffer
tessellationFactorBufferOffset: tesselation_factor_buffer_offset
tessellationFactorBufferInstanceStride: tesselation_factor_buffer_instance_stride
]
}
}
pub fn reset(&self) {
unsafe { msg_send![self, reset] }
}
}
/// See
pub enum MTLIndirectComputeCommand {}
foreign_obj_type! {
type CType = MTLIndirectComputeCommand;
pub struct IndirectComputeCommand;
}
impl IndirectComputeCommandRef {
pub fn set_compute_pipeline_state(&self, state: &ComputePipelineStateRef) {
unsafe { msg_send![self, setComputePipelineState: state] }
}
pub fn set_kernel_buffer(
&self,
index: NSUInteger,
buffer: Option<&BufferRef>,
offset: NSUInteger,
) {
unsafe {
msg_send![self,
setKernelBuffer: buffer
offset: offset
atIndex: index
]
}
}
pub fn set_threadgroup_memory_length(&self, index: NSUInteger, length: NSUInteger) {
unsafe {
msg_send![self,
setThreadgroupMemoryLength: length
atIndex: index
]
}
}
pub fn set_stage_in_region(&self, region: MTLRegion) {
unsafe { msg_send![self, setStageInRegion: region] }
}
pub fn set_barrier(&self) {
unsafe { msg_send![self, setBarrier] }
}
pub fn clear_barrier(&self) {
unsafe { msg_send![self, clearBarrier] }
}
pub fn concurrent_dispatch_threadgroups(
&self,
thread_groups_per_grid: MTLSize,
threads_per_threadgroup: MTLSize,
) {
unsafe {
msg_send![self,
concurrentDispatchThreadgroups: thread_groups_per_grid
threadsPerThreadgroup: threads_per_threadgroup
]
}
}
pub fn concurrent_dispatch_threads(
&self,
thread_groups_per_grid: MTLSize,
threads_per_threadgroup: MTLSize,
) {
unsafe {
msg_send![self,
concurrentDispatchThreads: thread_groups_per_grid
threadsPerThreadgroup: threads_per_threadgroup
]
}
}
pub fn reset(&self) {
unsafe { msg_send![self, reset] }
}
}