iron-oxide 0.1.1

Unsafe Rusty Metal.
Documentation
use crate::import_objc_macros::*;
use crate::{
    handle, MTLBuffer, MTLCommandEncoder, MTLComputePipelineState, MTLSamplerState, MTLSize,
    MTLTexture, NSRange, NSUInteger, NSUIntegerRange, Object, ObjectPointer,
};
use std::os::raw::c_void;

pub struct MTLComputeCommandEncoder(ObjectPointer);
handle!(MTLComputeCommandEncoder);

impl MTLComputeCommandEncoder {
    pub unsafe fn set_compute_pipeline_state(&self, state: &MTLComputePipelineState) {
        msg_send![self.get_ptr(), setComputePipelineState:state.get_ptr()]
    }
    pub unsafe fn set_buffer(&self, buffer: &MTLBuffer, offset: NSUInteger, index: NSUInteger) {
        msg_send![self.get_ptr(), setBuffer:buffer.get_ptr() offset:offset atIndex:index]
    }
    pub unsafe fn set_buffers(
        &self,
        buffers: &[&MTLBuffer],
        offsets: &[NSUInteger],
        range: NSUIntegerRange,
    ) {
        let range = NSRange {
            location: range.start,
            length: range.end - range.start,
        };
        let pointers = buffers
            .iter()
            .map(|buffer| buffer.get_ptr())
            .collect::<Vec<ObjectPointer>>();
        let pointers = pointers.as_slice().as_ptr();

        msg_send![self.get_ptr(), setBuffers:pointers offsets:offsets.as_ptr() withRange:range]
    }
    pub unsafe fn set_buffer_offset(&self, offset: NSUInteger, index: NSUInteger) {
        msg_send![self.get_ptr(), setBufferOffset:offset atIndex:index]
    }
    pub unsafe fn set_bytes(&self, bytes: *const c_void, length: NSUInteger, index: NSUInteger) {
        msg_send![self.get_ptr(), setBytes:bytes length:length atIndex:index]
    }
    pub unsafe fn set_sampler_state(&self, sampler: &MTLSamplerState, index: NSUInteger) {
        msg_send![self.get_ptr(), setSamplerState:sampler.get_ptr() atIndex:index]
    }
    pub unsafe fn set_sampler_state_clamp(
        &self,
        sampler: &MTLSamplerState,
        lod_min_clamp: f32,
        lod_max_clamp: f32,
        index: NSUInteger,
    ) {
        msg_send![
            self.get_ptr(),
            setVertexSamplerState:sampler.get_ptr()
            lodMinClamp:lod_min_clamp
            lodMaxClamp:lod_max_clamp
            atIndex:index
        ]
    }
    pub unsafe fn set_sampler_states(&self, samplers: &[MTLSamplerState], range: NSUIntegerRange) {
        let pointers = samplers
            .iter()
            .map(|sampler| sampler.get_ptr())
            .collect::<Vec<_>>();
        let pointers = pointers.as_slice().as_ptr();
        let range = NSRange {
            location: range.start,
            length: range.end - range.start,
        };
        msg_send![self.get_ptr(), setSamplerStates:pointers withRange:range]
    }
    pub unsafe fn set_texture(&self, texture: &MTLTexture, index: NSUInteger) {
        msg_send![self.get_ptr(), setTexture:texture.get_ptr() atIndex:index]
    }
    pub unsafe fn set_textures(&self, textures: &[&MTLTexture], range: NSUIntegerRange) {
        let pointers = textures
            .iter()
            .map(|texture| texture.get_ptr())
            .collect::<Vec<_>>();
        let pointers = pointers.as_slice().as_ptr();
        let range = NSRange {
            location: range.start,
            length: range.end - range.start,
        };
        msg_send![self.get_ptr(), setTextures:pointers withRange:range]
    }
    pub unsafe fn set_threadgroup_memory_length(&self, length: NSUInteger, index: NSUInteger) {
        msg_send![self.get_ptr(), setThreadgroupMemoryLength:length atIndex:index]
    }
    pub unsafe fn dispatch_threadgroups(
        &self,
        threadgroups_per_grid: MTLSize,
        threads_per_threadgroup: MTLSize,
    ) {
        msg_send![
            self.get_ptr(),
            dispatchThreadgroups:threadgroups_per_grid
            threadsPerThreadgroup:threads_per_threadgroup
        ]
    }
    pub unsafe fn dispatch_threads(
        &self,
        threads_per_grid: MTLSize,
        threads_per_threadgroup: MTLSize,
    ) {
        msg_send![
            self.get_ptr(),
            dispatchThreads:threads_per_grid
            threadsPerThreadgroup:threads_per_threadgroup
        ]
    }
}

impl MTLCommandEncoder for MTLComputeCommandEncoder {}

impl Object for MTLComputeCommandEncoder {
    unsafe fn from_ptr(ptr: ObjectPointer) -> Self
    where
        Self: Sized,
    {
        MTLComputeCommandEncoder(ptr)
    }

    fn get_ptr(&self) -> ObjectPointer {
        self.0
    }
}