From 42e3d580cc75b1bd86a57ed364d802bcaf00714c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 8 Apr 2024 10:58:59 -0400 Subject: [PATCH] lavapipe: split out DGC into separate file Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 122 --------------- .../lavapipe/lvp_device_generated_commands.c | 146 ++++++++++++++++++ src/gallium/frontends/lavapipe/meson.build | 1 + 3 files changed, 147 insertions(+), 122 deletions(-) create mode 100644 src/gallium/frontends/lavapipe/lvp_device_generated_commands.c diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index e1276926ab3..b912dd5ab8a 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -2474,128 +2474,6 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPrivateData( privateDataSlot, pData); } -VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateIndirectCommandsLayoutNV( - VkDevice _device, - const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkIndirectCommandsLayoutNV* pIndirectCommandsLayout) -{ - LVP_FROM_HANDLE(lvp_device, device, _device); - struct lvp_indirect_command_layout *dlayout; - - size_t size = sizeof(*dlayout) + pCreateInfo->tokenCount * sizeof(VkIndirectCommandsLayoutTokenNV); - - dlayout = - vk_zalloc2(&device->vk.alloc, pAllocator, size, alignof(struct lvp_indirect_command_layout), - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (!dlayout) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - vk_object_base_init(&device->vk, &dlayout->base, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV); - - dlayout->stream_count = pCreateInfo->streamCount; - dlayout->token_count = pCreateInfo->tokenCount; - for (unsigned i = 0; i < pCreateInfo->streamCount; i++) - dlayout->stream_strides[i] = pCreateInfo->pStreamStrides[i]; - typed_memcpy(dlayout->tokens, pCreateInfo->pTokens, pCreateInfo->tokenCount); - - *pIndirectCommandsLayout = lvp_indirect_command_layout_to_handle(dlayout); - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL lvp_DestroyIndirectCommandsLayoutNV( - VkDevice _device, - VkIndirectCommandsLayoutNV indirectCommandsLayout, - const VkAllocationCallbacks* pAllocator) -{ - LVP_FROM_HANDLE(lvp_device, device, _device); - VK_FROM_HANDLE(lvp_indirect_command_layout, layout, indirectCommandsLayout); - - if (!layout) - return; - - vk_object_base_finish(&layout->base); - vk_free2(&device->vk.alloc, pAllocator, layout); -} - -enum vk_cmd_type -lvp_nv_dgc_token_to_cmd_type(const VkIndirectCommandsLayoutTokenNV *token) -{ - switch (token->tokenType) { - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV: - return VK_CMD_BIND_PIPELINE_SHADER_GROUP_NV; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV: - if (token->indirectStateFlags & VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV) { - return VK_CMD_SET_FRONT_FACE; - } - assert(!"unknown token type!"); - break; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: - return VK_CMD_PUSH_CONSTANTS2_KHR; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV: - return VK_CMD_BIND_INDEX_BUFFER; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV: - return VK_CMD_BIND_VERTEX_BUFFERS2; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV: - return VK_CMD_DRAW_INDEXED_INDIRECT; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV: - return VK_CMD_DRAW_INDIRECT; - // only available if VK_EXT_mesh_shader is supported - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV: - return VK_CMD_DRAW_MESH_TASKS_INDIRECT_EXT; - // only available if VK_NV_mesh_shader is supported - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV: - unreachable("NV_mesh_shader unsupported!"); - default: - unreachable("unknown token type"); - } - return UINT32_MAX; -} - -VKAPI_ATTR void VKAPI_CALL lvp_GetGeneratedCommandsMemoryRequirementsNV( - VkDevice device, - const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, - VkMemoryRequirements2* pMemoryRequirements) -{ - VK_FROM_HANDLE(lvp_indirect_command_layout, dlayout, pInfo->indirectCommandsLayout); - - size_t size = sizeof(struct list_head); - - for (unsigned i = 0; i < dlayout->token_count; i++) { - const VkIndirectCommandsLayoutTokenNV *token = &dlayout->tokens[i]; - UNUSED struct vk_cmd_queue_entry *cmd; - enum vk_cmd_type type = lvp_nv_dgc_token_to_cmd_type(token); - size += vk_cmd_queue_type_sizes[type]; - - switch (token->tokenType) { - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV: - size += sizeof(*cmd->u.bind_vertex_buffers.buffers); - size += sizeof(*cmd->u.bind_vertex_buffers.offsets); - size += sizeof(*cmd->u.bind_vertex_buffers2.sizes) + sizeof(*cmd->u.bind_vertex_buffers2.strides); - break; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: - size += token->pushconstantSize + sizeof(VkPushConstantsInfoKHR); - break; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV: - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV: - break; - default: - unreachable("unknown type!"); - } - } - - size *= pInfo->maxSequencesCount; - - pMemoryRequirements->memoryRequirements.memoryTypeBits = 1; - pMemoryRequirements->memoryRequirements.alignment = 4; - pMemoryRequirements->memoryRequirements.size = align(size, pMemoryRequirements->memoryRequirements.alignment); -} - VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceExternalFenceProperties( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo *pExternalFenceInfo, diff --git a/src/gallium/frontends/lavapipe/lvp_device_generated_commands.c b/src/gallium/frontends/lavapipe/lvp_device_generated_commands.c new file mode 100644 index 00000000000..08189d11bff --- /dev/null +++ b/src/gallium/frontends/lavapipe/lvp_device_generated_commands.c @@ -0,0 +1,146 @@ +/* + * Copyright © 2023 Valve Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "lvp_private.h" + +VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateIndirectCommandsLayoutNV( + VkDevice _device, + const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkIndirectCommandsLayoutNV* pIndirectCommandsLayout) +{ + LVP_FROM_HANDLE(lvp_device, device, _device); + struct lvp_indirect_command_layout *dlayout; + + size_t size = sizeof(*dlayout) + pCreateInfo->tokenCount * sizeof(VkIndirectCommandsLayoutTokenNV); + + dlayout = + vk_zalloc2(&device->vk.alloc, pAllocator, size, alignof(struct lvp_indirect_command_layout), + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!dlayout) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + vk_object_base_init(&device->vk, &dlayout->base, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV); + + dlayout->stream_count = pCreateInfo->streamCount; + dlayout->token_count = pCreateInfo->tokenCount; + for (unsigned i = 0; i < pCreateInfo->streamCount; i++) + dlayout->stream_strides[i] = pCreateInfo->pStreamStrides[i]; + typed_memcpy(dlayout->tokens, pCreateInfo->pTokens, pCreateInfo->tokenCount); + + *pIndirectCommandsLayout = lvp_indirect_command_layout_to_handle(dlayout); + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL lvp_DestroyIndirectCommandsLayoutNV( + VkDevice _device, + VkIndirectCommandsLayoutNV indirectCommandsLayout, + const VkAllocationCallbacks* pAllocator) +{ + LVP_FROM_HANDLE(lvp_device, device, _device); + VK_FROM_HANDLE(lvp_indirect_command_layout, layout, indirectCommandsLayout); + + if (!layout) + return; + + vk_object_base_finish(&layout->base); + vk_free2(&device->vk.alloc, pAllocator, layout); +} + +enum vk_cmd_type +lvp_nv_dgc_token_to_cmd_type(const VkIndirectCommandsLayoutTokenNV *token) +{ + switch (token->tokenType) { + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV: + return VK_CMD_BIND_PIPELINE_SHADER_GROUP_NV; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV: + if (token->indirectStateFlags & VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV) { + return VK_CMD_SET_FRONT_FACE; + } + assert(!"unknown token type!"); + break; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: + return VK_CMD_PUSH_CONSTANTS2_KHR; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV: + return VK_CMD_BIND_INDEX_BUFFER; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV: + return VK_CMD_BIND_VERTEX_BUFFERS2; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV: + return VK_CMD_DRAW_INDEXED_INDIRECT; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV: + return VK_CMD_DRAW_INDIRECT; + // only available if VK_EXT_mesh_shader is supported + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV: + return VK_CMD_DRAW_MESH_TASKS_INDIRECT_EXT; + // only available if VK_NV_mesh_shader is supported + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV: + unreachable("NV_mesh_shader unsupported!"); + default: + unreachable("unknown token type"); + } + return UINT32_MAX; +} + +VKAPI_ATTR void VKAPI_CALL lvp_GetGeneratedCommandsMemoryRequirementsNV( + VkDevice device, + const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, + VkMemoryRequirements2* pMemoryRequirements) +{ + VK_FROM_HANDLE(lvp_indirect_command_layout, dlayout, pInfo->indirectCommandsLayout); + + size_t size = sizeof(struct list_head); + + for (unsigned i = 0; i < dlayout->token_count; i++) { + const VkIndirectCommandsLayoutTokenNV *token = &dlayout->tokens[i]; + UNUSED struct vk_cmd_queue_entry *cmd; + enum vk_cmd_type type = lvp_nv_dgc_token_to_cmd_type(token); + size += vk_cmd_queue_type_sizes[type]; + + switch (token->tokenType) { + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV: + size += sizeof(*cmd->u.bind_vertex_buffers.buffers); + size += sizeof(*cmd->u.bind_vertex_buffers.offsets); + size += sizeof(*cmd->u.bind_vertex_buffers2.sizes) + sizeof(*cmd->u.bind_vertex_buffers2.strides); + break; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: + size += token->pushconstantSize + sizeof(VkPushConstantsInfoKHR); + break; + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV: + break; + default: + unreachable("unknown type!"); + } + } + + size *= pInfo->maxSequencesCount; + + pMemoryRequirements->memoryRequirements.memoryTypeBits = 1; + pMemoryRequirements->memoryRequirements.alignment = 4; + pMemoryRequirements->memoryRequirements.size = align(size, pMemoryRequirements->memoryRequirements.alignment); +} diff --git a/src/gallium/frontends/lavapipe/meson.build b/src/gallium/frontends/lavapipe/meson.build index 9014efd1b3e..3f97788d3f4 100644 --- a/src/gallium/frontends/lavapipe/meson.build +++ b/src/gallium/frontends/lavapipe/meson.build @@ -14,6 +14,7 @@ lvp_entrypoints = custom_target( liblvp_files = files( 'lvp_acceleration_structure.c', 'lvp_device.c', + 'lvp_device_generated_commands.c', 'lvp_cmd_buffer.c', 'lvp_descriptor_set.c', 'lvp_execute.c',