blob: b2c9728f2621fc0c2b7c898cf20ea11085ba6d70 [file] [log] [blame]
// 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
// See iree/base/api.h for documentation on the API conventions used.
#ifndef IREE_EXPERIMENTAL_METAL_API_H_
#define IREE_EXPERIMENTAL_METAL_API_H_
#include "iree/base/api.h"
#include "iree/hal/api.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// iree_hal_metal_device_params_t
//===----------------------------------------------------------------------===//
typedef enum iree_hal_metal_command_dispatch_type_e {
// Dispatch commands in command buffer in parallel.
IREE_HAL_METAL_COMMAND_DISPATCH_TYPE_CONCURRENT = 0,
// Dispatch commands in command buffer sequentially.
IREE_HAL_METAL_COMMAND_DISPATCH_TYPE_SERIAL = 1,
} iree_hal_metal_command_dispatch_type_t;
typedef enum iree_hal_metal_command_buffer_resource_reference_mode_e {
// Do not maintain strong references to resources used in command buffers.
IREE_HAL_METAL_COMMAND_BUFFER_RESOURCE_REFERENCE_MODE_UNRETAINED = 0,
// Maintain strong references to resources used in command buffers.
IREE_HAL_METAL_COMMAND_BUFFER_RESOURCE_REFERENCE_MODE_RETAINED = 1,
} iree_hal_metal_command_buffer_resource_reference_mode_t;
typedef enum iree_hal_metal_resource_hazard_tracking_mode_e {
// Do not track resource hazards. Hosting applications are responsible for
// ensuring that resources are not modified while in use.
IREE_HAL_METAL_RESOURCE_HAZARD_TRACKING_MODE_UNTRACKED = 0,
// Track resource hazards within the system Metal runtime.
IREE_HAL_METAL_RESOURCE_HAZARD_TRACKING_MODE_TRACKED = 1,
} iree_hal_metal_resource_hazard_tracking_mode_t;
// Parameters configuring an iree_hal_metal_device_t.
// Must be initialized with iree_hal_metal_device_params_initialize prior to
// use.
typedef struct iree_hal_metal_device_params_t {
// Total size in bytes of each block in the device shared block pool.
// Larger sizes will lower overhead and ensure the heap isn't hit for
// transient allocations while also increasing memory consumption.
iree_host_size_t arena_block_size;
// Total size in bytes of per-queue uniform buffers for uploading parameters
// to the GPU (including argument buffers and update source buffers).
// Larger sizes better support more concurrent/complex command buffers.
iree_host_size_t queue_uniform_buffer_size;
// Command dispatch type in command buffers.
// Normally we want to dispatch commands in command buffers in parallel, given
// that IREE performs explicit dependency tracking and synchronization by
// itself. Though being able to specify serial command dispatching helps
// debugging in certain cases.
iree_hal_metal_command_dispatch_type_t command_dispatch_type;
// Resource reference mode in command buffers.
// Normally we track resource lifetime in IREE explicitly, so we don't need to
// incur Metal runtime overhead to do that. But good for debugging purposes.
iree_hal_metal_command_buffer_resource_reference_mode_t
command_buffer_resource_reference_mode;
// Resource hazard tracking mode.
// IREE is following explicit GPU API model and tracks resource dependency by
// itself. So normally we don't need to let Metal runtime to track resource
// usages and prevent hazards, which incurs runtime overhead. But it can be
// helpful for debugging purposes.
iree_hal_metal_resource_hazard_tracking_mode_t resource_hazard_tracking_mode;
} iree_hal_metal_device_params_t;
// Initializes |out_params| to default values.
void iree_hal_metal_device_params_initialize(
iree_hal_metal_device_params_t* out_params);
//===----------------------------------------------------------------------===//
// iree_hal_metal_driver_t
//===----------------------------------------------------------------------===//
// Creates a Metal HAL driver, from which devices can be created with the given
// |device_params|.
//
// |out_driver| must be released by the caller (see iree_hal_driver_release).
IREE_API_EXPORT iree_status_t iree_hal_metal_driver_create(
iree_string_view_t identifier,
const iree_hal_metal_device_params_t* device_params,
iree_allocator_t host_allocator, iree_hal_driver_t** out_driver);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_EXPERIMENTAL_METAL_API_H_