From 5f30a7538befb00e7989e42ba8304891d6cf5165 Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Sat, 16 Jul 2022 23:42:09 +0200 Subject: [PATCH] vulkan: Add RMV token definitions Part-of: --- src/vulkan/util/meson.build | 1 + src/vulkan/util/rmv/vk_rmv_tokens.h | 295 ++++++++++++++++++++++++++++ 2 files changed, 296 insertions(+) create mode 100644 src/vulkan/util/rmv/vk_rmv_tokens.h diff --git a/src/vulkan/util/meson.build b/src/vulkan/util/meson.build index 8f232fa02e9..44f8bc8e645 100644 --- a/src/vulkan/util/meson.build +++ b/src/vulkan/util/meson.build @@ -54,6 +54,7 @@ vk_cmd_queue_gen = files('vk_cmd_queue_gen.py') vk_dispatch_trampolines_gen = files('vk_dispatch_trampolines_gen.py') files_vulkan_util = files( + 'rmv/vk_rmv_tokens.h', 'vk_alloc.c', 'vk_alloc.h', 'vk_format.c', diff --git a/src/vulkan/util/rmv/vk_rmv_tokens.h b/src/vulkan/util/rmv/vk_rmv_tokens.h new file mode 100644 index 00000000000..2a1f443525d --- /dev/null +++ b/src/vulkan/util/rmv/vk_rmv_tokens.h @@ -0,0 +1,295 @@ +/* + * Copyright © 2022 Friedrich Vock + * + * 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. + */ + +#ifndef VK_RMV_TOKENS_H +#define VK_RMV_TOKENS_H + +#include +#include +#include "util/os_time.h" +#include + +/* + * Implemented types of tokens. + */ +enum vk_rmv_token_type { + VK_RMV_TOKEN_TYPE_USERDATA, + VK_RMV_TOKEN_TYPE_MISC, + VK_RMV_TOKEN_TYPE_RESOURCE_BIND, + VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE, + VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE, + VK_RMV_TOKEN_TYPE_CPU_MAP, + VK_RMV_TOKEN_TYPE_VIRTUAL_FREE, + VK_RMV_TOKEN_TYPE_VIRTUAL_ALLOCATE, + VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, + VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY +}; + +/* + * The type of miscellaneous event reported through a MISC token. + */ +enum vk_rmv_misc_event_type { + VK_RMV_MISC_EVENT_TYPE_SUBMIT_GRAPHICS, + VK_RMV_MISC_EVENT_TYPE_SUBMIT_COMPUTE, + VK_RMV_MISC_EVENT_TYPE_SUBMIT_COPY, + VK_RMV_MISC_EVENT_TYPE_PRESENT, + VK_RMV_MISC_EVENT_TYPE_INVALIDATE_RANGES, + VK_RMV_MISC_EVENT_TYPE_FLUSH_MAPPED_RANGE, + VK_RMV_MISC_EVENT_TYPE_TRIM_MEMORY +}; + +enum vk_rmv_resource_type { + VK_RMV_RESOURCE_TYPE_IMAGE, + VK_RMV_RESOURCE_TYPE_BUFFER, + VK_RMV_RESOURCE_TYPE_GPU_EVENT, + VK_RMV_RESOURCE_TYPE_BORDER_COLOR_PALETTE, + VK_RMV_RESOURCE_TYPE_INDIRECT_CMD_GENERATOR, + VK_RMV_RESOURCE_TYPE_MOTION_ESTIMATOR, + VK_RMV_RESOURCE_TYPE_PERF_EXPERIMENT, + VK_RMV_RESOURCE_TYPE_QUERY_HEAP, + VK_RMV_RESOURCE_TYPE_VIDEO_DECODER, + VK_RMV_RESOURCE_TYPE_VIDEO_ENCODER, + VK_RMV_RESOURCE_TYPE_TIMESTAMP, + VK_RMV_RESOURCE_TYPE_HEAP, + VK_RMV_RESOURCE_TYPE_PIPELINE, + VK_RMV_RESOURCE_TYPE_DESCRIPTOR_HEAP, + VK_RMV_RESOURCE_TYPE_DESCRIPTOR_POOL, + VK_RMV_RESOURCE_TYPE_COMMAND_ALLOCATOR, + VK_RMV_RESOURCE_TYPE_MISC_INTERNAL +}; + +/* + * Token data for all types of tokens. + */ + +struct vk_rmv_timestamp_token { + uint64_t value; +}; + +struct vk_rmv_userdata_token { + char *name; + uint32_t resource_id; +}; + +struct vk_rmv_misc_token { + enum vk_rmv_misc_event_type type; +}; + +struct vk_rmv_resource_bind_token { + uint64_t address; + uint64_t size; + bool is_system_memory; + uint32_t resource_id; +}; + +struct vk_rmv_resource_reference_token { + uint64_t virtual_address; + bool residency_removed; +}; + +enum vk_rmv_page_table_update_type { + VK_RMV_PAGE_TABLE_UPDATE_TYPE_DISCARD, + VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE, + VK_RMV_PAGE_TABLE_UPDATE_TYPE_TRANSFER +}; + +struct vk_rmv_page_table_update_token { + uint64_t virtual_address; + uint64_t physical_address; + uint64_t page_count; + uint32_t page_size; + int pid; + bool is_unmap; + enum vk_rmv_page_table_update_type type; +}; + +struct vk_rmv_cpu_map_token { + uint64_t address; + bool unmapped; +}; + +struct vk_rmv_virtual_free_token { + uint64_t address; +}; + +enum vk_rmv_kernel_memory_domain { + VK_RMV_KERNEL_MEMORY_DOMAIN_CPU = 0x1, + VK_RMV_KERNEL_MEMORY_DOMAIN_GTT = 0x2, + VK_RMV_KERNEL_MEMORY_DOMAIN_VRAM = 0x4 +}; + +struct vk_rmv_virtual_allocate_token { + uint32_t page_count; + bool is_driver_internal; + bool is_in_invisible_vram; + uint64_t address; + enum vk_rmv_kernel_memory_domain preferred_domains; +}; + +struct vk_rmv_image_description { + VkImageCreateFlags create_flags; + VkImageUsageFlags usage_flags; + VkImageType type; + VkExtent3D extent; + VkFormat format; + uint32_t num_mips; + uint32_t num_slices; + VkImageTiling tiling; + + uint32_t log2_samples; + uint32_t log2_storage_samples; + + uint32_t alignment_log2; + uint32_t metadata_alignment_log2; + uint32_t image_alignment_log2; + + uint64_t size; + uint64_t metadata_size; + uint64_t metadata_header_size; + + uint64_t metadata_offset; + uint64_t metadata_header_offset; + + bool presentable; +}; + +struct vk_rmv_event_description { + VkEventCreateFlags flags; +}; + +struct vk_rmv_border_color_palette_description { + uint8_t num_entries; +}; + +struct vk_rmv_buffer_description { + VkBufferCreateFlags create_flags; + VkBufferUsageFlags usage_flags; + uint64_t size; +}; + +struct vk_rmv_query_pool_description { + VkQueryType type; + bool has_cpu_access; +}; + +/* The heap description refers to a VkDeviceMemory resource. */ +struct vk_rmv_heap_description { + VkMemoryAllocateFlags alloc_flags; + uint64_t size; + uint32_t alignment; + uint32_t heap_index; +}; + +struct vk_rmv_pipeline_description { + bool is_internal; + uint64_t hash_lo; + uint64_t hash_hi; + VkShaderStageFlags shader_stages; + bool is_ngg; +}; + +struct vk_rmv_descriptor_pool_description { + uint32_t max_sets; + uint32_t pool_size_count; + VkDescriptorPoolSize *pool_sizes; +}; + +struct vk_rmv_command_buffer_description { + enum vk_rmv_kernel_memory_domain preferred_domain; + uint64_t executable_size; + uint64_t app_available_executable_size; + uint64_t embedded_data_size; + uint64_t app_available_embedded_data_size; + uint64_t scratch_size; + uint64_t app_available_scratch_size; +}; + +struct vk_rmv_resource_create_token { + uint32_t resource_id; + bool is_driver_internal; + enum vk_rmv_resource_type type; + union { + struct vk_rmv_event_description event; + struct vk_rmv_border_color_palette_description border_color_palette; + struct vk_rmv_image_description image; + struct vk_rmv_buffer_description buffer; + struct vk_rmv_query_pool_description query_pool; + struct vk_rmv_heap_description heap; + struct vk_rmv_pipeline_description pipeline; + struct vk_rmv_descriptor_pool_description descriptor_pool; + struct vk_rmv_command_buffer_description command_buffer; + }; +}; + +struct vk_rmv_resource_destroy_token { + uint32_t resource_id; +}; + +struct vk_rmv_token { + enum vk_rmv_token_type type; + uint64_t timestamp; + union { + struct vk_rmv_timestamp_token timestamp; + struct vk_rmv_userdata_token userdata; + struct vk_rmv_misc_token misc; + struct vk_rmv_resource_bind_token resource_bind; + struct vk_rmv_resource_reference_token resource_reference; + struct vk_rmv_page_table_update_token page_table_update; + struct vk_rmv_cpu_map_token cpu_map; + struct vk_rmv_virtual_free_token virtual_free; + struct vk_rmv_virtual_allocate_token virtual_allocate; + struct vk_rmv_resource_create_token resource_create; + struct vk_rmv_resource_destroy_token resource_destroy; + } data; +}; + +static inline size_t +vk_rmv_token_size_from_type(enum vk_rmv_token_type type) +{ + switch (type) { + case VK_RMV_TOKEN_TYPE_USERDATA: + return sizeof(struct vk_rmv_userdata_token); + case VK_RMV_TOKEN_TYPE_MISC: + return sizeof(struct vk_rmv_misc_token); + case VK_RMV_TOKEN_TYPE_RESOURCE_BIND: + return sizeof(struct vk_rmv_resource_bind_token); + case VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE: + return sizeof(struct vk_rmv_resource_reference_token); + case VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE: + return sizeof(struct vk_rmv_page_table_update_token); + case VK_RMV_TOKEN_TYPE_CPU_MAP: + return sizeof(struct vk_rmv_cpu_map_token); + case VK_RMV_TOKEN_TYPE_VIRTUAL_FREE: + return sizeof(struct vk_rmv_virtual_free_token); + case VK_RMV_TOKEN_TYPE_VIRTUAL_ALLOCATE: + return sizeof(struct vk_rmv_virtual_allocate_token); + case VK_RMV_TOKEN_TYPE_RESOURCE_CREATE: + return sizeof(struct vk_rmv_resource_create_token); + case VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY: + return sizeof(struct vk_rmv_resource_destroy_token); + default: + unreachable("invalid token type"); + } +} + +#endif