diff --git a/src/gallium/frontends/lavapipe/lvp_acceleration_structure.c b/src/gallium/frontends/lavapipe/lvp_acceleration_structure.c index 03e70dad0e8..d24169ad0f7 100644 --- a/src/gallium/frontends/lavapipe/lvp_acceleration_structure.c +++ b/src/gallium/frontends/lavapipe/lvp_acceleration_structure.c @@ -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; diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 7d869532206..7308d3e47c3 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -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); diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index ec3b0c3c2a6..c87d54f2aa1 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -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; diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py index 6a581c3fb1a..922a8014ccb 100644 --- a/src/vulkan/util/vk_cmd_queue_gen.py +++ b/src/vulkan/util/vk_cmd_queue_gen.py @@ -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