From a8a3863313ef8c113eb869f13865444cbc983a44 Mon Sep 17 00:00:00 2001 From: Aitor Camacho Date: Sun, 9 Nov 2025 16:44:21 +0900 Subject: [PATCH] kk: Move all resource tracking to the residency set Removes encoder's use resource utilities. All memory allocations are now tracked in the VkDevice level residency set. This is accomplished by tracking buffer objects at create/destroy. Also removes all descriptor set residency tracking since it is no longer needed. Part-of: --- src/kosmickrisp/bridge/mtl_encoder.h | 7 -- src/kosmickrisp/bridge/mtl_encoder.m | 23 ------ src/kosmickrisp/bridge/stubs/mtl_encoder.c | 13 ---- src/kosmickrisp/vulkan/kk_bo.c | 3 + src/kosmickrisp/vulkan/kk_cmd_buffer.c | 76 +------------------ src/kosmickrisp/vulkan/kk_cmd_buffer.h | 7 -- src/kosmickrisp/vulkan/kk_cmd_dispatch.c | 6 -- src/kosmickrisp/vulkan/kk_cmd_draw.c | 5 -- src/kosmickrisp/vulkan/kk_cmd_meta.c | 11 +-- src/kosmickrisp/vulkan/kk_descriptor_set.c | 1 - src/kosmickrisp/vulkan/kk_descriptor_set.h | 4 - .../vulkan/kk_descriptor_set_layout.c | 3 - .../vulkan/kk_descriptor_set_layout.h | 3 - src/kosmickrisp/vulkan/kk_device.c | 64 +++++++--------- src/kosmickrisp/vulkan/kk_device.h | 13 ++-- src/kosmickrisp/vulkan/kk_device_memory.c | 5 +- src/kosmickrisp/vulkan/kk_encoder.c | 20 ----- src/kosmickrisp/vulkan/kk_encoder.h | 3 - src/kosmickrisp/vulkan/kk_query_pool.c | 4 - src/kosmickrisp/vulkan/kk_queue.c | 10 +-- 20 files changed, 46 insertions(+), 235 deletions(-) diff --git a/src/kosmickrisp/bridge/mtl_encoder.h b/src/kosmickrisp/bridge/mtl_encoder.h index bfd582d571e..3daac982196 100644 --- a/src/kosmickrisp/bridge/mtl_encoder.h +++ b/src/kosmickrisp/bridge/mtl_encoder.h @@ -50,13 +50,6 @@ void mtl_compute_set_pipeline_state(mtl_compute_encoder *encoder, void mtl_compute_set_buffer(mtl_compute_encoder *encoder, mtl_buffer *buffer, size_t offset, size_t index); -void mtl_compute_use_resource(mtl_compute_encoder *encoder, - mtl_resource *res_handle, uint32_t usage); - -void mtl_compute_use_resources(mtl_compute_encoder *encoder, - mtl_resource **resource_handles, uint32_t count, - enum mtl_resource_usage usage); - void mtl_compute_use_heaps(mtl_compute_encoder *encoder, mtl_heap **heaps, uint32_t count); diff --git a/src/kosmickrisp/bridge/mtl_encoder.m b/src/kosmickrisp/bridge/mtl_encoder.m index 8385ea8ac0b..3f88c547e6d 100644 --- a/src/kosmickrisp/bridge/mtl_encoder.m +++ b/src/kosmickrisp/bridge/mtl_encoder.m @@ -191,29 +191,6 @@ mtl_compute_set_buffer(mtl_compute_encoder *encoder, } } -void -mtl_compute_use_resource(mtl_compute_encoder *encoder, - mtl_resource *res_handle, uint32_t usage) -{ - @autoreleasepool { - id enc = (id)encoder; - id res = (id)res_handle; - [enc useResource:res usage:(MTLResourceUsage)usage]; - } -} - -void -mtl_compute_use_resources(mtl_compute_encoder *encoder, - mtl_resource **resource_handles, uint32_t count, - enum mtl_resource_usage usage) -{ - @autoreleasepool { - id enc = (id)encoder; - id *handles = (id*)resource_handles; - [enc useResources:handles count:count usage:(MTLResourceUsage)usage]; - } -} - void mtl_compute_use_heaps(mtl_compute_encoder *encoder, mtl_heap **heaps, uint32_t count) diff --git a/src/kosmickrisp/bridge/stubs/mtl_encoder.c b/src/kosmickrisp/bridge/stubs/mtl_encoder.c index 672e628c1dc..d2886d5059e 100644 --- a/src/kosmickrisp/bridge/stubs/mtl_encoder.c +++ b/src/kosmickrisp/bridge/stubs/mtl_encoder.c @@ -88,19 +88,6 @@ mtl_compute_set_buffer(mtl_compute_encoder *encoder, mtl_buffer *buffer, { } -void -mtl_compute_use_resource(mtl_compute_encoder *encoder, mtl_resource *res_handle, - uint32_t usage) -{ -} - -void -mtl_compute_use_resources(mtl_compute_encoder *encoder, - mtl_resource **resource_handles, uint32_t count, - enum mtl_resource_usage usage) -{ -} - void mtl_compute_use_heaps(mtl_compute_encoder *encoder, mtl_heap **heaps, uint32_t count) diff --git a/src/kosmickrisp/vulkan/kk_bo.c b/src/kosmickrisp/vulkan/kk_bo.c index 708b93fb2ed..eb9b507b86f 100644 --- a/src/kosmickrisp/vulkan/kk_bo.c +++ b/src/kosmickrisp/vulkan/kk_bo.c @@ -50,6 +50,8 @@ kk_alloc_bo(struct kk_device *dev, struct vk_object_base *log_obj, bo->gpu = mtl_buffer_get_gpu_address(map); bo->cpu = mtl_get_contents(map); + kk_device_add_heap_to_residency_set(dev, handle); + *bo_out = bo; return result; @@ -64,6 +66,7 @@ fail_heap: void kk_destroy_bo(struct kk_device *dev, struct kk_bo *bo) { + kk_device_remove_heap_from_residency_set(dev, bo->mtl_handle); mtl_release(bo->map); mtl_release(bo->mtl_handle); FREE(bo); diff --git a/src/kosmickrisp/vulkan/kk_cmd_buffer.c b/src/kosmickrisp/vulkan/kk_cmd_buffer.c index b38b2f2e844..d438f7f0fe8 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_buffer.c +++ b/src/kosmickrisp/vulkan/kk_cmd_buffer.c @@ -29,7 +29,6 @@ kk_descriptor_state_fini(struct kk_cmd_buffer *cmd, desc->push[i] = NULL; desc->sets[i] = NULL; /* We also need to set sets to NULL so state doesn't propagate if we reset it */ - desc->sets_not_resident = 0u; } } @@ -204,8 +203,6 @@ kk_bind_descriptor_sets(struct kk_descriptor_state *desc, } desc->sets[s] = set; - desc->sets_not_resident |= BITFIELD_BIT(s); - /* Binding descriptors invalidates push descriptors */ desc->push_dirty &= ~BITFIELD_BIT(s); } @@ -262,11 +259,9 @@ kk_cmd_push_descriptors(struct kk_cmd_buffer *cmd, struct kk_descriptor_set_layout *set_layout, uint32_t set) { - struct kk_device *dev = kk_cmd_buffer_device(cmd); assert(set < KK_MAX_SETS); if (unlikely(desc->push[set] == NULL)) { - size_t size = sizeof(*desc->push[set]) + - (sizeof(mtl_resource *) * set_layout->descriptor_count); + size_t size = sizeof(*desc->push[set]); desc->push[set] = vk_zalloc(&cmd->vk.pool->alloc, size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (unlikely(desc->push[set] == NULL)) { @@ -274,14 +269,11 @@ kk_cmd_push_descriptors(struct kk_cmd_buffer *cmd, return NULL; } desc->push[set]->layout = set_layout; - for (uint32_t i = 0u; i < set_layout->descriptor_count; ++i) - desc->push[set]->mtl_resources[i] = dev->null_descriptor->map; } /* Pushing descriptors replaces whatever sets are bound */ desc->sets[set] = NULL; desc->push_dirty |= BITFIELD_BIT(set); - desc->sets_not_resident |= BITFIELD_BIT(set); return desc->push[set]; } @@ -425,7 +417,6 @@ kk_cmd_buffer_flush_push_descriptors(struct kk_cmd_buffer *cmd, return; memcpy(bo->cpu, push_set->data, sizeof(push_set->data)); - push_set->mtl_descriptor_buffer = bo->map; desc->root.sets[set_idx] = bo->gpu; desc->set_sizes[set_idx] = sizeof(push_set->data); } @@ -434,77 +425,12 @@ kk_cmd_buffer_flush_push_descriptors(struct kk_cmd_buffer *cmd, desc->push_dirty = 0; } -static void -kk_make_graphics_descriptor_resources_resident(struct kk_cmd_buffer *cmd) -{ - struct kk_descriptor_state *desc = &cmd->state.gfx.descriptors; - mtl_render_encoder *encoder = kk_render_encoder(cmd); - /* Make resources resident as required by Metal */ - u_foreach_bit(set_index, desc->sets_not_resident) { - mtl_resource *descriptor_buffer = NULL; - - /* If we have no set, it means it was a push set */ - if (desc->sets[set_index]) { - struct kk_descriptor_set *set = desc->sets[set_index]; - descriptor_buffer = set->mtl_descriptor_buffer; - } else { - struct kk_push_descriptor_set *push_set = desc->push[set_index]; - descriptor_buffer = push_set->mtl_descriptor_buffer; - } - - /* We could have empty descriptor sets for some reason... */ - if (descriptor_buffer) { - mtl_render_use_resource(encoder, descriptor_buffer, - MTL_RESOURCE_USAGE_READ); - } - } - - desc->sets_not_resident = 0u; -} - -static void -kk_make_compute_descriptor_resources_resident(struct kk_cmd_buffer *cmd) -{ - struct kk_descriptor_state *desc = &cmd->state.cs.descriptors; - mtl_compute_encoder *encoder = kk_compute_encoder(cmd); - u_foreach_bit(set_index, desc->sets_not_resident) { - /* Make resources resident as required by Metal */ - mtl_resource *descriptor_buffer = NULL; - if (desc->sets[set_index]) { - struct kk_descriptor_set *set = desc->sets[set_index]; - descriptor_buffer = set->mtl_descriptor_buffer; - } else { - struct kk_push_descriptor_set *push_set = desc->push[set_index]; - descriptor_buffer = push_set->mtl_descriptor_buffer; - } - - /* We could have empty descriptor sets for some reason... */ - if (descriptor_buffer) { - mtl_compute_use_resource(encoder, descriptor_buffer, - MTL_RESOURCE_USAGE_READ); - } - } - - desc->sets_not_resident = 0u; -} - -void -kk_make_descriptor_resources_resident(struct kk_cmd_buffer *cmd, - VkPipelineBindPoint bind_point) -{ - if (bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) - kk_make_graphics_descriptor_resources_resident(cmd); - else if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) - kk_make_compute_descriptor_resources_resident(cmd); -} - void kk_cmd_write(struct kk_cmd_buffer *cmd, mtl_buffer *buffer, uint64_t addr, uint64_t value) { util_dynarray_append(&cmd->encoder->imm_writes, addr); util_dynarray_append(&cmd->encoder->imm_writes, value); - util_dynarray_append(&cmd->encoder->resident_buffers, buffer); } VKAPI_ATTR void VKAPI_CALL diff --git a/src/kosmickrisp/vulkan/kk_cmd_buffer.h b/src/kosmickrisp/vulkan/kk_cmd_buffer.h index d5722a53cbb..43f2a8e2e50 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_buffer.h +++ b/src/kosmickrisp/vulkan/kk_cmd_buffer.h @@ -61,10 +61,6 @@ struct kk_descriptor_state { uint32_t set_sizes[KK_MAX_SETS]; struct kk_descriptor_set *sets[KK_MAX_SETS]; - mtl_resource **resources[KK_MAX_SETS]; - /* Non resident sets can either be sets or push. If sets[index] == NULL, then - * push[index] != NULL */ - uint32_t sets_not_resident; uint32_t push_dirty; struct kk_push_descriptor_set *push[KK_MAX_SETS]; @@ -255,9 +251,6 @@ uint64_t kk_upload_descriptor_root(struct kk_cmd_buffer *cmd, void kk_cmd_buffer_flush_push_descriptors(struct kk_cmd_buffer *cmd, struct kk_descriptor_state *desc); -void kk_make_descriptor_resources_resident(struct kk_cmd_buffer *cmd, - VkPipelineBindPoint bind_point); - void kk_cmd_write(struct kk_cmd_buffer *cmd, mtl_buffer *buffer, uint64_t addr, uint64_t value); diff --git a/src/kosmickrisp/vulkan/kk_cmd_dispatch.c b/src/kosmickrisp/vulkan/kk_cmd_dispatch.c index bfca701c52f..2a66ad47794 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_dispatch.c +++ b/src/kosmickrisp/vulkan/kk_cmd_dispatch.c @@ -72,18 +72,12 @@ static void kk_flush_compute_state(struct kk_cmd_buffer *cmd) { mtl_compute_encoder *enc = kk_compute_encoder(cmd); - struct kk_device *dev = kk_cmd_buffer_device(cmd); // Fill Metal argument buffer with descriptor set addresses struct kk_descriptor_state *desc = &cmd->state.cs.descriptors; if (desc->push_dirty) kk_cmd_buffer_flush_push_descriptors(cmd, desc); - /* After push descriptors' buffers are created. Otherwise, the buffer where - * they live will not be created and cannot make it resident */ - if (desc->sets_not_resident) - kk_make_descriptor_resources_resident(cmd, - VK_PIPELINE_BIND_POINT_COMPUTE); if (desc->root_dirty) kk_upload_descriptor_root(cmd, VK_PIPELINE_BIND_POINT_COMPUTE); diff --git a/src/kosmickrisp/vulkan/kk_cmd_draw.c b/src/kosmickrisp/vulkan/kk_cmd_draw.c index 3a9b69a1caa..7bf2ee4c1f9 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_draw.c +++ b/src/kosmickrisp/vulkan/kk_cmd_draw.c @@ -816,11 +816,6 @@ kk_flush_draw_state(struct kk_cmd_buffer *cmd) if (desc->push_dirty) kk_cmd_buffer_flush_push_descriptors(cmd, desc); - /* After push descriptors' buffers are created. Otherwise, the buffer where - * they live will not be created and cannot make it resident */ - if (desc->sets_not_resident) - kk_make_descriptor_resources_resident(cmd, - VK_PIPELINE_BIND_POINT_GRAPHICS); if (desc->root_dirty) kk_upload_descriptor_root(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS); diff --git a/src/kosmickrisp/vulkan/kk_cmd_meta.c b/src/kosmickrisp/vulkan/kk_cmd_meta.c index debf9cd467c..c889fe19a0d 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_meta.c +++ b/src/kosmickrisp/vulkan/kk_cmd_meta.c @@ -35,8 +35,7 @@ kk_cmd_bind_map_buffer(struct vk_command_buffer *vk_cmd, buffer->mtl_handle = bo->map; buffer->vk.device_address = bo->gpu; *map_out = bo->cpu; - mtl_compute_use_resource(cmd->encoder->main.encoder, buffer->mtl_handle, - MTL_RESOURCE_USAGE_WRITE | MTL_RESOURCE_USAGE_READ); + return VK_SUCCESS; } @@ -147,11 +146,9 @@ kk_meta_end(struct kk_cmd_buffer *cmd, struct kk_meta_save *save, desc->sets[0] = save->desc0; desc->root.sets[0] = save->desc0->addr; desc->set_sizes[0] = save->desc0->size; - desc->sets_not_resident |= BITFIELD_BIT(0); desc->push_dirty &= ~BITFIELD_BIT(0); } else if (save->has_push_desc0) { desc->push[0] = save->push_desc0; - desc->sets_not_resident |= BITFIELD_BIT(0); desc->push_dirty |= BITFIELD_BIT(0); } @@ -197,13 +194,10 @@ kk_CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dstRange, uint32_t data) { VK_FROM_HANDLE(kk_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(kk_buffer, buf, dstBuffer); struct kk_device *dev = kk_cmd_buffer_device(cmd); struct kk_meta_save save; kk_meta_begin(cmd, &save, VK_PIPELINE_BIND_POINT_COMPUTE); - mtl_compute_use_resource(kk_compute_encoder(cmd), buf->mtl_handle, - MTL_RESOURCE_USAGE_WRITE); vk_meta_fill_buffer(&cmd->vk, &dev->meta, dstBuffer, dstOffset, dstRange, data); kk_meta_end(cmd, &save, VK_PIPELINE_BIND_POINT_COMPUTE); @@ -215,13 +209,10 @@ kk_CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, const void *pData) { VK_FROM_HANDLE(kk_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(kk_buffer, buf, dstBuffer); struct kk_device *dev = kk_cmd_buffer_device(cmd); struct kk_meta_save save; kk_meta_begin(cmd, &save, VK_PIPELINE_BIND_POINT_COMPUTE); - mtl_compute_use_resource(kk_compute_encoder(cmd), buf->mtl_handle, - MTL_RESOURCE_USAGE_WRITE); vk_meta_update_buffer(&cmd->vk, &dev->meta, dstBuffer, dstOffset, dstRange, pData); kk_meta_end(cmd, &save, VK_PIPELINE_BIND_POINT_COMPUTE); diff --git a/src/kosmickrisp/vulkan/kk_descriptor_set.c b/src/kosmickrisp/vulkan/kk_descriptor_set.c index 0637fddc812..090c1b055f4 100644 --- a/src/kosmickrisp/vulkan/kk_descriptor_set.c +++ b/src/kosmickrisp/vulkan/kk_descriptor_set.c @@ -579,7 +579,6 @@ kk_descriptor_set_create(struct kk_device *dev, struct kk_descriptor_pool *pool, vk_object_free(&dev->vk, NULL, set); return result; } - set->mtl_descriptor_buffer = pool->bo->map; } vk_descriptor_set_layout_ref(&layout->vk); diff --git a/src/kosmickrisp/vulkan/kk_descriptor_set.h b/src/kosmickrisp/vulkan/kk_descriptor_set.h index d1652448a41..741fcc73b5a 100644 --- a/src/kosmickrisp/vulkan/kk_descriptor_set.h +++ b/src/kosmickrisp/vulkan/kk_descriptor_set.h @@ -41,7 +41,6 @@ struct kk_descriptor_set { struct list_head link; struct kk_descriptor_set_layout *layout; - mtl_resource *mtl_descriptor_buffer; void *mapped_ptr; uint64_t addr; uint32_t size; @@ -64,9 +63,6 @@ kk_descriptor_set_addr(const struct kk_descriptor_set *set) struct kk_push_descriptor_set { uint8_t data[KK_PUSH_DESCRIPTOR_SET_SIZE]; struct kk_descriptor_set_layout *layout; - mtl_resource *mtl_descriptor_buffer; - uint32_t resource_count; - mtl_resource *mtl_resources[]; }; void kk_push_descriptor_set_update(struct kk_push_descriptor_set *push_set, diff --git a/src/kosmickrisp/vulkan/kk_descriptor_set_layout.c b/src/kosmickrisp/vulkan/kk_descriptor_set_layout.c index 21004dc818d..97c76a4d831 100644 --- a/src/kosmickrisp/vulkan/kk_descriptor_set_layout.c +++ b/src/kosmickrisp/vulkan/kk_descriptor_set_layout.c @@ -176,7 +176,6 @@ kk_CreateDescriptorSetLayout(VkDevice device, uint32_t buffer_size = 0; uint32_t max_variable_descriptor_size = 0; uint8_t dynamic_buffer_count = 0; - uint32_t total_descriptor_count = 0u; for (uint32_t b = 0; b < num_bindings; b++) { /* We stashed the pCreateInfo->pBindings[] index (plus one) in the * immutable_samplers pointer. Check for NULL (empty binding) and then @@ -195,7 +194,6 @@ kk_CreateDescriptorSetLayout(VkDevice device, continue; layout->binding[b].type = binding->descriptorType; - layout->binding[b].mtl_resources_index = total_descriptor_count; layout->descriptor_count += binding->descriptorCount; if (binding_flags_info && binding_flags_info->bindingCount > 0) { @@ -250,7 +248,6 @@ kk_CreateDescriptorSetLayout(VkDevice device, stride *= max_plane_count; layout->binding[b].count_per_element = max_plane_count; - total_descriptor_count += max_plane_count * binding->descriptorCount; if (stride > 0) { assert(stride <= UINT8_MAX); diff --git a/src/kosmickrisp/vulkan/kk_descriptor_set_layout.h b/src/kosmickrisp/vulkan/kk_descriptor_set_layout.h index 14ecda0f62a..a993a4a2dd2 100644 --- a/src/kosmickrisp/vulkan/kk_descriptor_set_layout.h +++ b/src/kosmickrisp/vulkan/kk_descriptor_set_layout.h @@ -38,9 +38,6 @@ struct kk_descriptor_set_binding_layout { /* Offset into the descriptor buffer where this descriptor lives */ uint32_t offset; - /* Offset to the mtl_resource_ids array where this descriptor stores them */ - uint32_t mtl_resources_index; - /* Stride between array elements in the descriptor buffer */ uint8_t stride; diff --git a/src/kosmickrisp/vulkan/kk_device.c b/src/kosmickrisp/vulkan/kk_device.c index bb05a30cbd5..93e959ce746 100644 --- a/src/kosmickrisp/vulkan/kk_device.c +++ b/src/kosmickrisp/vulkan/kk_device.c @@ -205,10 +205,10 @@ kk_CreateDevice(VkPhysicalDevice physicalDevice, dev->vk.command_buffer_ops = &kk_cmd_buffer_ops; dev->vk.command_dispatch_table = &dev->vk.dispatch_table; - /* Buffer to use as null descriptor */ - result = kk_alloc_bo(dev, &dev->vk.base, sizeof(uint64_t) * 8, 8u, - &dev->null_descriptor); - if (result != VK_SUCCESS) + /* We need to initialize the device residency set before any bo is created. */ + simple_mtx_init(&dev->residency_set.mutex, mtx_plain); + dev->residency_set.handle = mtl_new_residency_set(dev->mtl_handle); + if (dev->residency_set.handle == NULL) goto fail_init; result = @@ -233,10 +233,6 @@ kk_CreateDevice(VkPhysicalDevice physicalDevice, if (result != VK_SUCCESS) goto fail_sampler_heap; - simple_mtx_init(&dev->user_residency_set.mutex, mtx_plain); - dev->user_residency_set.residency_set = - mtl_new_residency_set(dev->mtl_handle); - kk_parse_device_environment_options(dev); *pDevice = kk_device_to_handle(dev); @@ -252,7 +248,8 @@ fail_meta: fail_mem_cache: kk_queue_finish(dev, &dev->queue); fail_vab_memory: - kk_destroy_bo(dev, dev->null_descriptor); + mtl_release(dev->residency_set.handle); + simple_mtx_destroy(&dev->residency_set.mutex); fail_init: vk_device_finish(&dev->vk); fail_alloc: @@ -268,25 +265,24 @@ kk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) if (!dev) return; + /* End capture before we start releasing resources. Otherwise, Metal capture + * may run into issues. */ + if (dev->gpu_capture_enabled) { + mtl_stop_gpu_capture(); + } + /* Meta first since it may destroy Vulkan objects */ kk_device_finish_meta(dev); - - /* Need to end the residency otherwise stopping a capture crashes the - * program... */ - mtl_residency_set_end_residency(dev->user_residency_set.residency_set); - mtl_release(dev->user_residency_set.residency_set); - simple_mtx_destroy(&dev->user_residency_set.mutex); kk_device_finish_lib(dev); kk_query_table_finish(dev, &dev->occlusion_queries); kk_destroy_sampler_heap(dev, &dev->samplers); - kk_queue_finish(dev, &dev->queue); - kk_destroy_bo(dev, dev->null_descriptor); - vk_device_finish(&dev->vk); + /* 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->gpu_capture_enabled) { - mtl_stop_gpu_capture(); - } + kk_queue_finish(dev, &dev->queue); + vk_device_finish(&dev->vk); vk_free(&dev->vk.alloc, dev); } @@ -358,28 +354,26 @@ kk_GetDeviceProcAddr(VkDevice _device, const char *pName) } void -kk_device_add_user_heap(struct kk_device *dev, mtl_heap *heap) +kk_device_add_heap_to_residency_set(struct kk_device *dev, mtl_heap *heap) { - simple_mtx_lock(&dev->user_residency_set.mutex); - mtl_residency_set_add_allocation(dev->user_residency_set.residency_set, - heap); - simple_mtx_unlock(&dev->user_residency_set.mutex); + simple_mtx_lock(&dev->residency_set.mutex); + mtl_residency_set_add_allocation(dev->residency_set.handle, heap); + simple_mtx_unlock(&dev->residency_set.mutex); } void -kk_device_remove_user_heap(struct kk_device *dev, mtl_heap *heap) +kk_device_remove_heap_from_residency_set(struct kk_device *dev, mtl_heap *heap) { - simple_mtx_lock(&dev->user_residency_set.mutex); - mtl_residency_set_remove_allocation(dev->user_residency_set.residency_set, - heap); - simple_mtx_unlock(&dev->user_residency_set.mutex); + simple_mtx_lock(&dev->residency_set.mutex); + mtl_residency_set_remove_allocation(dev->residency_set.handle, heap); + simple_mtx_unlock(&dev->residency_set.mutex); } void kk_device_make_resources_resident(struct kk_device *dev) { - simple_mtx_lock(&dev->user_residency_set.mutex); - mtl_residency_set_commit(dev->user_residency_set.residency_set); - mtl_residency_set_request_residency(dev->user_residency_set.residency_set); - simple_mtx_unlock(&dev->user_residency_set.mutex); + simple_mtx_lock(&dev->residency_set.mutex); + mtl_residency_set_commit(dev->residency_set.handle); + mtl_residency_set_request_residency(dev->residency_set.handle); + simple_mtx_unlock(&dev->residency_set.mutex); } diff --git a/src/kosmickrisp/vulkan/kk_device.h b/src/kosmickrisp/vulkan/kk_device.h index d853fdc2a2f..77e84eb0b20 100644 --- a/src/kosmickrisp/vulkan/kk_device.h +++ b/src/kosmickrisp/vulkan/kk_device.h @@ -32,9 +32,9 @@ enum kk_device_lib_pipeline { KK_LIB_COUNT, }; -struct kk_user_residency_set { +struct kk_residency_set { simple_mtx_t mutex; - mtl_residency_set *residency_set; + mtl_residency_set *handle; }; struct mtl_sampler_packed { @@ -84,14 +84,12 @@ struct kk_device { * commands due to Metal limitations */ struct vk_device_dispatch_table exposed_dispatch_table; - struct kk_bo *null_descriptor; - struct kk_sampler_heap samplers; struct kk_query_table occlusion_queries; /* Track all heaps the user allocated so we can set them all as resident when * recording as required by Metal. */ - struct kk_user_residency_set user_residency_set; + struct kk_residency_set residency_set; mtl_compute_pipeline_state *lib_pipelines[KK_LIB_COUNT]; @@ -123,8 +121,9 @@ VkResult kk_device_init_meta(struct kk_device *dev); void kk_device_finish_meta(struct kk_device *dev); VkResult kk_device_init_lib(struct kk_device *dev); void kk_device_finish_lib(struct kk_device *dev); -void kk_device_add_user_heap(struct kk_device *dev, mtl_heap *heap); -void kk_device_remove_user_heap(struct kk_device *dev, mtl_heap *heap); +void kk_device_add_heap_to_residency_set(struct kk_device *dev, mtl_heap *heap); +void kk_device_remove_heap_from_residency_set(struct kk_device *dev, + mtl_heap *heap); void kk_device_make_resources_resident(struct kk_device *dev); /* Required to create a sampler */ diff --git a/src/kosmickrisp/vulkan/kk_device_memory.c b/src/kosmickrisp/vulkan/kk_device_memory.c index e020aa979f4..13e1dcc6595 100644 --- a/src/kosmickrisp/vulkan/kk_device_memory.c +++ b/src/kosmickrisp/vulkan/kk_device_memory.c @@ -94,6 +94,7 @@ kk_AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, mem->bo->gpu = mtl_buffer_get_gpu_address(mem->bo->map); mem->bo->cpu = mtl_get_contents(mem->bo->map); mem->bo->size_B = mtl_heap_get_size(mem->bo->mtl_handle); + kk_device_add_heap_to_residency_set(dev, mem->bo->mtl_handle); } else { result = kk_alloc_bo(dev, &dev->vk.base, aligned_size, alignment, &mem->bo); @@ -104,8 +105,6 @@ kk_AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, struct kk_memory_heap *heap = &pdev->mem_heaps[type->heapIndex]; p_atomic_add(&heap->used, mem->bo->size_B); - kk_device_add_user_heap(dev, mem->bo->mtl_handle); - *pMem = kk_device_memory_to_handle(mem); return VK_SUCCESS; @@ -126,8 +125,6 @@ kk_FreeMemory(VkDevice device, VkDeviceMemory _mem, if (!mem) return; - kk_device_remove_user_heap(dev, mem->bo->mtl_handle); - const VkMemoryType *type = &pdev->mem_types[mem->vk.memory_type_index]; struct kk_memory_heap *heap = &pdev->mem_heaps[type->heapIndex]; p_atomic_add(&heap->used, -((int64_t)mem->bo->size_B)); diff --git a/src/kosmickrisp/vulkan/kk_encoder.c b/src/kosmickrisp/vulkan/kk_encoder.c index 76eb5ad5806..e65aedc5443 100644 --- a/src/kosmickrisp/vulkan/kk_encoder.c +++ b/src/kosmickrisp/vulkan/kk_encoder.c @@ -39,7 +39,6 @@ kk_encoder_init(mtl_device *device, struct kk_queue *queue, kk_encoder_start_internal(&enc->pre_gfx, device, queue->pre_gfx.mtl_handle); enc->event = mtl_new_event(device); enc->imm_writes = UTIL_DYNARRAY_INIT; - enc->resident_buffers = UTIL_DYNARRAY_INIT; enc->copy_query_pool_result_infos = UTIL_DYNARRAY_INIT; *encoder = enc; @@ -180,12 +179,6 @@ upload_queue_writes(struct kk_cmd_buffer *cmd) if (!bo) return; memcpy(bo->cpu, enc->imm_writes.data, enc->imm_writes.size); - uint32_t buffer_count = - util_dynarray_num_elements(&enc->resident_buffers, mtl_buffer *); - mtl_compute_use_resource(compute, bo->map, MTL_RESOURCE_USAGE_READ); - mtl_compute_use_resources( - compute, enc->resident_buffers.data, buffer_count, - MTL_RESOURCE_USAGE_READ | MTL_RESOURCE_USAGE_WRITE); struct kk_imm_write_push push_data = { .buffer_address = bo->gpu, .count = count, @@ -193,7 +186,6 @@ upload_queue_writes(struct kk_cmd_buffer *cmd) kk_cmd_dispatch_pipeline(cmd, compute, kk_device_lib_pipeline(dev, KK_LIB_IMM_WRITE), &push_data, sizeof(push_data), count, 1, 1); - enc->resident_buffers.size = 0u; enc->imm_writes.size = 0u; } @@ -201,11 +193,6 @@ upload_queue_writes(struct kk_cmd_buffer *cmd) struct kk_copy_query_pool_results_info); if (count != 0u) { mtl_compute_encoder *compute = kk_compute_encoder(cmd); - uint32_t buffer_count = - util_dynarray_num_elements(&enc->resident_buffers, mtl_buffer *); - mtl_compute_use_resources( - compute, enc->resident_buffers.data, buffer_count, - MTL_RESOURCE_USAGE_READ | MTL_RESOURCE_USAGE_WRITE); for (uint32_t i = 0u; i < count; ++i) { struct kk_copy_query_pool_results_info *push_data = @@ -216,7 +203,6 @@ upload_queue_writes(struct kk_cmd_buffer *cmd) cmd, compute, kk_device_lib_pipeline(dev, KK_LIB_COPY_QUERY), push_data, sizeof(*push_data), push_data->query_count, 1, 1); } - enc->resident_buffers.size = 0u; enc->copy_query_pool_result_infos.size = 0u; } @@ -292,7 +278,6 @@ kk_post_execution_release(void *data) kk_post_execution_release_internal(&encoder->pre_gfx); mtl_release(encoder->event); util_dynarray_fini(&encoder->imm_writes); - util_dynarray_fini(&encoder->resident_buffers); util_dynarray_fini(&encoder->copy_query_pool_result_infos); free(encoder); } @@ -416,11 +401,6 @@ kk_encoder_render_triangle_fan_common(struct kk_cmd_buffer *cmd, info->out_el_size_B = out_el_size_B; info->flatshade_first = true; mtl_compute_encoder *encoder = kk_encoder_pre_gfx_encoder(cmd); - if (index) - mtl_compute_use_resource(encoder, index, MTL_RESOURCE_USAGE_READ); - mtl_compute_use_resource(encoder, indirect, MTL_RESOURCE_USAGE_READ); - mtl_compute_use_resource(encoder, index_buffer->map, - MTL_RESOURCE_USAGE_WRITE); struct kk_device *dev = kk_cmd_buffer_device(cmd); kk_cmd_dispatch_pipeline(cmd, encoder, diff --git a/src/kosmickrisp/vulkan/kk_encoder.h b/src/kosmickrisp/vulkan/kk_encoder.h index 5c45b87ecdd..d216bdbf592 100644 --- a/src/kosmickrisp/vulkan/kk_encoder.h +++ b/src/kosmickrisp/vulkan/kk_encoder.h @@ -70,9 +70,6 @@ struct kk_encoder { /* uint64_t pairs with first being the address, second being the value to * write */ struct util_dynarray imm_writes; - /* mtl_buffers (destination buffers) so we can make them resident before the - * dispatch */ - struct util_dynarray resident_buffers; /* Array of kk_copy_quer_pool_results_info structs */ struct util_dynarray copy_query_pool_result_infos; }; diff --git a/src/kosmickrisp/vulkan/kk_query_pool.c b/src/kosmickrisp/vulkan/kk_query_pool.c index eefa33f2deb..0d58cfb4a13 100644 --- a/src/kosmickrisp/vulkan/kk_query_pool.c +++ b/src/kosmickrisp/vulkan/kk_query_pool.c @@ -418,10 +418,6 @@ kk_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, }; util_dynarray_append(&cmd->encoder->copy_query_pool_result_infos, info); - util_dynarray_append(&cmd->encoder->resident_buffers, dst_buf->mtl_handle); - util_dynarray_append(&cmd->encoder->resident_buffers, pool->bo->map); - util_dynarray_append(&cmd->encoder->resident_buffers, - dev->occlusion_queries.bo->map); /* If we are not mid encoder, just upload the writes */ if (cmd->encoder->main.last_used == KK_ENC_NONE) upload_queue_writes(cmd); diff --git a/src/kosmickrisp/vulkan/kk_queue.c b/src/kosmickrisp/vulkan/kk_queue.c index 1e2ea723cc9..2a8b2b22237 100644 --- a/src/kosmickrisp/vulkan/kk_queue.c +++ b/src/kosmickrisp/vulkan/kk_queue.c @@ -31,11 +31,6 @@ kk_queue_submit(struct vk_queue *vk_queue, struct vk_queue_submit *submit) if (result != VK_SUCCESS) return result; - /* Ensure any changes to residency are propagated before we submit any work. - * All resources should have been allocated before submission. Otherwise, - * users are playing with fire. */ - kk_device_make_resources_resident(dev); - /* Chain with previous sumbission */ if (queue->wait_fence) { util_dynarray_append(&encoder->main.fences, queue->wait_fence); @@ -78,6 +73,11 @@ kk_queue_submit(struct vk_queue *vk_queue, struct vk_queue_submit *submit) signal->signal_value); } + /* Ensure any changes to residency are propagated before we submit any work. + * All resources should have been allocated before submission. Otherwise, + * users are playing with fire. */ + kk_device_make_resources_resident(dev); + /* Steal the last fence to chain with the next submission */ if (util_dynarray_num_elements(&encoder->main.fences, mtl_fence *) > 0) queue->wait_fence = util_dynarray_pop(&encoder->main.fences, mtl_fence *);