From e945b89480a213080f38988c59ee3ac4352f4780 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Sun, 30 Aug 2020 17:43:53 +0530 Subject: [PATCH] Add implementation for libresoc_CreatePipelineCache(). At this commit test fails at libresoc_GetDeviceQueue() which is yet to be implemented. --- src/libre-soc/vulkan/libresoc_debug.h | 82 +++++++++++++++++++++ src/libre-soc/vulkan/libresoc_device.c | 47 ++++++++++++- src/libre-soc/vulkan/libresoc_private.h | 94 ++++++++++++++++++++++++- src/libre-soc/vulkan/meson.build | 1 + 4 files changed, 218 insertions(+), 6 deletions(-) create mode 100644 src/libre-soc/vulkan/libresoc_debug.h diff --git a/src/libre-soc/vulkan/libresoc_debug.h b/src/libre-soc/vulkan/libresoc_debug.h new file mode 100644 index 00000000000..444b10dbb91 --- /dev/null +++ b/src/libre-soc/vulkan/libresoc_debug.h @@ -0,0 +1,82 @@ +/* + * Copyright © 2017 Google. + * + * 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 LIBRESOC_DEBUG_H +#define LIBRESOC_DEBUG_H + +#include "libresoc_private.h" + +/* Please keep docs/envvars.rst up-to-date when you add/remove options. */ +enum { + LIBRESOC_DEBUG_NO_FAST_CLEARS = 1 << 0, + LIBRESOC_DEBUG_NO_DCC = 1 << 1, + LIBRESOC_DEBUG_DUMP_SHADERS = 1 << 2, + LIBRESOC_DEBUG_NO_CACHE = 1 << 3, + LIBRESOC_DEBUG_DUMP_SHADER_STATS = 1 << 4, + LIBRESOC_DEBUG_NO_HIZ = 1 << 5, + LIBRESOC_DEBUG_NO_COMPUTE_QUEUE = 1 << 6, + LIBRESOC_DEBUG_ALL_BOS = 1 << 7, + LIBRESOC_DEBUG_NO_IBS = 1 << 8, + LIBRESOC_DEBUG_DUMP_SPIRV = 1 << 9, + LIBRESOC_DEBUG_VM_FAULTS = 1 << 10, + LIBRESOC_DEBUG_ZERO_VRAM = 1 << 11, + LIBRESOC_DEBUG_SYNC_SHADERS = 1 << 12, + LIBRESOC_DEBUG_PREOPTIR = 1 << 13, + LIBRESOC_DEBUG_NO_DYNAMIC_BOUNDS = 1 << 14, + LIBRESOC_DEBUG_NO_OUT_OF_ORDER = 1 << 15, + LIBRESOC_DEBUG_INFO = 1 << 16, + LIBRESOC_DEBUG_ERRORS = 1 << 17, + LIBRESOC_DEBUG_STARTUP = 1 << 18, + LIBRESOC_DEBUG_CHECKIR = 1 << 19, + LIBRESOC_DEBUG_NOTHREADLLVM = 1 << 20, + LIBRESOC_DEBUG_NOBINNING = 1 << 21, + LIBRESOC_DEBUG_NO_NGG = 1 << 22, + LIBRESOC_DEBUG_ALL_ENTRYPOINTS = 1 << 23, + LIBRESOC_DEBUG_DUMP_META_SHADERS = 1 << 24, + LIBRESOC_DEBUG_NO_MEMORY_CACHE = 1 << 25, + LIBRESOC_DEBUG_DISCARD_TO_DEMOTE = 1 << 26, + LIBRESOC_DEBUG_LLVM = 1 << 27, + LIBRESOC_DEBUG_FORCE_COMPRESS = 1 << 28, +}; + +enum { + LIBRESOC_PERFTEST_LOCAL_BOS = 1 << 0, + LIBRESOC_PERFTEST_DCC_MSAA = 1 << 1, + LIBRESOC_PERFTEST_BO_LIST = 1 << 2, + LIBRESOC_PERFTEST_TC_COMPAT_CMASK = 1 << 3, + LIBRESOC_PERFTEST_CS_WAVE_32 = 1 << 4, + LIBRESOC_PERFTEST_PS_WAVE_32 = 1 << 5, + LIBRESOC_PERFTEST_GE_WAVE_32 = 1 << 6, + LIBRESOC_PERFTEST_DFSM = 1 << 7, +}; + +bool +libresoc_init_trace(struct libresoc_device *device); + +void +libresoc_print_spirv(const char *data, uint32_t size, FILE *fp); + +void +libresoc_dump_enabled_options(struct libresoc_device *device, FILE *f); + +#endif diff --git a/src/libre-soc/vulkan/libresoc_device.c b/src/libre-soc/vulkan/libresoc_device.c index d7290de6962..adf4c31c633 100644 --- a/src/libre-soc/vulkan/libresoc_device.c +++ b/src/libre-soc/vulkan/libresoc_device.c @@ -28,6 +28,7 @@ #include #include +#include "util/debug.h" #include "libresoc_private.h" #include "vk_util.h" #include "vk_alloc.h" @@ -80,6 +81,44 @@ static const VkAllocationCallbacks default_alloc = { .pfnFree = default_free_func, }; +static const struct debug_control libresoc_debug_options[] = { + {"nofastclears", LIBRESOC_DEBUG_NO_FAST_CLEARS}, + {"nodcc", LIBRESOC_DEBUG_NO_DCC}, + {"shaders", LIBRESOC_DEBUG_DUMP_SHADERS}, + {"nocache", LIBRESOC_DEBUG_NO_CACHE}, + {"shaderstats", LIBRESOC_DEBUG_DUMP_SHADER_STATS}, + {"nohiz", LIBRESOC_DEBUG_NO_HIZ}, + {"nocompute", LIBRESOC_DEBUG_NO_COMPUTE_QUEUE}, + {"allbos", LIBRESOC_DEBUG_ALL_BOS}, + {"noibs", LIBRESOC_DEBUG_NO_IBS}, + {"spirv", LIBRESOC_DEBUG_DUMP_SPIRV}, + {"vmfaults", LIBRESOC_DEBUG_VM_FAULTS}, + {"zerovram", LIBRESOC_DEBUG_ZERO_VRAM}, + {"syncshaders", LIBRESOC_DEBUG_SYNC_SHADERS}, + {"preoptir", LIBRESOC_DEBUG_PREOPTIR}, + {"nodynamicbounds", LIBRESOC_DEBUG_NO_DYNAMIC_BOUNDS}, + {"nooutoforder", LIBRESOC_DEBUG_NO_OUT_OF_ORDER}, + {"info", LIBRESOC_DEBUG_INFO}, + {"errors", LIBRESOC_DEBUG_ERRORS}, + {"startup", LIBRESOC_DEBUG_STARTUP}, + {"checkir", LIBRESOC_DEBUG_CHECKIR}, + {"nothreadllvm", LIBRESOC_DEBUG_NOTHREADLLVM}, + {"nobinning", LIBRESOC_DEBUG_NOBINNING}, + {"nongg", LIBRESOC_DEBUG_NO_NGG}, + {"allentrypoints", LIBRESOC_DEBUG_ALL_ENTRYPOINTS}, + {"metashaders", LIBRESOC_DEBUG_DUMP_META_SHADERS}, + {"nomemorycache", LIBRESOC_DEBUG_NO_MEMORY_CACHE}, + {"llvm", LIBRESOC_DEBUG_LLVM}, + {"forcecompress", LIBRESOC_DEBUG_FORCE_COMPRESS}, + {NULL, 0} +}; + +const char * +libresoc_get_debug_option_name(int id) +{ + assert(id < ARRAY_SIZE(libresoc_debug_options) - 1); + return libresoc_debug_options[id].string; +} VkResult libresoc_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -110,6 +149,8 @@ libresoc_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, instance->engineVersion = app->engineVersion; instance->apiVersion = app->apiVersion; } + instance->debug_flags = parse_debug_string(getenv("LIBRESOC_DEBUG"), + libresoc_debug_options); /*TODO : enable extensions*/ for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { int idx; @@ -460,15 +501,15 @@ libresoc_GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, *pProperties = (VkPhysicalDeviceProperties) { .apiVersion = libresoc_physical_device_api_version(pdevice), .driverVersion = vk_get_driver_version(), - .vendorID = 1, - .deviceID = 1, + .vendorID = 1, //TODO: some dummy value + .deviceID = 1, //TODO: dome dummay value .deviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, .limits = limits, .sparseProperties = {0}, }; strcpy(pProperties->deviceName, pdevice->name); -// memcpy(pProperties->pipelineCacheUUID, pdevice->cache_uuid, VK_UUID_SIZE); + memcpy(pProperties->pipelineCacheUUID, pdevice->cache_uuid, VK_UUID_SIZE); } static void libresoc_get_physical_device_queue_family_properties( diff --git a/src/libre-soc/vulkan/libresoc_private.h b/src/libre-soc/vulkan/libresoc_private.h index 1cb3b0519b4..1b3424f5a4b 100644 --- a/src/libre-soc/vulkan/libresoc_private.h +++ b/src/libre-soc/vulkan/libresoc_private.h @@ -35,19 +35,64 @@ #include #include +#include "vk_alloc.h" #include "vk_debug_report.h" #include "util/xmlconfig.h" +#include "compiler/shader_enums.h" #include "vk_object.h" #include "libresoc_entrypoints.h" #include "libresoc_extensions.h" #include "libresoc_constants.h" +#include "libresoc_debug.h" #define LIBRESOC_MAX_QUEUE_FAMILIES 1 struct libresoc_instance; +struct libresoc_device; +struct cache_entry; + +struct libresoc_pipeline_cache { + struct vk_object_base base; + struct libresoc_device * device; + pthread_mutex_t mutex; + VkPipelineCacheCreateFlags flags; + + uint32_t total_size; + uint32_t table_size; + uint32_t kernel_count; + struct cache_entry ** hash_table; + bool modified; + + VkAllocationCallbacks alloc; +}; + + +struct libresoc_shader_binary; +struct libresoc_shader_variant; +void +libresoc_pipeline_cache_init(struct libresoc_pipeline_cache *cache, + struct libresoc_device *device); +void +libresoc_pipeline_cache_finish(struct libresoc_pipeline_cache *cache); +bool +libresoc_pipeline_cache_load(struct libresoc_pipeline_cache *cache, + const void *data, size_t size); + +bool +libresoc_create_shader_variants_from_pipeline_cache(struct libresoc_device *device, + struct libresoc_pipeline_cache *cache, + const unsigned char *sha1, + struct libresoc_shader_variant **variants, + bool *found_in_application_cache); + +void +libresoc_pipeline_cache_insert_shaders(struct libresoc_device *device, + struct libresoc_pipeline_cache *cache, + const unsigned char *sha1, + struct libresoc_shader_variant **variants, + struct libresoc_shader_binary *const *binaries); struct libresoc_device { - VK_LOADER_DATA _loader_data; struct vk_device vk; VkAllocationCallbacks alloc; @@ -62,6 +107,8 @@ struct libresoc_device { struct radeon_cmdbuf *empty_cs[LIBRESOC_MAX_QUEUE_FAMILIES]; struct libresoc_physical_device *physical_device; + /* Backup in-memory cache to be used if the app doesn't provide one */ + struct libresoc_pipeline_cache * mem_cache; /* FIXME: stub */ }; @@ -76,6 +123,9 @@ struct libresoc_physical_device { struct libresoc_physical_device_dispatch_table dispatch; char name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE]; + uint8_t driver_uuid[VK_UUID_SIZE]; + uint8_t device_uuid[VK_UUID_SIZE]; + uint8_t cache_uuid[VK_UUID_SIZE]; /* FIXME: stub */ }; @@ -89,12 +139,12 @@ struct libresoc_app_info { struct libresoc_instance { struct vk_object_base base; - VK_LOADER_DATA _loader_data; VkAllocationCallbacks alloc; uint32_t apiVersion; + uint64_t debug_flags; char * engineName; uint32_t engineVersion; struct libresoc_app_info app_info; @@ -123,7 +173,6 @@ struct libresoc_queue { }; struct libresoc_cmd_buffer { - VK_LOADER_DATA _loader_data; struct libresoc_device *device; @@ -153,6 +202,9 @@ libresoc_device_entrypoint_is_enabled(int index, uint32_t core_version, void *libresoc_lookup_entrypoint(const char *name); +const char * +libresoc_get_debug_option_name(int id); + #define libresoc_printflike(a, b) __attribute__((__format__(__printf__, a, b))) VkResult __vk_errorf(struct libresoc_instance *instance, VkResult error, @@ -179,6 +231,20 @@ void libresoc_loge_v(const char *format, va_list va); return (__VkType) _obj; \ } +#define LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(__libresoc_type, __VkType) \ + \ + static inline struct __libresoc_type * \ + __libresoc_type ## _from_handle(__VkType _handle) \ + { \ + return (struct __libresoc_type *)(uintptr_t) _handle; \ + } \ + \ + static inline __VkType \ + __libresoc_type ## _to_handle(struct __libresoc_type *_obj) \ + { \ + return (__VkType)(uintptr_t) _obj; \ + } + #define LIBRESOC_FROM_HANDLE(__libresoc_type, __name, __handle) \ struct __libresoc_type *__name = __libresoc_type ## _from_handle(__handle) @@ -188,5 +254,27 @@ LIBRESOC_DEFINE_HANDLE_CASTS(libresoc_instance, VkInstance) LIBRESOC_DEFINE_HANDLE_CASTS(libresoc_physical_device, VkPhysicalDevice) LIBRESOC_DEFINE_HANDLE_CASTS(libresoc_queue, VkQueue) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_cmd_pool, VkCommandPool) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_buffer, VkBuffer) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_buffer_view, VkBufferView) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_descriptor_pool, VkDescriptorPool) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_descriptor_set, VkDescriptorSet) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_descriptor_set_layout, VkDescriptorSetLayout) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_descriptor_update_template, VkDescriptorUpdateTemplate) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_device_memory, VkDeviceMemory) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_fence, VkFence) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_event, VkEvent) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_framebuffer, VkFramebuffer) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_image, VkImage) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_image_view, VkImageView); +LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_pipeline_cache, VkPipelineCache) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_pipeline, VkPipeline) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_pipeline_layout, VkPipelineLayout) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_query_pool, VkQueryPool) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_render_pass, VkRenderPass) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_sampler, VkSampler) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_sampler_ycbcr_conversion, VkSamplerYcbcrConversion) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_shader_module, VkShaderModule) +//LIBRESOC_DEFINE_NONDISP_HANDLE_CASTS(libresoc_semaphore, VkSemaphore) #endif /* LIBRESOC_PRIVATE_H */ diff --git a/src/libre-soc/vulkan/meson.build b/src/libre-soc/vulkan/meson.build index b6cfaa58b6d..1c4e84314c8 100644 --- a/src/libre-soc/vulkan/meson.build +++ b/src/libre-soc/vulkan/meson.build @@ -84,6 +84,7 @@ libresoc_vk_format_table_c = custom_target( liblibresoc_files = files( 'libresoc_device.c', 'libresoc_pipeline.c', + 'libresoc_pipeline_cache.c', 'libresoc_util.c', ) -- 2.30.2