From 625254d6ae3e636bebe74f8b3ce090f820c449da Mon Sep 17 00:00:00 2001 From: Aitor Camacho Date: Wed, 8 Apr 2026 16:19:19 +0900 Subject: [PATCH] kk: Remove buffer arg from queue writes Signed-off-by: Aitor Camacho Part-of: --- src/kosmickrisp/libkk/kk_query.cl | 5 +++-- src/kosmickrisp/vulkan/kk_cmd_buffer.c | 6 ++---- src/kosmickrisp/vulkan/kk_cmd_buffer.h | 5 +++-- src/kosmickrisp/vulkan/kk_encoder.c | 13 ++++++++----- src/kosmickrisp/vulkan/kk_event.c | 4 ++-- src/kosmickrisp/vulkan/kk_query_pool.c | 2 +- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/kosmickrisp/libkk/kk_query.cl b/src/kosmickrisp/libkk/kk_query.cl index ba55a9b22a8..e1f15a06ef0 100644 --- a/src/kosmickrisp/libkk/kk_query.cl +++ b/src/kosmickrisp/libkk/kk_query.cl @@ -50,9 +50,10 @@ libkk_reset_query(global uint64_t *availability, global uint64_t *results, } KERNEL(1) -libkk_write_u64(global struct libkk_imm_write *write_array) +libkk_write_u64_array(global struct libkk_imm_write *write_array) { - *write_array[cl_group_id.x].address = write_array[cl_group_id.x].value; + uint id = cl_global_id.x; + *(write_array[id].address) = write_array[id].value; } KERNEL(1) diff --git a/src/kosmickrisp/vulkan/kk_cmd_buffer.c b/src/kosmickrisp/vulkan/kk_cmd_buffer.c index 62893767f20..3ff5f3042c9 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_buffer.c +++ b/src/kosmickrisp/vulkan/kk_cmd_buffer.c @@ -447,11 +447,9 @@ kk_dispatch_precomp(struct kk_cmd_buffer *cmd, struct mtl_size grid, } void -kk_cmd_write(struct kk_cmd_buffer *cmd, mtl_buffer *buffer, uint64_t addr, - uint64_t value) +kk_cmd_write(struct kk_cmd_buffer *cmd, struct libkk_imm_write write) { - util_dynarray_append(&cmd->encoder->imm_writes, addr); - util_dynarray_append(&cmd->encoder->imm_writes, value); + util_dynarray_append(&cmd->encoder->imm_writes, write); } VKAPI_ATTR void VKAPI_CALL diff --git a/src/kosmickrisp/vulkan/kk_cmd_buffer.h b/src/kosmickrisp/vulkan/kk_cmd_buffer.h index e90bc7c1cea..0e44ed0fb12 100644 --- a/src/kosmickrisp/vulkan/kk_cmd_buffer.h +++ b/src/kosmickrisp/vulkan/kk_cmd_buffer.h @@ -17,6 +17,8 @@ #include "kosmickrisp/bridge/mtl_types.h" +#include "kosmickrisp/libkk/kk_query.h" + #include "util/u_dynarray.h" #include "vk_command_buffer.h" @@ -252,7 +254,6 @@ void kk_dispatch_precomp(struct kk_cmd_buffer *cmd, struct mtl_size grid, #define MESA_DISPATCH_PRECOMP kk_dispatch_precomp -void kk_cmd_write(struct kk_cmd_buffer *cmd, mtl_buffer *buffer, uint64_t addr, - uint64_t value); +void kk_cmd_write(struct kk_cmd_buffer *cmd, struct libkk_imm_write write); #endif diff --git a/src/kosmickrisp/vulkan/kk_encoder.c b/src/kosmickrisp/vulkan/kk_encoder.c index b2517bca3dd..6133ed44e71 100644 --- a/src/kosmickrisp/vulkan/kk_encoder.c +++ b/src/kosmickrisp/vulkan/kk_encoder.c @@ -135,15 +135,18 @@ upload_queue_writes(struct kk_cmd_buffer *cmd) enc->copy_query_pool_result_infos.size == 0u) return; - uint32_t count = util_dynarray_num_elements(&enc->imm_writes, uint64_t) / 2u; + uint32_t count = + util_dynarray_num_elements(&enc->imm_writes, struct libkk_imm_write); if (count != 0) { - struct kk_bo *bo = kk_cmd_allocate_buffer(cmd, enc->imm_writes.size, 8u); + uint64_t addr = + kk_pool_upload(cmd, enc->imm_writes.data, enc->imm_writes.size, + sizeof(struct libkk_imm_write)) + .gpu; /* kk_cmd_allocate_buffer sets the cmd buffer error so we can just exit */ - if (!bo) + if (!addr) return; - memcpy(bo->cpu, enc->imm_writes.data, enc->imm_writes.size); struct mtl_size grid = {count, 1, 1}; - libkk_write_u64(cmd, grid, false, bo->gpu); + libkk_write_u64_array(cmd, grid, false, addr); enc->imm_writes.size = 0u; } diff --git a/src/kosmickrisp/vulkan/kk_event.c b/src/kosmickrisp/vulkan/kk_event.c index 17234988c09..16d7cc4e099 100644 --- a/src/kosmickrisp/vulkan/kk_event.c +++ b/src/kosmickrisp/vulkan/kk_event.c @@ -94,7 +94,7 @@ kk_CmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent _event, { VK_FROM_HANDLE(kk_event, event, _event); VK_FROM_HANDLE(kk_cmd_buffer, cmd, commandBuffer); - kk_cmd_write(cmd, event->bo->map, event->addr, VK_EVENT_SET); + kk_cmd_write(cmd, (struct libkk_imm_write){event->addr, VK_EVENT_SET}); /* Can only be called from outside of a render pass, which means we can * directly upload the writes. */ @@ -107,7 +107,7 @@ kk_CmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent _event, { VK_FROM_HANDLE(kk_event, event, _event); VK_FROM_HANDLE(kk_cmd_buffer, cmd, commandBuffer); - kk_cmd_write(cmd, event->bo->map, event->addr, VK_EVENT_RESET); + kk_cmd_write(cmd, (struct libkk_imm_write){event->addr, VK_EVENT_RESET}); /* Can only be called from outside of a render pass, which means we can * directly upload the writes. */ diff --git a/src/kosmickrisp/vulkan/kk_query_pool.c b/src/kosmickrisp/vulkan/kk_query_pool.c index bf3ef778aac..c9594f6fb1b 100644 --- a/src/kosmickrisp/vulkan/kk_query_pool.c +++ b/src/kosmickrisp/vulkan/kk_query_pool.c @@ -284,7 +284,7 @@ kk_CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, /* Make the query available */ if (kk_has_available(pool)) { uint64_t addr = kk_query_available_addr(pool, query); - kk_cmd_write(cmd, pool->bo->map, addr, true); + kk_cmd_write(cmd, (struct libkk_imm_write){addr, true}); } }