X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fvulkan%2Fanv_device.c;h=8e2ed9eac45ad51f522c43e5245f8ce5e889a8be;hb=5c98d3825ccbed9054a1bb2de607116b2b31d48b;hp=b13d6e0423d710264e02e0ca9df7d11c59015bb3;hpb=bc9319583a98d65deeb78de0e475313a96ec3b57;p=mesa.git diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index b13d6e0423d..8e2ed9eac45 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -64,10 +64,11 @@ anv_compute_heap_size(int fd, uint64_t *heap_size) /* If, for whatever reason, we can't actually get the GTT size from the * kernel (too old?) fall back to the aperture size. */ - anv_perf_warn("Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m"); + anv_perf_warn(NULL, NULL, + "Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m"); if (anv_gem_get_aperture(fd, >t_size) == -1) { - return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + return vk_errorf(NULL, NULL, VK_ERROR_INITIALIZATION_FAILED, "failed to get aperture size: %m"); } } @@ -207,15 +208,18 @@ anv_physical_device_init_heaps(struct anv_physical_device *device, int fd) static VkResult anv_physical_device_init_uuids(struct anv_physical_device *device) { - const struct build_id_note *note = build_id_find_nhdr("libvulkan_intel.so"); + const struct build_id_note *note = + build_id_find_nhdr_for_addr(anv_physical_device_init_uuids); if (!note) { - return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + return vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "Failed to find build-id"); } unsigned build_id_len = build_id_length(note); if (build_id_len < 20) { - return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + return vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "build-id too short. It needs to be a SHA"); } @@ -265,6 +269,8 @@ anv_physical_device_init(struct anv_physical_device *device, VkResult result; int fd; + brw_process_intel_debug_variable(); + fd = open(path, O_RDWR | O_CLOEXEC); if (fd < 0) return vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); @@ -297,7 +303,8 @@ anv_physical_device_init(struct anv_physical_device *device, /* Broadwell, Cherryview, Skylake, Broxton, Kabylake is as fully * supported as anything */ } else { - result = vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER, + result = vk_errorf(device->instance, device, + VK_ERROR_INCOMPATIBLE_DRIVER, "Vulkan not yet supported on %s", device->name); goto fail; } @@ -307,27 +314,31 @@ anv_physical_device_init(struct anv_physical_device *device, device->cmd_parser_version = anv_gem_get_param(fd, I915_PARAM_CMD_PARSER_VERSION); if (device->cmd_parser_version == -1) { - result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + result = vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "failed to get command parser version"); goto fail; } } if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT)) { - result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + result = vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "kernel missing gem wait"); goto fail; } if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2)) { - result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + result = vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "kernel missing execbuf2"); goto fail; } if (!device->info.has_llc && anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION) < 1) { - result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + result = vk_errorf(device->instance, device, + VK_ERROR_INITIALIZATION_FAILED, "kernel missing wc mmap"); goto fail; } @@ -337,6 +348,10 @@ anv_physical_device_init(struct anv_physical_device *device, goto fail; device->has_exec_async = anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC); + device->has_exec_fence = anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE); + device->has_syncobj = anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY); + device->has_syncobj_wait = device->has_syncobj && + anv_gem_supports_syncobj_wait(fd); bool swizzled = anv_gem_get_bit6_swizzle(fd, I915_TILING_X); @@ -368,8 +383,6 @@ anv_physical_device_init(struct anv_physical_device *device, device->info.max_cs_threads = max_cs_threads; } - brw_process_intel_debug_variable(); - device->compiler = brw_compiler_create(NULL, &device->info); if (device->compiler == NULL) { result = vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); @@ -406,98 +419,6 @@ anv_physical_device_finish(struct anv_physical_device *device) close(device->local_fd); } -static const VkExtensionProperties global_extensions[] = { - { - .extensionName = VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_SURFACE_EXTENSION_NAME, - .specVersion = 25, - }, -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - { - .extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, - .specVersion = 6, - }, -#endif -#ifdef VK_USE_PLATFORM_XCB_KHR - { - .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME, - .specVersion = 6, - }, -#endif -#ifdef VK_USE_PLATFORM_XLIB_KHR - { - .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME, - .specVersion = 6, - }, -#endif -}; - -static const VkExtensionProperties device_extensions[] = { - { - .extensionName = VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_MAINTENANCE1_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, - .specVersion = 1, - }, - { - .extensionName = VK_KHR_SWAPCHAIN_EXTENSION_NAME, - .specVersion = 68, - }, - { - .extensionName = VK_KHX_MULTIVIEW_EXTENSION_NAME, - .specVersion = 1, - }, -}; - static void * default_alloc_func(void *pUserData, size_t size, size_t align, VkSystemAllocationScope allocationScope) @@ -534,6 +455,13 @@ VkResult anv_CreateInstance( assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); + /* Check if user passed a debug report callback to be used during + * Create/Destroy of instance. + */ + const VkDebugReportCallbackCreateInfoEXT *ctor_cb = + vk_find_struct_const(pCreateInfo->pNext, + DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT); + uint32_t client_version; if (pCreateInfo->pApplicationInfo && pCreateInfo->pApplicationInfo->apiVersion != 0) { @@ -544,7 +472,18 @@ VkResult anv_CreateInstance( if (VK_MAKE_VERSION(1, 0, 0) > client_version || client_version > VK_MAKE_VERSION(1, 0, 0xfff)) { - return vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER, + + if (ctor_cb && ctor_cb->flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) + ctor_cb->pfnCallback(VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, + VK_NULL_HANDLE, /* No handle available yet. */ + __LINE__, + 0, + "anv", + "incompatible driver version", + ctor_cb->pUserData); + + return vk_errorf(NULL, NULL, VK_ERROR_INCOMPATIBLE_DRIVER, "Client requested version %d.%d.%d", VK_VERSION_MAJOR(client_version), VK_VERSION_MINOR(client_version), @@ -552,15 +491,8 @@ VkResult anv_CreateInstance( } for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { - bool found = false; - for (uint32_t j = 0; j < ARRAY_SIZE(global_extensions); j++) { - if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], - global_extensions[j].extensionName) == 0) { - found = true; - break; - } - } - if (!found) + const char *ext_name = pCreateInfo->ppEnabledExtensionNames[i]; + if (!anv_instance_extension_supported(ext_name)) return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT); } @@ -579,6 +511,20 @@ VkResult anv_CreateInstance( instance->apiVersion = client_version; instance->physicalDeviceCount = -1; + if (pthread_mutex_init(&instance->callbacks_mutex, NULL) != 0) { + vk_free2(&default_alloc, pAllocator, instance); + return vk_error(VK_ERROR_INITIALIZATION_FAILED); + } + + list_inithead(&instance->callbacks); + + /* Store report debug callback to be used during DestroyInstance. */ + if (ctor_cb) { + instance->destroy_debug_cb.flags = ctor_cb->flags; + instance->destroy_debug_cb.callback = ctor_cb->pfnCallback; + instance->destroy_debug_cb.data = ctor_cb->pUserData; + } + _mesa_locale_init(); VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false)); @@ -605,6 +551,8 @@ void anv_DestroyInstance( VG(VALGRIND_DESTROY_MEMPOOL(instance)); + pthread_mutex_destroy(&instance->callbacks_mutex); + _mesa_locale_fini(); vk_free(&instance->alloc, instance); @@ -748,6 +696,13 @@ void anv_GetPhysicalDeviceFeatures2KHR( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR: { + VkPhysicalDeviceVariablePointerFeaturesKHR *features = (void *)ext; + features->variablePointersStorageBuffer = true; + features->variablePointers = false; + break; + } + default: anv_debug_ignored_stype(ext->sType); break; @@ -886,7 +841,7 @@ void anv_GetPhysicalDeviceProperties( }; *pProperties = (VkPhysicalDeviceProperties) { - .apiVersion = VK_MAKE_VERSION(1, 0, 54), + .apiVersion = anv_physical_device_api_version(pdevice), .driverVersion = vk_get_driver_version(), .vendorID = 0x8086, .deviceID = pdevice->chipset_id, @@ -1106,6 +1061,32 @@ anv_device_init_border_colors(struct anv_device *device) border_colors); } +static void +anv_device_init_trivial_batch(struct anv_device *device) +{ + anv_bo_init_new(&device->trivial_batch_bo, device, 4096); + + if (device->instance->physicalDevice.has_exec_async) + device->trivial_batch_bo.flags |= EXEC_OBJECT_ASYNC; + + void *map = anv_gem_mmap(device, device->trivial_batch_bo.gem_handle, + 0, 4096, 0); + + struct anv_batch batch = { + .start = map, + .next = map, + .end = map + 4096, + }; + + anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END, bbe); + anv_batch_emit(&batch, GEN7_MI_NOOP, noop); + + if (!device->info.has_llc) + gen_clflush_range(map, batch.next - map); + + anv_gem_munmap(map, device->trivial_batch_bo.size); +} + VkResult anv_CreateDevice( VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, @@ -1119,15 +1100,8 @@ VkResult anv_CreateDevice( assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO); for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { - bool found = false; - for (uint32_t j = 0; j < ARRAY_SIZE(device_extensions); j++) { - if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], - device_extensions[j].extensionName) == 0) { - found = true; - break; - } - } - if (!found) + const char *ext_name = pCreateInfo->ppEnabledExtensionNames[i]; + if (!anv_physical_device_extension_supported(physical_device, ext_name)) return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT); } @@ -1230,6 +1204,8 @@ VkResult anv_CreateDevice( if (result != VK_SUCCESS) goto fail_surface_state_pool; + anv_device_init_trivial_batch(device); + anv_scratch_pool_init(device, &device->scratch_pool); anv_queue_init(device, &device->queue); @@ -1319,6 +1295,8 @@ void anv_DestroyDevice( anv_gem_munmap(device->workaround_bo.map, device->workaround_bo.size); anv_gem_close(device, device->workaround_bo.gem_handle); + anv_gem_close(device, device->trivial_batch_bo.gem_handle); + anv_state_pool_finish(&device->surface_state_pool); anv_state_pool_finish(&device->instruction_state_pool); anv_state_pool_finish(&device->dynamic_state_pool); @@ -1337,45 +1315,6 @@ void anv_DestroyDevice( vk_free(&device->alloc, device); } -VkResult anv_EnumerateInstanceExtensionProperties( - const char* pLayerName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) -{ - if (pProperties == NULL) { - *pPropertyCount = ARRAY_SIZE(global_extensions); - return VK_SUCCESS; - } - - *pPropertyCount = MIN2(*pPropertyCount, ARRAY_SIZE(global_extensions)); - typed_memcpy(pProperties, global_extensions, *pPropertyCount); - - if (*pPropertyCount < ARRAY_SIZE(global_extensions)) - return VK_INCOMPLETE; - - return VK_SUCCESS; -} - -VkResult anv_EnumerateDeviceExtensionProperties( - VkPhysicalDevice physicalDevice, - const char* pLayerName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) -{ - if (pProperties == NULL) { - *pPropertyCount = ARRAY_SIZE(device_extensions); - return VK_SUCCESS; - } - - *pPropertyCount = MIN2(*pPropertyCount, ARRAY_SIZE(device_extensions)); - typed_memcpy(pProperties, device_extensions, *pPropertyCount); - - if (*pPropertyCount < ARRAY_SIZE(device_extensions)) - return VK_INCOMPLETE; - - return VK_SUCCESS; -} - VkResult anv_EnumerateInstanceLayerProperties( uint32_t* pPropertyCount, VkLayerProperties* pProperties) @@ -1431,16 +1370,17 @@ anv_device_query_status(struct anv_device *device) if (ret == -1) { /* We don't know the real error. */ device->lost = true; - return vk_errorf(VK_ERROR_DEVICE_LOST, "get_reset_stats failed: %m"); + return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST, + "get_reset_stats failed: %m"); } if (active) { device->lost = true; - return vk_errorf(VK_ERROR_DEVICE_LOST, + return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST, "GPU hung on one of our command buffers"); } else if (pending) { device->lost = true; - return vk_errorf(VK_ERROR_DEVICE_LOST, + return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST, "GPU hung with commands in-flight"); } @@ -1460,7 +1400,8 @@ anv_device_bo_busy(struct anv_device *device, struct anv_bo *bo) } else if (ret == -1) { /* We don't know the real error. */ device->lost = true; - return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m"); + return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST, + "gem wait failed: %m"); } /* Query for device status after the busy call. If the BO we're checking @@ -1482,7 +1423,8 @@ anv_device_wait(struct anv_device *device, struct anv_bo *bo, } else if (ret == -1) { /* We don't know the real error. */ device->lost = true; - return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m"); + return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST, + "gem wait failed: %m"); } /* Query for device status after the wait. If the BO we're waiting on got