#include "vk_deferred_operation.h"
#include "vk_drm_syncobj.h"
#include "common/intel_aux_map.h"
-#include "common/intel_defines.h"
#include "common/intel_uuid.h"
#include "perf/intel_perf.h"
+#include "i915/anv_device.h"
+
#include "genxml/gen7_pack.h"
#include "genxml/genX_bits.h"
}
static VkResult
-anv_i915_physical_device_get_parameters(struct anv_physical_device *device)
-{
- VkResult result = VK_SUCCESS;
- int val, fd = device->local_fd;
-
- if (!intel_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT, &val) || !val) {
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel missing gem wait");
- return result;
- }
-
- if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2, &val) || !val) {
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel missing execbuf2");
- return result;
- }
-
- if (!device->info.has_llc &&
- (!intel_gem_get_param(fd, I915_PARAM_MMAP_VERSION, &val) || val < 1)) {
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel missing wc mmap");
- return result;
- }
-
- if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &val) || !val) {
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel missing softpin");
- return result;
- }
-
- if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY, &val) || !val) {
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel missing syncobj support");
- return result;
- }
-
- if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC, &val))
- device->has_exec_async = val;
- if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE, &val))
- device->has_exec_capture = val;
-
- /* Start with medium; sorted low to high */
- const VkQueueGlobalPriorityKHR priorities[] = {
- VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR,
- VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR,
- VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR,
- VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR,
- };
- device->max_context_priority = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR;
- for (unsigned i = 0; i < ARRAY_SIZE(priorities); i++) {
- if (!anv_gem_has_context_priority(fd, priorities[i]))
- break;
- device->max_context_priority = priorities[i];
- }
-
- if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES, &val))
- device->has_exec_timeline = val;
-
- return result;
-}
-
-static VkResult
anv_physical_device_get_parameters(struct anv_physical_device *device)
{
return anv_i915_physical_device_get_parameters(device);
static VkResult anv_device_check_status(struct vk_device *vk_device);
-static VkResult
-anv_device_setup_context(struct anv_device *device,
- const VkDeviceCreateInfo *pCreateInfo,
- const uint32_t num_queues)
-{
- struct anv_physical_device *physical_device = device->physical;
- VkResult result = VK_SUCCESS;
-
- if (device->physical->engine_info) {
- /* The kernel API supports at most 64 engines */
- assert(num_queues <= 64);
- enum intel_engine_class engine_classes[64];
- int engine_count = 0;
- for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
- const VkDeviceQueueCreateInfo *queueCreateInfo =
- &pCreateInfo->pQueueCreateInfos[i];
-
- assert(queueCreateInfo->queueFamilyIndex <
- physical_device->queue.family_count);
- struct anv_queue_family *queue_family =
- &physical_device->queue.families[queueCreateInfo->queueFamilyIndex];
-
- for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++)
- engine_classes[engine_count++] = queue_family->engine_class;
- }
- if (!intel_gem_create_context_engines(device->fd,
- physical_device->engine_info,
- engine_count, engine_classes,
- (uint32_t *)&device->context_id))
- result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
- "kernel context creation failed");
- } else {
- assert(num_queues == 1);
- if (!intel_gem_create_context(device->fd, &device->context_id))
- result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
- }
-
- if (result != VK_SUCCESS)
- return result;
-
- /* Here we tell the kernel not to attempt to recover our context but
- * immediately (on the next batchbuffer submission) report that the
- * context is lost, and we will do the recovery ourselves. In the case
- * of Vulkan, recovery means throwing VK_ERROR_DEVICE_LOST and letting
- * the client clean up the pieces.
- */
- anv_gem_set_context_param(device->fd, device->context_id,
- I915_CONTEXT_PARAM_RECOVERABLE, false);
-
- /* Check if client specified queue priority. */
- const VkDeviceQueueGlobalPriorityCreateInfoKHR *queue_priority =
- vk_find_struct_const(pCreateInfo->pQueueCreateInfos[0].pNext,
- DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR);
-
- VkQueueGlobalPriorityKHR priority =
- queue_priority ? queue_priority->globalPriority :
- VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
-
- /* As per spec, the driver implementation may deny requests to acquire
- * a priority above the default priority (MEDIUM) if the caller does not
- * have sufficient privileges. In this scenario VK_ERROR_NOT_PERMITTED_KHR
- * is returned.
- */
- if (physical_device->max_context_priority >= VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) {
- int err = anv_gem_set_context_param(device->fd, device->context_id,
- I915_CONTEXT_PARAM_PRIORITY,
- priority);
- if (err != 0 && priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) {
- result = vk_error(device, VK_ERROR_NOT_PERMITTED_KHR);
- goto fail_context;
- }
- }
-
- return result;
-
-fail_context:
- intel_gem_destroy_context(device->fd, device->context_id);
- return result;
-}
-
VkResult anv_CreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
num_queues += pCreateInfo->pQueueCreateInfos[i].queueCount;
- result = anv_device_setup_context(device, pCreateInfo, num_queues);
+ result = anv_i915_device_setup_context(device, pCreateInfo, num_queues);
if (result != VK_SUCCESS)
goto fail_fd;
#include <fcntl.h>
#include "anv_private.h"
-#include "common/intel_defines.h"
#include "common/intel_gem.h"
/**
return ret;
}
-bool
-anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority)
-{
- return !anv_gem_set_context_param(fd, 0, I915_CONTEXT_PARAM_PRIORITY,
- priority);
-}
-
-static int
-vk_priority_to_i915(VkQueueGlobalPriorityKHR priority)
-{
- switch (priority) {
- case VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR:
- return INTEL_CONTEXT_LOW_PRIORITY;
- case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR:
- return INTEL_CONTEXT_MEDIUM_PRIORITY;
- case VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR:
- return INTEL_CONTEXT_HIGH_PRIORITY;
- case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR:
- return INTEL_CONTEXT_REALTIME_PRIORITY;
- default:
- unreachable("Invalid priority");
- }
-}
-
-int
-anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value)
-{
- if (param == I915_CONTEXT_PARAM_PRIORITY)
- value = vk_priority_to_i915(value);
-
- int err = 0;
- if (!intel_gem_set_context_param(fd, context, param, value))
- err = -errno;
- return err;
-}
-
int
anv_gem_context_get_reset_stats(int fd, int context,
uint32_t *active, uint32_t *pending)
}
int
-anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value)
-{
- unreachable("Unused");
-}
-
-bool
-anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority)
-{
- unreachable("Unused");
-}
-
-int
anv_gem_context_get_reset_stats(int fd, int context,
uint32_t *active, uint32_t *pending)
{
struct drm_i915_gem_execbuffer2 *execbuf);
int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle,
uint32_t stride, uint32_t tiling);
-bool anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority);
-int anv_gem_set_context_param(int fd, uint32_t context, uint32_t param,
- uint64_t value);
int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle);
int anv_gem_context_get_reset_stats(int fd, int context,
uint32_t *active, uint32_t *pending);
--- /dev/null
+/*
+ * Copyright © 2022 Intel 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 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 "i915/anv_device.h"
+#include "anv_private.h"
+
+#include "common/intel_defines.h"
+
+#include "drm-uapi/i915_drm.h"
+
+static int
+vk_priority_to_i915(VkQueueGlobalPriorityKHR priority)
+{
+ switch (priority) {
+ case VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR:
+ return INTEL_CONTEXT_LOW_PRIORITY;
+ case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR:
+ return INTEL_CONTEXT_MEDIUM_PRIORITY;
+ case VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR:
+ return INTEL_CONTEXT_HIGH_PRIORITY;
+ case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR:
+ return INTEL_CONTEXT_REALTIME_PRIORITY;
+ default:
+ unreachable("Invalid priority");
+ }
+}
+
+static int
+anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value)
+{
+ if (param == I915_CONTEXT_PARAM_PRIORITY)
+ value = vk_priority_to_i915(value);
+
+ int err = 0;
+ if (!intel_gem_set_context_param(fd, context, param, value))
+ err = -errno;
+ return err;
+}
+
+static bool
+anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority)
+{
+ return !anv_gem_set_context_param(fd, 0, I915_CONTEXT_PARAM_PRIORITY,
+ priority);
+}
+
+VkResult
+anv_i915_physical_device_get_parameters(struct anv_physical_device *device)
+{
+ VkResult result = VK_SUCCESS;
+ int val, fd = device->local_fd;
+
+ if (!intel_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT, &val) || !val) {
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel missing gem wait");
+ return result;
+ }
+
+ if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2, &val) || !val) {
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel missing execbuf2");
+ return result;
+ }
+
+ if (!device->info.has_llc &&
+ (!intel_gem_get_param(fd, I915_PARAM_MMAP_VERSION, &val) || val < 1)) {
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel missing wc mmap");
+ return result;
+ }
+
+ if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &val) || !val) {
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel missing softpin");
+ return result;
+ }
+
+ if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY, &val) || !val) {
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel missing syncobj support");
+ return result;
+ }
+
+ if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC, &val))
+ device->has_exec_async = val;
+ if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE, &val))
+ device->has_exec_capture = val;
+
+ /* Start with medium; sorted low to high */
+ const VkQueueGlobalPriorityKHR priorities[] = {
+ VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR,
+ VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR,
+ VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR,
+ VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR,
+ };
+ device->max_context_priority = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR;
+ for (unsigned i = 0; i < ARRAY_SIZE(priorities); i++) {
+ if (!anv_gem_has_context_priority(fd, priorities[i]))
+ break;
+ device->max_context_priority = priorities[i];
+ }
+
+ if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES, &val))
+ device->has_exec_timeline = val;
+
+ return result;
+}
+
+VkResult
+anv_i915_device_setup_context(struct anv_device *device,
+ const VkDeviceCreateInfo *pCreateInfo,
+ const uint32_t num_queues)
+{
+ struct anv_physical_device *physical_device = device->physical;
+ VkResult result = VK_SUCCESS;
+
+ if (device->physical->engine_info) {
+ /* The kernel API supports at most 64 engines */
+ assert(num_queues <= 64);
+ enum intel_engine_class engine_classes[64];
+ int engine_count = 0;
+ for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
+ const VkDeviceQueueCreateInfo *queueCreateInfo =
+ &pCreateInfo->pQueueCreateInfos[i];
+
+ assert(queueCreateInfo->queueFamilyIndex <
+ physical_device->queue.family_count);
+ struct anv_queue_family *queue_family =
+ &physical_device->queue.families[queueCreateInfo->queueFamilyIndex];
+
+ for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++)
+ engine_classes[engine_count++] = queue_family->engine_class;
+ }
+ if (!intel_gem_create_context_engines(device->fd,
+ physical_device->engine_info,
+ engine_count, engine_classes,
+ (uint32_t *)&device->context_id))
+ result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
+ "kernel context creation failed");
+ } else {
+ assert(num_queues == 1);
+ if (!intel_gem_create_context(device->fd, &device->context_id))
+ result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
+ }
+
+ if (result != VK_SUCCESS)
+ return result;
+
+ /* Here we tell the kernel not to attempt to recover our context but
+ * immediately (on the next batchbuffer submission) report that the
+ * context is lost, and we will do the recovery ourselves. In the case
+ * of Vulkan, recovery means throwing VK_ERROR_DEVICE_LOST and letting
+ * the client clean up the pieces.
+ */
+ anv_gem_set_context_param(device->fd, device->context_id,
+ I915_CONTEXT_PARAM_RECOVERABLE, false);
+
+ /* Check if client specified queue priority. */
+ const VkDeviceQueueGlobalPriorityCreateInfoKHR *queue_priority =
+ vk_find_struct_const(pCreateInfo->pQueueCreateInfos[0].pNext,
+ DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR);
+
+ VkQueueGlobalPriorityKHR priority =
+ queue_priority ? queue_priority->globalPriority :
+ VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
+
+ /* As per spec, the driver implementation may deny requests to acquire
+ * a priority above the default priority (MEDIUM) if the caller does not
+ * have sufficient privileges. In this scenario VK_ERROR_NOT_PERMITTED_KHR
+ * is returned.
+ */
+ if (physical_device->max_context_priority >= VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) {
+ int err = anv_gem_set_context_param(device->fd, device->context_id,
+ I915_CONTEXT_PARAM_PRIORITY,
+ priority);
+ if (err != 0 && priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) {
+ result = vk_error(device, VK_ERROR_NOT_PERMITTED_KHR);
+ goto fail_context;
+ }
+ }
+
+ return result;
+
+fail_context:
+ intel_gem_destroy_context(device->fd, device->context_id);
+ return result;
+}
--- /dev/null
+/*
+ * Copyright © 2022 Intel 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 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.
+ */
+
+#pragma once
+
+#include "vulkan/vulkan_core.h"
+
+struct anv_device;
+struct anv_physical_device;
+
+VkResult
+anv_i915_physical_device_get_parameters(struct anv_physical_device *device);
+
+VkResult
+anv_i915_device_setup_context(struct anv_device *device,
+ const VkDeviceCreateInfo *pCreateInfo,
+ const uint32_t num_queues);
endforeach
libanv_files = files(
+ 'i915/anv_device.c',
+ 'i915/anv_device.h',
'layers/anv_doom64.c',
'layers/anv_hitman3.c',
'anv_allocator.c',