//! 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 crate::*;

extern_class!(
    /// Describes a render pass.
    ///
    /// You use render pass descriptors to create instances of ``MTL4RenderCommandEncoder`` and encode draw
    /// commands into instances of ``MTL4CommandBuffer``.
    ///
    /// To create render command encoders, you typically call ``MTL4CommandBuffer/renderCommandEncoderWithDescriptor:``.
    /// The ``MTL4CommandBuffer/renderCommandEncoderWithDescriptor:options:`` variant of this method allows you to specify
    /// additional options to encode a render pass in parallel from multiple CPU cores by creating *suspending* and *resuming*
    /// render passes.
    ///
    /// See also [Apple's documentation](https://developer.apple.com/documentation/metal/mtl4renderpassdescriptor?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct MTL4RenderPassDescriptor;
);

extern_conformance!(
    unsafe impl NSCopying for MTL4RenderPassDescriptor {}
);

unsafe impl CopyingHelper for MTL4RenderPassDescriptor {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for MTL4RenderPassDescriptor {}
);

impl MTL4RenderPassDescriptor {
    extern_methods!(
        #[cfg(feature = "MTLRenderPass")]
        /// Accesses the array of state information for render attachments that store color data.
        #[unsafe(method(colorAttachments))]
        #[unsafe(method_family = none)]
        pub fn colorAttachments(&self) -> Retained<MTLRenderPassColorAttachmentDescriptorArray>;

        #[cfg(feature = "MTLRenderPass")]
        /// Accesses state information for a render attachment that stores depth data.
        #[unsafe(method(depthAttachment))]
        #[unsafe(method_family = none)]
        pub fn depthAttachment(&self) -> Retained<MTLRenderPassDepthAttachmentDescriptor>;

        #[cfg(feature = "MTLRenderPass")]
        /// Setter for [`depthAttachment`][Self::depthAttachment].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setDepthAttachment:))]
        #[unsafe(method_family = none)]
        pub fn setDepthAttachment(
            &self,
            depth_attachment: Option<&MTLRenderPassDepthAttachmentDescriptor>,
        );

        #[cfg(feature = "MTLRenderPass")]
        /// Accesses state information for a render attachment that stores stencil data.
        #[unsafe(method(stencilAttachment))]
        #[unsafe(method_family = none)]
        pub fn stencilAttachment(&self) -> Retained<MTLRenderPassStencilAttachmentDescriptor>;

        #[cfg(feature = "MTLRenderPass")]
        /// Setter for [`stencilAttachment`][Self::stencilAttachment].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setStencilAttachment:))]
        #[unsafe(method_family = none)]
        pub fn setStencilAttachment(
            &self,
            stencil_attachment: Option<&MTLRenderPassStencilAttachmentDescriptor>,
        );

        /// Assigns the number of layers that all attachments this descriptor references have.
        #[unsafe(method(renderTargetArrayLength))]
        #[unsafe(method_family = none)]
        pub fn renderTargetArrayLength(&self) -> NSUInteger;

        /// Setter for [`renderTargetArrayLength`][Self::renderTargetArrayLength].
        #[unsafe(method(setRenderTargetArrayLength:))]
        #[unsafe(method_family = none)]
        pub fn setRenderTargetArrayLength(&self, render_target_array_length: NSUInteger);

        /// Assigns the per-sample size, in bytes, of the largest explicit imageblock layout in the render pass.
        #[unsafe(method(imageblockSampleLength))]
        #[unsafe(method_family = none)]
        pub fn imageblockSampleLength(&self) -> NSUInteger;

        /// Setter for [`imageblockSampleLength`][Self::imageblockSampleLength].
        #[unsafe(method(setImageblockSampleLength:))]
        #[unsafe(method_family = none)]
        pub fn setImageblockSampleLength(&self, imageblock_sample_length: NSUInteger);

        /// Assigns the per-tile size, in bytes, of the persistent threadgroup memory allocation of this render pass.
        #[unsafe(method(threadgroupMemoryLength))]
        #[unsafe(method_family = none)]
        pub fn threadgroupMemoryLength(&self) -> NSUInteger;

        /// Setter for [`threadgroupMemoryLength`][Self::threadgroupMemoryLength].
        #[unsafe(method(setThreadgroupMemoryLength:))]
        #[unsafe(method_family = none)]
        pub fn setThreadgroupMemoryLength(&self, threadgroup_memory_length: NSUInteger);

        /// The width of the tiles, in pixels, a render pass you create with this descriptor applies to its attachments.
        ///
        /// For tile-based rendering, Metal divides each render attachment into smaller regions, or _tiles_.
        /// The property's default is `0`, which tells Metal to select a size that fits in tile memory.
        ///
        /// See
        /// <doc
        /// :tailor-your-apps-for-apple-gpus-and-tile-based-deferred-rendering>
        /// for more information about tiles, tile memory, and deferred rendering.
        #[unsafe(method(tileWidth))]
        #[unsafe(method_family = none)]
        pub fn tileWidth(&self) -> NSUInteger;

        /// Setter for [`tileWidth`][Self::tileWidth].
        #[unsafe(method(setTileWidth:))]
        #[unsafe(method_family = none)]
        pub fn setTileWidth(&self, tile_width: NSUInteger);

        /// The height of the tiles, in pixels, a render pass you create with this descriptor applies to its attachments.
        ///
        /// For tile-based rendering, Metal divides each render attachment into smaller regions, or _tiles_.
        /// The property's default is `0`, which tells Metal to select a size that fits in tile memory.
        ///
        /// See
        /// <doc
        /// :tailor-your-apps-for-apple-gpus-and-tile-based-deferred-rendering>
        /// for more information about tiles, tile memory, and deferred rendering.
        #[unsafe(method(tileHeight))]
        #[unsafe(method_family = none)]
        pub fn tileHeight(&self) -> NSUInteger;

        /// Setter for [`tileHeight`][Self::tileHeight].
        #[unsafe(method(setTileHeight:))]
        #[unsafe(method_family = none)]
        pub fn setTileHeight(&self, tile_height: NSUInteger);

        /// Sets the default raster sample count for the render pass when it references no attachments.
        #[unsafe(method(defaultRasterSampleCount))]
        #[unsafe(method_family = none)]
        pub fn defaultRasterSampleCount(&self) -> NSUInteger;

        /// Setter for [`defaultRasterSampleCount`][Self::defaultRasterSampleCount].
        ///
        /// # Safety
        ///
        /// This might not be bounds-checked.
        #[unsafe(method(setDefaultRasterSampleCount:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setDefaultRasterSampleCount(&self, default_raster_sample_count: NSUInteger);

        /// Sets the width, in pixels, to which Metal constrains the render target.
        ///
        /// When this value is non-zero, you need to assign it to be smaller than or equal to the minimum width of all attachments.
        ///
        /// The default value of this property is `0`.
        #[unsafe(method(renderTargetWidth))]
        #[unsafe(method_family = none)]
        pub fn renderTargetWidth(&self) -> NSUInteger;

        /// Setter for [`renderTargetWidth`][Self::renderTargetWidth].
        #[unsafe(method(setRenderTargetWidth:))]
        #[unsafe(method_family = none)]
        pub fn setRenderTargetWidth(&self, render_target_width: NSUInteger);

        /// Sets the height, in pixels, to which Metal constrains the render target.
        ///
        /// When this value is non-zero, you need to assign it to be smaller than or equal to the minimum height of all attachments.
        ///
        /// The default value of this property is `0`.
        #[unsafe(method(renderTargetHeight))]
        #[unsafe(method_family = none)]
        pub fn renderTargetHeight(&self) -> NSUInteger;

        /// Setter for [`renderTargetHeight`][Self::renderTargetHeight].
        #[unsafe(method(setRenderTargetHeight:))]
        #[unsafe(method_family = none)]
        pub fn setRenderTargetHeight(&self, render_target_height: NSUInteger);

        #[cfg(feature = "MTLRasterizationRate")]
        /// Assigns an optional variable rasterization rate map that Metal uses in the render pass.
        ///
        /// Enabling variable rasterization rate allows Metal to decrease the rasterization rate, typically in unimportant
        /// regions of color attachments, to accelerate processing.
        ///
        /// When set to `nil`, the default, Metal doesn't use variable rasterization rate.
        #[unsafe(method(rasterizationRateMap))]
        #[unsafe(method_family = none)]
        pub fn rasterizationRateMap(
            &self,
        ) -> Option<Retained<ProtocolObject<dyn MTLRasterizationRateMap>>>;

        #[cfg(feature = "MTLRasterizationRate")]
        /// Setter for [`rasterizationRateMap`][Self::rasterizationRateMap].
        #[unsafe(method(setRasterizationRateMap:))]
        #[unsafe(method_family = none)]
        pub fn setRasterizationRateMap(
            &self,
            rasterization_rate_map: Option<&ProtocolObject<dyn MTLRasterizationRateMap>>,
        );

        #[cfg(all(
            feature = "MTLAllocation",
            feature = "MTLBuffer",
            feature = "MTLResource"
        ))]
        /// Configures a buffer into which Metal writes counts of fragments (pixels) passing the depth and stencil tests.
        #[unsafe(method(visibilityResultBuffer))]
        #[unsafe(method_family = none)]
        pub fn visibilityResultBuffer(&self) -> Option<Retained<ProtocolObject<dyn MTLBuffer>>>;

        #[cfg(all(
            feature = "MTLAllocation",
            feature = "MTLBuffer",
            feature = "MTLResource"
        ))]
        /// Setter for [`visibilityResultBuffer`][Self::visibilityResultBuffer].
        ///
        /// # Safety
        ///
        /// - `visibility_result_buffer` may need to be synchronized.
        /// - `visibility_result_buffer` may be unretained, you must ensure it is kept alive while in use.
        /// - `visibility_result_buffer` contents should be of the correct type.
        #[unsafe(method(setVisibilityResultBuffer:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setVisibilityResultBuffer(
            &self,
            visibility_result_buffer: Option<&ProtocolObject<dyn MTLBuffer>>,
        );

        #[cfg(feature = "MTLRenderPass")]
        /// Determines if Metal accumulates visibility results between render encoders or resets them.
        #[unsafe(method(visibilityResultType))]
        #[unsafe(method_family = none)]
        pub fn visibilityResultType(&self) -> MTLVisibilityResultType;

        #[cfg(feature = "MTLRenderPass")]
        /// Setter for [`visibilityResultType`][Self::visibilityResultType].
        #[unsafe(method(setVisibilityResultType:))]
        #[unsafe(method_family = none)]
        pub fn setVisibilityResultType(&self, visibility_result_type: MTLVisibilityResultType);

        #[cfg(feature = "MTLTypes")]
        /// Configures the custom sample positions to use in MSAA rendering.
        ///
        /// - Parameters:
        /// - positions: Array of ``MTLSamplePosition`` instances.
        /// - count:     Number of ``MTLSamplePosition`` instances in the array. This value
        /// needs to be a valid sample count, or `0` to disable custom sample positions.
        ///
        /// # Safety
        ///
        /// - `positions` must be a valid pointer or null.
        /// - `count` might not be bounds-checked.
        #[unsafe(method(setSamplePositions:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setSamplePositions_count(
            &self,
            positions: *const MTLSamplePosition,
            count: NSUInteger,
        );

        #[cfg(feature = "MTLTypes")]
        /// Retrieves the previously-configured custom sample positions.
        ///
        /// This method stores the app's last set custom sample positions into an output array. Metal only modifies the array
        /// when the `count` parameter consists of a length sufficient to store the number of sample positions.
        ///
        /// - Parameters:
        /// - positions: The destination array where Metal stores ``MTLSamplePosition`` instances.
        /// - count:     Number of ``MTLSamplePosition`` instances in the array. This array
        /// needs to be large enough to store all sample positions.
        ///
        /// - Returns: The number of previously-configured custom sample positions.
        ///
        /// # Safety
        ///
        /// - `positions` must be a valid pointer or null.
        /// - `count` might not be bounds-checked.
        #[unsafe(method(getSamplePositions:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn getSamplePositions_count(
            &self,
            positions: *mut MTLSamplePosition,
            count: NSUInteger,
        ) -> NSUInteger;

        /// Controls if the render pass supports color attachment mapping.
        #[unsafe(method(supportColorAttachmentMapping))]
        #[unsafe(method_family = none)]
        pub fn supportColorAttachmentMapping(&self) -> bool;

        /// Setter for [`supportColorAttachmentMapping`][Self::supportColorAttachmentMapping].
        #[unsafe(method(setSupportColorAttachmentMapping:))]
        #[unsafe(method_family = none)]
        pub fn setSupportColorAttachmentMapping(&self, support_color_attachment_mapping: bool);
    );
}

/// Methods declared on superclass `NSObject`.
impl MTL4RenderPassDescriptor {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for MTL4RenderPassDescriptor {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}
