Oh, Chris was faster :) Sam
On 19/01/18 12:08, Samuel Iglesias Gonsálvez wrote: > > On 19/01/18 11:44, Tapani Pälli wrote: >> Signed-off-by: Tapani Pälli <[email protected]> >> --- >> >> Small crucible test available here: >> https://cgit.freedesktop.org/~tpalli/crucible/commit/?h=VK_EXT_global_priority >> >> src/intel/vulkan/anv_device.c | 25 +++++++++++++++++++ >> src/intel/vulkan/anv_extensions.py | 2 ++ >> src/intel/vulkan/anv_gem.c | 49 >> ++++++++++++++++++++++++++++++++++++++ >> src/intel/vulkan/anv_private.h | 7 ++++++ >> 4 files changed, 83 insertions(+) >> >> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c >> index 777abd8757..42ebc19f2b 100644 >> --- a/src/intel/vulkan/anv_device.c >> +++ b/src/intel/vulkan/anv_device.c >> @@ -369,6 +369,9 @@ anv_physical_device_init(struct anv_physical_device >> *device, >> device->has_syncobj_wait = device->has_syncobj && >> anv_gem_supports_syncobj_wait(fd); >> >> + if (anv_gem_has_context_priority(fd)) >> + device->has_context_priority = true; >> + >> bool swizzled = anv_gem_get_bit6_swizzle(fd, I915_TILING_X); >> >> /* Starting with Gen10, the timestamp frequency of the command streamer >> may >> @@ -1205,6 +1208,15 @@ VkResult anv_CreateDevice( >> } >> } >> >> + /* Check if client specified queue priority. */ >> + const VkDeviceQueueGlobalPriorityCreateInfoEXT *queue_priority = >> + vk_find_struct_const(pCreateInfo->pQueueCreateInfos[0].pNext, >> + DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT); >> + >> + VkQueueGlobalPriorityEXT priority = >> + queue_priority ? queue_priority->globalPriority : >> + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT; >> + >> device = vk_alloc2(&physical_device->instance->alloc, pAllocator, >> sizeof(*device), 8, >> VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); >> @@ -1234,6 +1246,19 @@ VkResult anv_CreateDevice( >> goto fail_fd; >> } >> >> + /* 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_EXT >> + * is returned. >> + */ >> + if (physical_device->has_context_priority) { >> + int err = anv_gem_set_context_priority(device, priority); >> + if (err != 0 && priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT) { >> + result = vk_error(VK_ERROR_NOT_PERMITTED_EXT); >> + goto fail_fd; >> + } >> + } >> + >> device->info = physical_device->info; >> device->isl_dev = physical_device->isl_dev; >> >> diff --git a/src/intel/vulkan/anv_extensions.py >> b/src/intel/vulkan/anv_extensions.py >> index adfebca985..aacf39248f 100644 >> --- a/src/intel/vulkan/anv_extensions.py >> +++ b/src/intel/vulkan/anv_extensions.py >> @@ -86,6 +86,8 @@ EXTENSIONS = [ >> Extension('VK_KHX_multiview', 1, True), >> Extension('VK_EXT_debug_report', 8, True), >> Extension('VK_EXT_external_memory_dma_buf', 1, True), >> + Extension('VK_EXT_global_priority', 1, >> + 'device->has_context_priority'), >> ] >> >> class VkVersion: >> diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c >> index 34c0989108..46069dcdc7 100644 >> --- a/src/intel/vulkan/anv_gem.c >> +++ b/src/intel/vulkan/anv_gem.c >> @@ -302,6 +302,55 @@ close_and_return: >> return swizzled; >> } >> >> +static int >> +vk_priority_to_anv(int priority) >> +{ >> + switch (priority) { >> + case VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT: >> + return ANV_CONTEXT_LOW_PRIORITY; >> + case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT: >> + return ANV_CONTEXT_MEDIUM_PRIORITY; >> + case VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT: >> + return ANV_CONTEXT_HIGH_PRIORITY; >> + case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT: >> + default: >> + return -1; > Is this right? We are returning -1 on > VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EX, which should be the highest > priority, according to the spec. > > Checking Intel kernel driver's sources, it checks the given priority in > struct drm_i915_gem_context_param is within the range of > I915_CONTEXT_MAX_USER_PRIORITY and I915_CONTEXT_MIN_USER_PRIORITY, whose > values are 1023 and -1023, respectively. So at the end, you are setting > the priority to be one unit lower than I915_CONTEXT_DEFAULT_PRIORITY. > > What do you want to do here? Give more priority to the realtime case or > indicate that it is not supported? > > Sam >> + } >> +} >> + >> +static int >> +_anv_gem_set_context_priority(int fd, >> + int context_id, >> + int priority) >> +{ >> + struct drm_i915_gem_context_param p = { >> + .ctx_id = context_id, >> + .param = I915_CONTEXT_PARAM_PRIORITY, >> + .value = vk_priority_to_anv(priority), >> + }; >> + int err = 0; >> + >> + if (anv_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &p)) >> + err = -errno; >> + >> + return err; >> +} >> + >> +int >> +anv_gem_set_context_priority(struct anv_device *device, >> + int priority) >> +{ >> + return _anv_gem_set_context_priority(device->fd, device->context_id, >> + priority); >> +} >> + >> +bool >> +anv_gem_has_context_priority(int fd) >> +{ >> + return !_anv_gem_set_context_priority(fd, 0, >> + >> VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT); >> +} >> + >> int >> anv_gem_create_context(struct anv_device *device) >> { >> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h >> index ed711e9434..caea3d96b4 100644 >> --- a/src/intel/vulkan/anv_private.h >> +++ b/src/intel/vulkan/anv_private.h >> @@ -106,6 +106,10 @@ struct gen_l3_config; >> #define ANV_SVGS_VB_INDEX MAX_VBS >> #define ANV_DRAWID_VB_INDEX (MAX_VBS + 1) >> >> +#define ANV_CONTEXT_LOW_PRIORITY ((I915_CONTEXT_MIN_USER_PRIORITY-1)/2) >> +#define ANV_CONTEXT_MEDIUM_PRIORITY (I915_CONTEXT_DEFAULT_PRIORITY) >> +#define ANV_CONTEXT_HIGH_PRIORITY ((I915_CONTEXT_MAX_USER_PRIORITY+1)/2) >> + >> #define anv_printflike(a, b) __attribute__((__format__(__printf__, a, b))) >> >> static inline uint32_t >> @@ -768,6 +772,7 @@ struct anv_physical_device { >> bool has_exec_fence; >> bool has_syncobj; >> bool has_syncobj_wait; >> + bool has_context_priority; >> >> uint32_t eu_total; >> uint32_t subslice_total; >> @@ -914,6 +919,8 @@ int anv_gem_execbuffer(struct anv_device *device, >> int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle, >> uint32_t stride, uint32_t tiling); >> int anv_gem_create_context(struct anv_device *device); >> +bool anv_gem_has_context_priority(int fd); >> +int anv_gem_set_context_priority(struct anv_device *device, int priority); >> int anv_gem_destroy_context(struct anv_device *device, int context); >> int anv_gem_get_context_param(int fd, int context, uint32_t param, >> uint64_t *value); > > > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
