[Mesa-stable] [Mesa-dev] [PATCH] anv/entrypoints: VkGetDeviceProcAddr returns NULL for core instance commands

Emil Velikov emil.l.velikov at gmail.com
Mon Mar 5 12:11:04 UTC 2018


Hi Iago,

Top level questions:

I think this and the original commit should go to stable right?
The dispatch in 17.3 is very different making, yet 18.0 should be
perfectly fine.

Mildly related - anv is missing a special case for following three
extensions. Should we port those over from radv?

vkCreateInstance vkEnumerateInstanceExtensionProperties
vkEnumerateInstanceLayerProperties

Bas, you might want to port these over?

On 5 March 2018 at 10:46, Iago Toral Quiroga <itoral at igalia.com> wrote:
> af5f2322d0c64 addressed this for extension commands, but the spec mandates
> this behavior also for core API commands. From the Vulkan spec,
> Table 2. vkGetDeviceProcAddr behavior:
>
> device     pname                            return
> ----------------------------------------------------------
> (..)
> device     core device-level command        fp
> (...)
>
> See that it specifically states "device-level".
>
> Since the vk.xml file doesn't state if core commands are instance or
> device level, we identify device level commands as the ones that take a
> VkDevice, VkQueue or VkCommandBuffer as their first parameter.
>
> Fixes test failures in new work-in-progress CTS tests.
AFAICT this and the original patch are in-light of the following
github issue, right?
If so, please add it to the commit message.

https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/2323

> ---
>  src/intel/vulkan/anv_entrypoints_gen.py | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py
> index 34ffedb116..f0bfc3b6f8 100644
> --- a/src/intel/vulkan/anv_entrypoints_gen.py
> +++ b/src/intel/vulkan/anv_entrypoints_gen.py
> @@ -222,7 +222,11 @@ anv_entrypoint_is_enabled(int index, uint32_t core_version,
>  % for e in entrypoints:
>     case ${e.num}:
>     % if e.core_version:
> -      return ${e.core_version.c_vk_version()} <= core_version;
> +      % if e.instance_dispatch:
> +         return !device && ${e.core_version.c_vk_version()} <= core_version;
> +      % else:
> +         return ${e.core_version.c_vk_version()} <= core_version;
> +      % endif
>     % elif e.extension:
>        % if e.extension.type == 'instance':
>        return !device && instance->${e.extension.name[3:]};
> @@ -350,6 +354,12 @@ def cal_hash(name):
>
>  EntrypointParam = namedtuple('EntrypointParam', 'type name decl')
>
> +DeviceChildrenList = ['VkDevice', 'VkQueue', 'VkCommandBuffer' ]
> +
> +def is_device_child(name):
> +   """Tell if the given type name is a VkDevice or one of its children."""
> +   return name in DeviceChildrenList
> +
>  class Entrypoint(object):
>      def __init__(self, name, return_type, params, guard = None):
>          self.name = name
> @@ -358,6 +368,7 @@ class Entrypoint(object):
>          self.guard = guard
>          self.enabled = False
>          self.num = None
> +        self.instance_dispatch = not is_device_child(params[0].type)
On a quick look this seems odd - one is interested in instance
dispatch, yet checking for device.
There are some subtleties about it in the above mentioned report.

Please add a small comment about those.

With the link + trivial comment the patch is
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>

-Emil


More information about the mesa-stable mailing list