vk/cmd_queue: simplify gross struct duplication

+lavapipe fixups from konstantin

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41516>
This commit is contained in:
Mike Blumenkrantz 2026-05-12 13:27:47 -04:00 committed by Marge Bot
parent 5b40c77137
commit 9b7b28d7d5
4 changed files with 39 additions and 41 deletions

View file

@ -5,6 +5,7 @@
#include "lvp_acceleration_structure.h"
#include "lvp_entrypoints.h"
#include "lvp_private.h"
#include "radix_sort/radix_sort_u64.h"
#include "bvh/vk_bvh.h"
@ -105,19 +106,20 @@ lvp_write_buffer_cp(VkCommandBuffer cmdbuf, VkDeviceAddress addr,
{
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, cmdbuf);
struct lvp_cmd_write_buffer_cp *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct lvp_cmd_write_buffer_cp) + size);
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u) + sizeof(struct lvp_cmd_write_buffer_cp) + size);
if (!entry)
return;
entry->base.type = LVP_CMD_WRITE_BUFFER_CP;
entry->addr = addr;
entry->data = entry + 1;
entry->size = size;
entry->type = LVP_CMD_WRITE_BUFFER_CP;
memcpy(entry->data, data, size);
struct lvp_cmd_write_buffer_cp *cmd = (struct lvp_cmd_write_buffer_cp *)((uint8_t *)entry + offsetof(struct vk_cmd_queue_entry, u));
cmd->addr = addr;
cmd->data = cmd + 1;
cmd->size = size;
memcpy(cmd->data, data, size);
list_addtail(&entry->base.cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
list_addtail(&entry->cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
}
static void
@ -132,7 +134,7 @@ lvp_cmd_dispatch_unaligned(VkCommandBuffer cmdbuf, uint32_t invocations_x,
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, cmdbuf);
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct vk_cmd_queue_entry));
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u) + sizeof(struct vk_cmd_dispatch));
if (!entry)
return;
@ -151,17 +153,19 @@ lvp_cmd_fill_buffer_addr(VkCommandBuffer cmdbuf, VkDeviceAddress addr,
{
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, cmdbuf);
struct lvp_cmd_fill_buffer_addr *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct lvp_cmd_write_buffer_cp));
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u) + sizeof(struct lvp_cmd_fill_buffer_addr));
if (!entry)
return;
entry->base.type = LVP_CMD_FILL_BUFFER_ADDR;
entry->addr = addr;
entry->size = size;
entry->data = data;
entry->type = LVP_CMD_FILL_BUFFER_ADDR;
list_addtail(&entry->base.cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
struct lvp_cmd_fill_buffer_addr *cmd = (struct lvp_cmd_fill_buffer_addr *)((uint8_t *)entry + offsetof(struct vk_cmd_queue_entry, u));
cmd->addr = addr;
cmd->size = size;
cmd->data = data;
list_addtail(&entry->cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
}
static void
@ -170,23 +174,24 @@ lvp_enqueue_encode_as(VkCommandBuffer commandBuffer, const struct vk_acceleratio
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
VK_FROM_HANDLE(vk_acceleration_structure, dst, state->build_info->dstAccelerationStructure);
struct lvp_cmd_encode_as *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct lvp_cmd_encode_as));
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u) + sizeof(struct lvp_cmd_encode_as));
if (!entry)
return;
entry->base.type = LVP_CMD_ENCODE_AS;
entry->type = LVP_CMD_ENCODE_AS;
uint64_t intermediate_header_addr = state->build_info->scratchData.deviceAddress + state->scratch.header_offset;
uint64_t intermediate_bvh_addr = state->build_info->scratchData.deviceAddress + state->scratch.ir_offset;
entry->dst = dst;
entry->intermediate_as_addr = intermediate_bvh_addr;
entry->intermediate_header_addr = intermediate_header_addr;
entry->leaf_count = state->leaf_node_count;
entry->geometry_type = vk_get_as_geometry_type(state->build_info);
struct lvp_cmd_encode_as *cmd = (struct lvp_cmd_encode_as *)((uint8_t *)entry + offsetof(struct vk_cmd_queue_entry, u));
cmd->dst = dst;
cmd->intermediate_as_addr = intermediate_bvh_addr;
cmd->intermediate_header_addr = intermediate_header_addr;
cmd->leaf_count = state->leaf_node_count;
cmd->geometry_type = vk_get_as_geometry_type(state->build_info);
list_addtail(&entry->base.cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
list_addtail(&entry->cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
}
static uint32_t
@ -662,7 +667,7 @@ lvp_enqueue_save_state(VkCommandBuffer cmdbuf)
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, cmdbuf);
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct vk_cmd_queue_entry));
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u));
if (!entry)
return;
@ -677,7 +682,7 @@ lvp_enqueue_restore_state(VkCommandBuffer cmdbuf)
VK_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, cmdbuf);
struct vk_cmd_queue_entry *entry =
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, sizeof(struct vk_cmd_queue_entry));
linear_zalloc_child(cmd_buffer->vk.cmd_queue.ctx, offsetof(struct vk_cmd_queue_entry, u));
if (!entry)
return;

View file

@ -5193,7 +5193,8 @@ handle_trace_rays_indirect2(struct vk_cmd_queue_entry *cmd, struct rendering_sta
static void
handle_write_buffer_cp(struct vk_cmd_queue_entry *cmd, struct rendering_state *state)
{
struct lvp_cmd_write_buffer_cp *write = (struct lvp_cmd_write_buffer_cp *)cmd;
struct lvp_cmd_write_buffer_cp *write =
(struct lvp_cmd_write_buffer_cp *)((uint8_t *)cmd + offsetof(struct vk_cmd_queue_entry, u));
finish_fence(state);
@ -5229,7 +5230,8 @@ handle_dispatch_unaligned(struct vk_cmd_queue_entry *cmd, struct rendering_state
static void
handle_fill_buffer_addr(struct vk_cmd_queue_entry *cmd, struct rendering_state *state)
{
struct lvp_cmd_fill_buffer_addr *fill = (struct lvp_cmd_fill_buffer_addr *)cmd;
struct lvp_cmd_fill_buffer_addr *fill =
(struct lvp_cmd_fill_buffer_addr *)((uint8_t *)cmd + offsetof(struct vk_cmd_queue_entry, u));
finish_fence(state);
@ -5242,7 +5244,8 @@ handle_fill_buffer_addr(struct vk_cmd_queue_entry *cmd, struct rendering_state *
static void
handle_encode_as(struct vk_cmd_queue_entry *cmd, struct rendering_state *state)
{
struct lvp_cmd_encode_as *encode = (struct lvp_cmd_encode_as *)cmd;
struct lvp_cmd_encode_as *encode =
(struct lvp_cmd_encode_as *)((uint8_t *)cmd + offsetof(struct vk_cmd_queue_entry, u));
finish_fence(state);

View file

@ -824,14 +824,12 @@ size_t
lvp_ext_dgc_token_size(const struct lvp_indirect_command_layout_ext *elayout, const VkIndirectCommandsLayoutTokenEXT *token);
struct lvp_cmd_write_buffer_cp {
struct vk_cmd_queue_entry_base base;
VkDeviceAddress addr;
void *data;
uint32_t size;
};
struct lvp_cmd_fill_buffer_addr {
struct vk_cmd_queue_entry_base base;
VkDeviceAddress addr;
VkDeviceSize size;
uint32_t data;
@ -843,7 +841,6 @@ lvp_encode_as(struct vk_acceleration_structure *dst, VkDeviceAddress intermediat
VkGeometryTypeKHR geometry_type);
struct lvp_cmd_encode_as {
struct vk_cmd_queue_entry_base base;
struct vk_acceleration_structure *dst;
VkDeviceAddress intermediate_as_addr;
VkDeviceAddress intermediate_header_addr;

View file

@ -131,13 +131,6 @@ struct ${to_struct_name(c.name)} {
struct vk_cmd_queue_entry;
/* this ordering must match vk_cmd_queue_entry */
struct vk_cmd_queue_entry_base {
struct list_head cmd_link;
enum vk_cmd_type type;
};
/* this ordering must match vk_cmd_queue_entry_base */
struct vk_cmd_queue_entry {
struct list_head cmd_link;
enum vk_cmd_type type;
@ -251,7 +244,7 @@ size_t vk_cmd_queue_type_sizes[] = {
% if len(c.params) > 1:
sizeof(struct ${to_struct_name(c.name)}) +
% endif
sizeof(struct vk_cmd_queue_entry_base),
offsetof(struct vk_cmd_queue_entry, u),
% if c.guard is not None:
#endif // ${c.guard}
% endif