anv/entrypoints: VkGetDeviceProcAddr returns NULL for core instance commands
authorIago Toral Quiroga <itoral@igalia.com>
Mon, 12 Mar 2018 07:27:04 +0000 (08:27 +0100)
committerIago Toral Quiroga <itoral@igalia.com>
Wed, 14 Mar 2018 07:09:15 +0000 (08:09 +0100)
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.

Also see the public issue:
https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/2323

v2:
  - Include reference to github issue (Emil)
  - Rebased on top of Vulkan 1.1 changes.

v3:
  - Remove the not in the condition and switch the then/else cases (Jason)

Reviewed-by: Emil Velikov <emil.velikov@collabora.com> (v1)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_entrypoints_gen.py

index 72110347826fcd6a7e9f7642de95fdfc2d14fb51..d603ac1b20bf35128899e6dfe2af0a56689be8a1 100644 (file)
@@ -279,7 +279,11 @@ anv_entrypoint_is_enabled(int index, uint32_t core_version,
    case ${e.num}:
       /* ${e.name} */
    % if e.core_version:
    case ${e.num}:
       /* ${e.name} */
    % if e.core_version:
-      return ${e.core_version.c_vk_version()} <= core_version;
+      % if e.is_device_entrypoint():
+         return ${e.core_version.c_vk_version()} <= core_version;
+      % else:
+         return !device && ${e.core_version.c_vk_version()} <= core_version;
+      % endif
    % elif e.extensions:
      % for ext in e.extensions:
        % if ext.type == 'instance':
    % elif e.extensions:
      % for ext in e.extensions:
        % if ext.type == 'instance':