diff --git a/src/kosmickrisp/bridge/mtl_command_queue.h b/src/kosmickrisp/bridge/mtl_command_queue.h index 8cc0149d3a6..ed641a6d122 100644 --- a/src/kosmickrisp/bridge/mtl_command_queue.h +++ b/src/kosmickrisp/bridge/mtl_command_queue.h @@ -16,4 +16,10 @@ mtl_command_queue *mtl_new_command_queue(mtl_device *device, mtl_command_buffer *mtl_new_command_buffer(mtl_command_queue *cmd_queue); +void mtl_command_queue_add_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set); + +void mtl_command_queue_remove_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set); + #endif /* MTL_COMMAND_QUEUE_H */ \ No newline at end of file diff --git a/src/kosmickrisp/bridge/mtl_command_queue.m b/src/kosmickrisp/bridge/mtl_command_queue.m index 7f36cc69d9c..34c6fbc5e0c 100644 --- a/src/kosmickrisp/bridge/mtl_command_queue.m +++ b/src/kosmickrisp/bridge/mtl_command_queue.m @@ -26,3 +26,25 @@ mtl_new_command_buffer(mtl_command_queue *cmd_queue) return [[queue commandBuffer] retain]; } } + +void +mtl_command_queue_add_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set) +{ + @autoreleasepool { + id queue = (id)cmd_queue; + id s = (id)set; + return [queue addResidencySet:s]; + } +} + +void +mtl_command_queue_remove_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set) +{ + @autoreleasepool { + id queue = (id)cmd_queue; + id s = (id)set; + return [queue removeResidencySet:s]; + } +} diff --git a/src/kosmickrisp/bridge/stubs/mtl_command_queue.c b/src/kosmickrisp/bridge/stubs/mtl_command_queue.c index aa39a3446ee..d4decc778ce 100644 --- a/src/kosmickrisp/bridge/stubs/mtl_command_queue.c +++ b/src/kosmickrisp/bridge/stubs/mtl_command_queue.c @@ -17,3 +17,15 @@ mtl_new_command_buffer(mtl_command_queue *cmd_queue) { return NULL; } + +void +mtl_command_queue_add_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set) +{ +} + +void +mtl_command_queue_remove_residency_set(mtl_command_queue *cmd_queue, + mtl_residency_set *set) +{ +} diff --git a/src/kosmickrisp/vulkan/kk_device.c b/src/kosmickrisp/vulkan/kk_device.c index 51ab8d2601e..e7c39fed63a 100644 --- a/src/kosmickrisp/vulkan/kk_device.c +++ b/src/kosmickrisp/vulkan/kk_device.c @@ -297,15 +297,15 @@ kk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) if (dev->heap) kk_destroy_bo(dev, dev->heap); - /* Release the residency set last once all BOs are released. */ - mtl_release(dev->residency_set.handle); - simple_mtx_destroy(&dev->residency_set.mutex); - if (dev->has_queue) { kk_queue_finish(dev, &dev->queue); dev->has_queue = false; } + /* Release the residency set last once all BOs are released. */ + mtl_release(dev->residency_set.handle); + simple_mtx_destroy(&dev->residency_set.mutex); + vk_device_finish(&dev->vk); vk_free(&dev->vk.alloc, dev); diff --git a/src/kosmickrisp/vulkan/kk_queue.c b/src/kosmickrisp/vulkan/kk_queue.c index 565e9da46c7..95a97f90f6c 100644 --- a/src/kosmickrisp/vulkan/kk_queue.c +++ b/src/kosmickrisp/vulkan/kk_queue.c @@ -121,8 +121,12 @@ kk_queue_init(struct kk_device *dev, struct kk_queue *queue, queue->main.mtl_handle = mtl_new_command_queue(dev->mtl_handle, KK_MAX_CMD_BUFFERS); + mtl_command_queue_add_residency_set(queue->main.mtl_handle, + dev->residency_set.handle); queue->pre_gfx.mtl_handle = mtl_new_command_queue(dev->mtl_handle, KK_MAX_CMD_BUFFERS); + mtl_command_queue_add_residency_set(queue->pre_gfx.mtl_handle, + dev->residency_set.handle); queue->vk.driver_submit = kk_queue_submit; @@ -132,6 +136,10 @@ kk_queue_init(struct kk_device *dev, struct kk_queue *queue, void kk_queue_finish(struct kk_device *dev, struct kk_queue *queue) { + mtl_command_queue_remove_residency_set(queue->main.mtl_handle, + dev->residency_set.handle); + mtl_command_queue_remove_residency_set(queue->pre_gfx.mtl_handle, + dev->residency_set.handle); if (queue->wait_fence) mtl_release(queue->wait_fence); mtl_release(queue->pre_gfx.mtl_handle);