[metal] Use one resource set to handle queue execution resources
diff --git a/experimental/metal/metal_device.m b/experimental/metal/metal_device.m
index 089aaea..a457343 100644
--- a/experimental/metal/metal_device.m
+++ b/experimental/metal/metal_device.m
@@ -337,18 +337,24 @@
iree_hal_metal_device_t* device = iree_hal_metal_device_cast(base_device);
IREE_TRACE_ZONE_BEGIN(z0);
+ iree_hal_resource_set_t* resource_set = NULL;
+ IREE_RETURN_AND_END_ZONE_IF_ERROR(
+ z0, iree_hal_resource_set_allocate(&device->block_pool, &resource_set));
+
+ IREE_RETURN_AND_END_ZONE_IF_ERROR(
+ z0, iree_hal_resource_set_insert(resource_set, command_buffer_count, command_buffers));
+ // Put the full semaphore list into a resource set, which retains them--we will need to access
+ // them until the command buffer completes.
+ IREE_RETURN_AND_END_ZONE_IF_ERROR(
+ z0, iree_hal_resource_set_insert(resource_set, wait_semaphore_list.count,
+ wait_semaphore_list.semaphores));
+ IREE_RETURN_AND_END_ZONE_IF_ERROR(
+ z0, iree_hal_resource_set_insert(resource_set, signal_semaphore_list.count,
+ signal_semaphore_list.semaphores));
+
@autoreleasepool {
// First create a new command buffer and encode wait commands for all wait semaphores.
if (wait_semaphore_list.count > 0) {
- // Put the full semaphore list into a resource set, which retains them--we will need to access
- // them until the command buffer completes.
- iree_hal_resource_set_t* resource_set;
- IREE_RETURN_AND_END_ZONE_IF_ERROR(
- z0, iree_hal_resource_set_allocate(&device->block_pool, &resource_set));
- IREE_RETURN_AND_END_ZONE_IF_ERROR(
- z0, iree_hal_resource_set_insert(resource_set, wait_semaphore_list.count,
- wait_semaphore_list.semaphores));
-
id<MTLCommandBuffer> wait_command_buffer = [device->queue
commandBufferWithDescriptor:device->command_buffer_descriptor]; // autoreleased
for (iree_host_size_t i = 0; i < wait_semaphore_list.count; ++i) {
@@ -356,35 +362,18 @@
iree_hal_metal_shared_event_handle(wait_semaphore_list.semaphores[i]);
[wait_command_buffer encodeWaitForEvent:handle value:wait_semaphore_list.payload_values[i]];
}
- [wait_command_buffer addCompletedHandler:^(id<MTLCommandBuffer> cb) {
- // Now we can release all retained wait semaphores.
- iree_hal_resource_set_free(resource_set);
- }];
[wait_command_buffer commit];
}
// Then commit all recorded compute command buffers.
for (iree_host_size_t i = 0; i < command_buffer_count; ++i) {
iree_hal_command_buffer_t* command_buffer = command_buffers[i];
- iree_hal_command_buffer_retain(command_buffer); // +1
id<MTLCommandBuffer> handle = iree_hal_metal_direct_command_buffer_handle(command_buffer);
- [handle addCompletedHandler:^(id<MTLCommandBuffer> cb) {
- iree_hal_command_buffer_release(command_buffer); // -1
- }];
[handle commit];
}
// Finally create a new command buffer and encode signal commands for all signal semaphores.
if (signal_semaphore_list.count > 0) {
- // Put the full semaphore list into a resource set, which retains them--we will need to access
- // them until the command buffer completes.
- iree_hal_resource_set_t* resource_set;
- IREE_RETURN_AND_END_ZONE_IF_ERROR(
- z0, iree_hal_resource_set_allocate(&device->block_pool, &resource_set));
- IREE_RETURN_AND_END_ZONE_IF_ERROR(
- z0, iree_hal_resource_set_insert(resource_set, signal_semaphore_list.count,
- signal_semaphore_list.semaphores));
-
id<MTLCommandBuffer> signal_command_buffer = [device->queue
commandBufferWithDescriptor:device->command_buffer_descriptor]; // autoreleased
for (iree_host_size_t i = 0; i < signal_semaphore_list.count; ++i) {