use super::*;
use cocoa::foundation::{NSUInteger, NSRange};
use objc::runtime::{YES, NO};
use libc;
#[repr(u64)]
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub enum MTLTextureType {
D1 = 0,
D1Array = 1,
D2 = 2,
D2Array = 3,
D2Multisample = 4,
Cube = 5,
CubeArray = 6,
D3 = 7,
}
bitflags! {
pub struct MTLTextureUsage: NSUInteger {
const Unknown = 0x0000;
const ShaderRead = 0x0001;
const ShaderWrite = 0x0002;
const RenderTarget = 0x0004;
const PixelFormatView = 0x0010;
}
}
pub enum MTLTextureDescriptor {}
foreign_obj_type! {
type CType = MTLTextureDescriptor;
pub struct TextureDescriptor;
pub struct TextureDescriptorRef;
}
impl TextureDescriptor {
pub fn new() -> Self {
unsafe {
let class = class!(MTLTextureDescriptor);
msg_send![class, new]
}
}
}
impl TextureDescriptorRef {
pub fn texture_type(&self) -> MTLTextureType {
unsafe {
msg_send![self, textureType]
}
}
pub fn set_texture_type(&self, texture_type: MTLTextureType) {
unsafe {
msg_send![self, setTextureType:texture_type]
}
}
pub fn pixel_format(&self) -> MTLPixelFormat {
unsafe {
msg_send![self, pixelFormat]
}
}
pub fn set_pixel_format(&self, pixel_format: MTLPixelFormat) {
unsafe {
msg_send![self, setPixelFormat:pixel_format]
}
}
pub fn width(&self) -> NSUInteger {
unsafe {
msg_send![self, width]
}
}
pub fn set_width(&self, width: NSUInteger) {
unsafe {
msg_send![self, setWidth:width]
}
}
pub fn height(&self) -> NSUInteger {
unsafe {
msg_send![self, height]
}
}
pub fn set_height(&self, height: NSUInteger) {
unsafe {
msg_send![self, setHeight:height]
}
}
pub fn depth(&self) -> NSUInteger {
unsafe {
msg_send![self, depth]
}
}
pub fn set_depth(&self, depth: NSUInteger) {
unsafe {
msg_send![self, setDepth:depth]
}
}
pub fn mipmap_level_count(&self) -> NSUInteger {
unsafe {
msg_send![self, mipmapLevelCount]
}
}
pub fn set_mipmap_level_count(&self, count: NSUInteger) {
unsafe {
msg_send![self, setMipmapLevelCount:count]
}
}
pub fn sample_count(&self) -> NSUInteger {
unsafe {
msg_send![self, sampleCount]
}
}
pub fn set_sample_count(&self, count: NSUInteger) {
unsafe {
msg_send![self, setSampleCount:count]
}
}
pub fn array_length(&self) -> NSUInteger {
unsafe {
msg_send![self, arrayLength]
}
}
pub fn set_array_length(&self, length: NSUInteger) {
unsafe {
msg_send![self, setArrayLength:length]
}
}
pub fn resource_options(&self) -> MTLResourceOptions {
unsafe {
msg_send![self, resourceOptions]
}
}
pub fn set_resource_options(&self, options: MTLResourceOptions) {
unsafe {
msg_send![self, setResourceOptions:options]
}
}
pub fn cpu_cache_mode(&self) -> MTLCPUCacheMode {
unsafe {
msg_send![self, cpuCacheMode]
}
}
pub fn set_cpu_cache_mode(&self, mode: MTLCPUCacheMode) {
unsafe {
msg_send![self, setCpuCacheMode:mode]
}
}
pub fn storage_mode(&self) -> MTLStorageMode {
unsafe {
msg_send![self, storageMode]
}
}
pub fn set_storage_mode(&self, mode: MTLStorageMode) {
unsafe {
msg_send![self, setStorageMode:mode]
}
}
pub fn usage(&self) -> MTLTextureUsage {
unsafe {
msg_send![self, usage]
}
}
pub fn set_usage(&self, usage: MTLTextureUsage) {
unsafe {
msg_send![self, setUsage:usage]
}
}
}
pub enum MTLTexture {}
foreign_obj_type! {
type CType = MTLTexture;
pub struct Texture;
pub struct TextureRef;
type ParentType = ResourceRef;
}
impl TextureRef {
#[deprecated(since="0.13.0")]
pub fn root_resource(&self) -> Option<&ResourceRef> {
unsafe {
msg_send![self, rootResource]
}
}
pub fn parent_texture(&self) -> Option<&TextureRef> {
unsafe {
msg_send![self, parentTexture]
}
}
pub fn parent_relative_level(&self) -> NSUInteger {
unsafe {
msg_send![self, parentRelativeLevel]
}
}
pub fn parent_relative_slice(&self) -> NSUInteger {
unsafe {
msg_send![self, parentRelativeSlice]
}
}
pub fn buffer(&self) -> Option<&BufferRef> {
unsafe {
msg_send![self, buffer]
}
}
pub fn buffer_offset(&self) -> NSUInteger {
unsafe {
msg_send![self, bufferOffset]
}
}
pub fn buffer_stride(&self) -> NSUInteger {
unsafe {
msg_send![self, bufferBytesPerRow]
}
}
pub fn texture_type(&self) -> MTLTextureType {
unsafe {
msg_send![self, textureType]
}
}
pub fn pixel_format(&self) -> MTLPixelFormat {
unsafe {
msg_send![self, pixelFormat]
}
}
pub fn width(&self) -> NSUInteger {
unsafe {
msg_send![self, width]
}
}
pub fn height(&self) -> NSUInteger {
unsafe {
msg_send![self, height]
}
}
pub fn depth(&self) -> NSUInteger {
unsafe {
msg_send![self, depth]
}
}
pub fn mipmap_level_count(&self) -> NSUInteger {
unsafe {
msg_send![self, mipmapLevelCount]
}
}
pub fn sample_count(&self) -> NSUInteger {
unsafe {
msg_send![self, sampleCount]
}
}
pub fn array_length(&self) -> NSUInteger {
unsafe {
msg_send![self, arrayLength]
}
}
pub fn usage(&self) -> MTLTextureUsage {
unsafe {
msg_send![self, usage]
}
}
pub fn framebuffer_only(&self) -> bool {
unsafe {
match msg_send![self, framebufferOnly] {
YES => true,
NO => false,
_ => unreachable!()
}
}
}
pub fn get_bytes(&self, bytes: *mut libc::c_void, region: MTLRegion, mipmap_level: NSUInteger, stride: NSUInteger) {
unsafe {
msg_send![self, getBytes:bytes
bytesPerRow:stride
fromRegion:region
mipmapLevel:mipmap_level]
}
}
pub fn get_bytes_in_slice(&self, bytes: *mut libc::c_void, region: MTLRegion, mipmap_level: NSUInteger, stride: NSUInteger, image_stride: NSUInteger, slice: NSUInteger) {
unsafe {
msg_send![self, getBytes:bytes
bytesPerRow:stride
bytesPerImage:image_stride
fromRegion:region
mipmapLevel:mipmap_level
slice:slice]
}
}
pub fn replace_region(&self, region: MTLRegion, mipmap_level: NSUInteger, stride: NSUInteger, bytes: *const libc::c_void) {
unsafe {
msg_send![self, replaceRegion:region
mipmapLevel:mipmap_level
withBytes:bytes
bytesPerRow:stride]
}
}
pub fn replace_region_in_slice(&self, region: MTLRegion, mipmap_level: NSUInteger, image_stride: NSUInteger, stride: NSUInteger, slice: NSUInteger, bytes: *const libc::c_void) {
unsafe {
msg_send![self, replaceRegion:region
mipmapLevel:mipmap_level
slice:slice
withBytes:bytes
bytesPerRow:stride
bytesPerImage:image_stride]
}
}
pub fn new_texture_view(&self, pixel_format: MTLPixelFormat) -> Texture {
unsafe {
msg_send![self, newTextureViewWithPixelFormat:pixel_format]
}
}
pub fn new_texture_view_from_slice(&self, pixel_format: MTLPixelFormat, texture_type: MTLTextureType, mipmap_levels: NSRange, slices: NSRange) -> Texture {
unsafe {
msg_send![self, newTextureViewWithPixelFormat:pixel_format
textureType:texture_type
levels:mipmap_levels
slices:slices]
}
}
}