| // Copyright 2023 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef IREE_EXPERIMENTAL_METAL_PIPELINE_LAYOUT_H_ | |
| #define IREE_EXPERIMENTAL_METAL_PIPELINE_LAYOUT_H_ | |
| #include "iree/base/api.h" | |
| #include "iree/hal/api.h" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif // __cplusplus | |
| //===----------------------------------------------------------------------===// | |
| // Limitations | |
| //===----------------------------------------------------------------------===// | |
| // The max number of bindings per descriptor set allowed in the Metal HAL | |
| // implementation. | |
| // | |
| // Note that Metal itself is more permissive: | |
| // - Argument buffer tier 1 binding limits: | |
| // - iOS: 31 buffers (on A11 and later, 96 buffers) | |
| // - macOS: 64 buffers | |
| // - Argument buffer tier 2 binding limits: | |
| // - 500,000 buffers or textures | |
| #define IREE_HAL_METAL_MAX_DESCRIPTOR_SET_BINDING_COUNT 16 | |
| // The max number of descriptor sets allowed in the Metal HAL implementation. | |
| // | |
| // This depends on the general descriptor set planning in IREE and should adjust | |
| // with it. | |
| #define IREE_HAL_METAL_MAX_DESCRIPTOR_SET_COUNT 4 | |
| // The [[buffer(N)]] index for push constants. | |
| // | |
| // This depends on the general descriptor set planning in IREE and should adjust | |
| // with it. Note that it also needs to be consistent with the compiler side when | |
| // setting up resource location attributes during cross compiling SPIR-V to MSL. | |
| #define IREE_HAL_METAL_PUSH_CONSTANT_BUFFER_INDEX \ | |
| (IREE_HAL_METAL_MAX_DESCRIPTOR_SET_COUNT - 1) | |
| // The max number of push constants supported by the Metal HAL implementation. | |
| #define IREE_HAL_METAL_MAX_PUSH_CONSTANT_COUNT 64 | |
| //===----------------------------------------------------------------------===// | |
| // iree_hal_metal_descriptor_set_layout_t | |
| //===----------------------------------------------------------------------===// | |
| // Creates a descriptor set layout for the given |bindings|. | |
| // | |
| // |out_descriptor_set_layout| must be released by the caller (see | |
| // iree_hal_descriptor_set_layout_release). | |
| iree_status_t iree_hal_metal_descriptor_set_layout_create( | |
| iree_hal_descriptor_set_layout_flags_t flags, | |
| iree_host_size_t binding_count, | |
| const iree_hal_descriptor_set_layout_binding_t* bindings, | |
| iree_allocator_t host_allocator, | |
| iree_hal_descriptor_set_layout_t** out_descriptor_set_layout); | |
| // Returns the total number of bindings in the given descriptor set. | |
| iree_host_size_t iree_hal_metal_descriptor_set_layout_binding_count( | |
| const iree_hal_descriptor_set_layout_t* descriptor_set_layout); | |
| // Returns the information about a given |binding| in |descriptor_set_layout|. | |
| const iree_hal_descriptor_set_layout_binding_t* | |
| iree_hal_metal_descriptor_set_layout_binding( | |
| const iree_hal_descriptor_set_layout_t* descriptor_set_layout, | |
| uint32_t binding); | |
| //===----------------------------------------------------------------------===// | |
| // iree_hal_metal_pipeline_layout_t | |
| //===----------------------------------------------------------------------===// | |
| // Creates a pipeline layout with the given |set_layouts| and | |
| // |push_constant_count|. | |
| // | |
| // |out_pipeline_layout| must be released by the caller (see | |
| // iree_hal_pipeline_layout_release). | |
| iree_status_t iree_hal_metal_pipeline_layout_create( | |
| iree_host_size_t set_layout_count, | |
| iree_hal_descriptor_set_layout_t* const* set_layouts, | |
| iree_host_size_t push_constant_count, iree_allocator_t host_allocator, | |
| iree_hal_pipeline_layout_t** out_pipeline_layout); | |
| // Returns the descriptor set layout of the given |set| in |pipeline_layout|. | |
| const iree_hal_descriptor_set_layout_t* | |
| iree_hal_metal_pipeline_layout_descriptor_set_layout( | |
| const iree_hal_pipeline_layout_t* pipeline_layout, uint32_t set); | |
| // Returns the descriptor set count in the given |pipeline_layout|. | |
| iree_host_size_t iree_hal_metal_pipeline_layout_descriptor_set_count( | |
| const iree_hal_pipeline_layout_t* pipeline_layout); | |
| // Returns the push constant count in the given |pipeline_layout|. | |
| iree_host_size_t iree_hal_metal_pipeline_layout_push_constant_count( | |
| const iree_hal_pipeline_layout_t* pipeline_layout); | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif // __cplusplus | |
| #endif // IREE_EXPERIMENTAL_METAL_PIPELINE_LAYOUT_H_ |