diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 45c4ed00a5d..021f0890c81 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -1544,3 +1544,14 @@ anv_cmd_buffer_restore_state(struct anv_cmd_buffer *cmd_buffer, anv_CmdPushConstants2KHR(cmd_buffer_, &push_info); } } + +void +anv_cmd_write_buffer_cp(VkCommandBuffer commandBuffer, + VkDeviceAddress dstAddr, + void *data, + uint32_t size) +{ + ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); + anv_genX(cmd_buffer->device->info, cmd_write_buffer_cp)(cmd_buffer, dstAddr, + data, size); +} diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 03117ace095..4c055d08c0c 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -345,6 +345,10 @@ genX(cmd_buffer_begin_companion_rcs_syncpoint)(struct anv_cmd_buffer *cmd_buffer void genX(cmd_buffer_end_companion_rcs_syncpoint)(struct anv_cmd_buffer *cmd_buffer, struct anv_state syncpoint); +void +genX(cmd_write_buffer_cp)(struct anv_cmd_buffer *cmd_buffer, + VkDeviceAddress dstAddr, + void *data, uint32_t size); void genX(emit_simple_shader_init)(struct anv_simple_shader *state); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index fa16699544c..04afaf180a1 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5905,6 +5905,11 @@ anv_cmd_buffer_update_addr(struct anv_cmd_buffer *cmd_buffer, VkDeviceSize dataSize, const void* pData, bool is_protected); +void +anv_cmd_write_buffer_cp(VkCommandBuffer cmd_buffer, + VkDeviceAddress dstAddr, + void *data, + uint32_t size); VkResult anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index ee049fef7c8..f82d8a92ffd 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -6692,3 +6692,27 @@ genX(CmdWriteBufferMarker2AMD)(VkCommandBuffer commandBuffer, trace_intel_end_write_buffer_marker(&cmd_buffer->trace); } + +void +genX(cmd_write_buffer_cp)(struct anv_cmd_buffer *cmd_buffer, + VkDeviceAddress dstAddr, + void *data, + uint32_t size) +{ + assert(size % 4 == 0); + struct anv_address addr = anv_address_from_u64(dstAddr); + + struct mi_builder b; + mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + + for (uint32_t i = 0; i < size; i += 8) { + mi_builder_set_write_check(&b, i >= size - 8); + if (size - i < 8) { + mi_store(&b, mi_mem32(anv_address_add(addr, i)), + mi_imm(*((uint32_t *)((char*)data + i)))); + } else { + mi_store(&b, mi_mem64(anv_address_add(addr, i)), + mi_imm(*((uint64_t *)((char*)data + i)))); + } + } +}