platform/upstream/Vulkan-Loader.git
2 years agoClean up layer test
Mark Young [Wed, 16 Feb 2022 16:09:16 +0000 (09:09 -0700)]
Clean up layer test

My previous commit to enable physical device modifications in a layer
required new compiled layers to do the work.  Since this can more
cleanly be done by setting layer flags (as suggested by @charles-lunarg)
I have gone back and done that.

2 years agoFix Windows build and add proper phys dev group sorting
Mark Young [Tue, 8 Feb 2022 23:58:47 +0000 (16:58 -0700)]
Fix Windows build and add proper phys dev group sorting

2 years agoCode review comment fixes.
Mark Young [Tue, 8 Feb 2022 15:58:14 +0000 (08:58 -0700)]
Code review comment fixes.

Also, cleaned up Linux vs Windows code so that there was less duplication and
complexity.

2 years agoLoader single EnumPhysDev call through layers
Mark Young [Thu, 2 Dec 2021 23:55:13 +0000 (16:55 -0700)]
Loader single EnumPhysDev call through layers

The loader trampoline previously would query all devices every time
vkEnumeratePhysicalDevices was called.
To do this, it would make two calls every time:
  - First, it would ignore the passed in user values
  - Second, it would query the total number of available devices.
  - Third, it would query the values for every available device

This resulted in layers reporting 2 vkEnumeratePhysicalDevices call for
every 1 the application made which could get very polluted in output.
It didn't break any functionality, just made things messy.

This change removes that behavior and adds a bunch of test cases to verify
nothing broke in the move.

2 years agoAdd debug messages for unknown physical device extensions
Mark Young [Tue, 15 Feb 2022 18:37:58 +0000 (11:37 -0700)]
Add debug messages for unknown physical device extensions

Add debug messages to the loader so we can identify when an unknown
physical device extension's entrypoints are queried.

2 years agoUpdate build.md and README.md for the tests
Charles Giessen [Tue, 15 Feb 2022 22:04:15 +0000 (15:04 -0700)]
Update build.md and README.md for the tests

2 years agoGuard building of live_verification tests
Charles Giessen [Tue, 15 Feb 2022 22:03:25 +0000 (15:03 -0700)]
Guard building of live_verification tests

Don't build live verification tests by default. These are meant as manual tests for
developers to run to diagnose issues or verify correctness on a real system.

2 years agoSwitch ASSERT_EQ(false,true) for FAIL() in tests
Mark Young [Tue, 15 Feb 2022 21:47:29 +0000 (14:47 -0700)]
Switch ASSERT_EQ(false,true) for FAIL() in tests

2 years agoAdd explicit layer invalid variant number test
Mark Young [Tue, 15 Feb 2022 20:13:28 +0000 (13:13 -0700)]
Add explicit layer invalid variant number test

2 years agoAdd a few device layer tests
Mark Young [Tue, 15 Feb 2022 20:04:02 +0000 (13:04 -0700)]
Add a few device layer tests

Since device layers are pretty much ignored, make sure that they don't
change any behavior.
Also add a few "load" entrypoint helper routines based on what was already
done elsewhere in the test system.

2 years agoAdd live_verification tests for runnign with real drivers
Charles Giessen [Tue, 15 Feb 2022 20:56:21 +0000 (13:56 -0700)]
Add live_verification tests for runnign with real drivers

Some things need to be verified against real drivers. The supporting code in test_util and
test_environment make it easy to write application code which works against real drivers and
layers. This allows quickly verifying loader behavior out in the wild.

2 years agoAdd a test to verify that VK_INSTANCE_LAYERS behaves properly
Mark Young [Tue, 15 Feb 2022 17:42:06 +0000 (10:42 -0700)]
Add a test to verify that VK_INSTANCE_LAYERS behaves properly

2 years agoExpand unknown function handling tests
Charles Giessen [Mon, 14 Feb 2022 23:03:40 +0000 (16:03 -0700)]
Expand unknown function handling tests

Add tests for unknown device functions queried with both vkGetDeviceProcAddr
and vkGetInstanceProcAddr. Also loops enough times to exhaust the available
unknown function supply.

Had to fix the vk_layerGetPhysicalDeviceProcAddr in TestLayer to make the tests
pass.

MacOS currently skips tests which use vkGetInstanceProcAddr. This is due to the
need for unknown functions being lower priority and so do not warrent the time
needed to write the assembly necessary to resolve the issue fully.

2 years agoUpdate tests function loading implementation
Charles Giessen [Sat, 12 Feb 2022 19:35:30 +0000 (12:35 -0700)]
Update tests function loading implementation

Remove the need for macros and use well crafted helper loading functions which
can figure out the type to convert to based on the type being assigned.

2 years agoFix Win32 Unknown Device function handling
Charles Giessen [Sat, 12 Feb 2022 03:49:57 +0000 (20:49 -0700)]
Fix Win32 Unknown Device function handling

The handling of unknown device functions queried with vkGetInstanceProcAddr
required an additional pointer dereference to get the dispatch table.

The VkDevice handle is a pointer to the `chain_device` member of
`loader_device`. This member is actually a pointer to `loader_dispatch`, or
put another way, the "start" of `loader_device`. Thus, to get access to the
dispatch table, we need to dereference the VkDevice passed into the function
then dereference the chain_device to get loader_dispatch`.

2 years agoFix NULL check and make a few more consistent
Mark Young [Tue, 15 Feb 2022 15:52:10 +0000 (08:52 -0700)]
Fix NULL check and make a few more consistent

2 years agoTest layer pre-instance functions
Mark Young [Fri, 11 Feb 2022 19:10:17 +0000 (12:10 -0700)]
Test layer pre-instance functions

Add tests to verify that the 3 pre-instance functions are properly
intercepted by the layer when everything is well-defined.

Also include two fixes:
 1) Disable environment variable value of 0 should be treated the same as not present
 2) The vkEnumerateInstanceVersion override path was broken, missing a NULL check

2 years agoUpdate Windows runtime installer copyright
Charles Giessen [Mon, 14 Feb 2022 17:48:49 +0000 (10:48 -0700)]
Update Windows runtime installer copyright

2 years agoClarify behavior of override_paths + VK_LAYER_PATH
Charles Giessen [Fri, 11 Feb 2022 16:52:00 +0000 (09:52 -0700)]
Clarify behavior of override_paths + VK_LAYER_PATH

If a meta layer which contains `override_paths` is active, all of the paths in
VK_LAYER_PATH are ignored when searchign for explicit layers. This may be changed
changed in the future but for now is better tested and documented.

2 years agoMetaLayer version checking had paren in wrong place
Charles Giessen [Fri, 11 Feb 2022 17:36:53 +0000 (10:36 -0700)]
MetaLayer version checking had paren in wrong place

Produced spurious warnings for versions that are correct.

2 years agoTest when there are no devices or device extensions
Charles Giessen [Fri, 10 Sep 2021 19:41:09 +0000 (13:41 -0600)]
Test when there are no devices or device extensions

Adds 2 tests:
* ZeroPhysicalDevices - Return VK_ERROR_INITIALIZATION_FAILED if the driver has zero
physical devices.
* ZeroPhyiscalDeviceExtensions - Return VK_SUCCESS if no physical device extensions are
found.

2 years agoDont return an error for 0 physical device extensions
Charles Giessen [Thu, 10 Feb 2022 18:34:50 +0000 (11:34 -0700)]
Dont return an error for 0 physical device extensions

Previously the logic of loader_add_device_extensions could return an error from
enumerating device extensions. This was because the code would return immediately
if either an error was returned from the driver or the count was zero. Now the
logic will return an error only if the driver returned an error. Zero device
extensions won't be treated as an error and will simply return VK_SUCCESS.

2 years agoAdd debug utils loader testing
Mark Young [Sat, 5 Feb 2022 01:00:11 +0000 (18:00 -0700)]
Add debug utils loader testing

2 years agoFix loader logging of VUIDs
Mark Young [Sat, 5 Feb 2022 00:02:52 +0000 (17:02 -0700)]
Fix loader logging of VUIDs

The loader was logging some VUID failures and it was sending them to the general
message output.  Send the information also to the validation stream to make sure
that if anyone enables validation filtering they will still see those errors

2 years agoUpdate loader VUID messages
Mark Young [Fri, 4 Feb 2022 16:36:43 +0000 (09:36 -0700)]
Update loader VUID messages

Update the loader VUID messages that were added in validating handles
so that thye include the validation flag when going through debug utils
messenger.

2 years agoAdd DebugReport
Mark Young [Fri, 4 Feb 2022 16:00:55 +0000 (09:00 -0700)]
Add DebugReport

2 years agoFix Apple build
Mark Young [Tue, 8 Feb 2022 18:33:23 +0000 (11:33 -0700)]
Fix Apple build

We don't want Apple builds using the Linux sorting algorithm.

2 years agoUpdate Docs table of contents
Charles Giessen [Mon, 7 Feb 2022 22:47:01 +0000 (15:47 -0700)]
Update Docs table of contents

2 years agoRemove Instance and Device extension logging
Charles Giessen [Thu, 13 Jan 2022 22:48:16 +0000 (16:48 -0600)]
Remove Instance and Device extension logging

While the DEBUG level of logging is meant for verbose output, the actual extensions
enumerated rarely are useful for the purposes of debugging the loaders behavior.
With this in mind, the loader will now no longer print all the extensions found.

2 years agobuild: Update to header 1.3.205
Mike Schuchardt [Mon, 7 Feb 2022 17:32:17 +0000 (09:32 -0800)]
build: Update to header 1.3.205

- Update known-good
- Generate source

2 years agoMake vkGetInstanceProcAddr able to get itself
Charles Giessen [Sun, 6 Feb 2022 01:40:14 +0000 (18:40 -0700)]
Make vkGetInstanceProcAddr able to get itself

There was a regression with 1.3 that meant vkGetInstanceProcAddr wouldn't be
able to query itself if instance was set for 1.3. This commit makes it possible
to query for vkGetInstanceProcAddr with itself no matter the value of instance.

2 years agouse the correct instance
Brad Grantham [Sat, 5 Feb 2022 06:01:54 +0000 (22:01 -0800)]
use the correct instance

2 years agoVerify GIPA on device extensions
Mark Young [Thu, 3 Feb 2022 21:43:57 +0000 (14:43 -0700)]
Verify GIPA on device extensions

Verify that using vkGetInstanceProcAddr to get an entrypoint to a device
extension works when the extension is enabled, and crashes when the
extension isn't enabled.

Also, update a copyright notice date for my last commit.

2 years agoAdd tests to verify extension support in physical devices
Mark Young [Thu, 3 Feb 2022 18:08:14 +0000 (11:08 -0700)]
Add tests to verify extension support in physical devices

Add 2 tests to verify that physical devices supporting instance
and device extensions (which are really physical device extensions)
are properly handled.

2 years agoAdd a few tests to verify the vkGet***ProcAddr commands
Mark Young [Wed, 2 Feb 2022 22:19:26 +0000 (15:19 -0700)]
Add a few tests to verify the vkGet***ProcAddr commands

Verify that the loader exported version matches the ones you
receive from vkGet****ProcAddr.

2 years agoFix incorrect indexing of local_phys_dev_groups
Charles Giessen [Wed, 2 Feb 2022 20:38:55 +0000 (13:38 -0700)]
Fix incorrect indexing of local_phys_dev_groups

Seems to have been a copy paste error that meant the group's icd_term was assigned
to the incorrect group.

2 years agoloader: Try to handle ICD failure in vkEnumeratePhysicalDevices
Adam Jackson [Fri, 3 Dec 2021 16:08:54 +0000 (11:08 -0500)]
loader: Try to handle ICD failure in vkEnumeratePhysicalDevices

If any ICD failed to enumerate device groups here, we would fail the call entirely, which means a broken driver for device A could prevent you from using device B. Just skip over the failing ICD instead.

2 years agoAdd tests to validate layer extensions
Mark Young [Mon, 31 Jan 2022 23:27:36 +0000 (16:27 -0700)]
Add tests to validate layer extensions

We had tests that verified that instance and device extensions defined
in a layer had the non-null pointers returned from the corresponding
vkGetXXXProcAddr functions, but we weren't verifying that the functions
actually got called.

2 years agoloader log error if a requested layer not loaded
Mark Young [Thu, 9 Dec 2021 04:16:08 +0000 (21:16 -0700)]
loader log error if a requested layer not loaded

This should throw an error message if a requested layer didn't load.
This could happen if the JSON file is present, but only a library
exists on the system for the wrong target (like 32 vs 64-bit).

If it did fail because of being the wrong bit-type, we report an info
message only, unless it was directly requested by the application.

Modify the improper bit-depth layer loading test so that it is now 4
tests:
 - Verify bad explicit layer generates VK_ERROR_LAYER_NOT_PRESENT error
 - Verify bad implicit layer generates only an info in the loader output
 - Test case with both a bad implicit and explicit layer with INFO logging
   we should see both messages.
 - Test case with both a bad implicit and explicit layer with ERROR logging
   we should see only the explicit failure message.

Report info failure for ICD wrong bit-type as well.

Finally, fixed a small compilation warning for disabled code.

2 years agoFix warning for using wrong variant layers
Charles Giessen [Fri, 28 Jan 2022 23:40:17 +0000 (16:40 -0700)]
Fix warning for using wrong variant layers

Mistakenly used DRIVER instead of LAYER logging level.

2 years agoAdd wrong Variant tests
Charles Giessen [Fri, 28 Jan 2022 19:33:48 +0000 (12:33 -0700)]
Add wrong Variant tests

2 years agoIgnore layers with non zero variant value
Charles Giessen [Fri, 28 Jan 2022 18:28:23 +0000 (11:28 -0700)]
Ignore layers with non zero variant value

Layers which contain an API version where the variant value is non zero are not
designed for the Vulkan-Loader, so it should be ignored.

2 years agoRefactor json and API version parsing code
Charles Giessen [Fri, 28 Jan 2022 18:16:20 +0000 (11:16 -0700)]
Refactor json and API version parsing code

Reuse the loader_api_struct struct and associated parsing functions where
appropriate to reduce code duplication.

2 years agoSkip ICD's with non zero variant value
Charles Giessen [Wed, 26 Jan 2022 22:42:21 +0000 (15:42 -0700)]
Skip ICD's with non zero variant value

If the JSON ICD Manifest contains an api_version that has a non zero variant
value, then the ICD should be skipped since it corresponds to a Vulkan variant.

2 years agoDetect Variant versions in given api versions
Charles Giessen [Wed, 26 Jan 2022 22:40:03 +0000 (15:40 -0700)]
Detect Variant versions in given api versions

Since it is possible that API versions given to the loader have a variant
component, the loader should know how to handle them. It shouldn't use a
variant other than 0, but that is up to the caller to handle.

2 years agoUpdate tests to use correct version macro
Charles Giessen [Wed, 26 Jan 2022 22:14:39 +0000 (15:14 -0700)]
Update tests to use correct version macro

The VK_MAKE_API_VERSION macro and the VK_API_VERSION_1_X macros are better to
use. This commit switches the tests over to the non-deprecated versions of the
macros.

2 years agoWarn when the apiVersion's variant isn't 0
Charles Giessen [Wed, 26 Jan 2022 20:37:04 +0000 (13:37 -0700)]
Warn when the apiVersion's variant isn't 0

The 1.2.175 header release saw the addition of API Variants. For the purposes
of the loader, this should always be set to 0. If this value isn't zero, the
loader should warn about it.

2 years agoUse VK_API_VERSION_XXX macros everywhere
Charles Giessen [Wed, 26 Jan 2022 20:26:37 +0000 (13:26 -0700)]
Use VK_API_VERSION_XXX macros everywhere

The older VK_VERSION_XXX macros are deprecated and cause confusion when they
report a MAJOR version that is above zero. All uses of the deprecated macro are
now replaced with the correct macro.

2 years agoAdd test for implicit layer with 0.1 API version
Charles Giessen [Wed, 26 Jan 2022 20:14:22 +0000 (13:14 -0700)]
Add test for implicit layer with 0.1 API version

The loader disables implicit layers if their API version isn't the same or
greater than the application. Make sure this still works even with pre 1.0
versions.

2 years agoTest EnumPhysDev to make sure handles don't change
Mark Young [Wed, 26 Jan 2022 20:15:12 +0000 (13:15 -0700)]
Test EnumPhysDev to make sure handles don't change

Add a test to make sure that the physical device handles don't change
between calls to vkEnumeratePhysicalDevices

2 years agoFix Linux sort order crash
Mark Young [Wed, 26 Jan 2022 19:15:53 +0000 (12:15 -0700)]
Fix Linux sort order crash

We were completely re-creating the physical device lists every time
EnumeratePhysicalDevices was triggered in the loader.  This could
cause applications to have out-dated physical device handles.
We need to copy existing handles that match devices whenever they're
found.

2 years agoAdd VK_NN_vi_surface to WSI extension names array
Kevin McCullough [Tue, 25 Jan 2022 23:32:46 +0000 (15:32 -0800)]
Add VK_NN_vi_surface to WSI extension names array

2 years agoVK_NN_vi_surface WSI implementation
Kevin McCullough [Tue, 25 Jan 2022 23:55:27 +0000 (15:55 -0800)]
VK_NN_vi_surface WSI implementation

2 years agoUse size_t instead of uint32_t in test_icd
Charles Giessen [Tue, 25 Jan 2022 18:52:54 +0000 (11:52 -0700)]
Use size_t instead of uint32_t in test_icd

Compiler complained about possible loss of data. This fixes it.

2 years agoUpdate LoaderLayerInterface.md documentation
Charles Giessen [Tue, 25 Jan 2022 18:43:20 +0000 (11:43 -0700)]
Update LoaderLayerInterface.md documentation

Expand override layer documentation to include override_paths

Add Versioning and Activation Interactions section which details some of the
more complex rules around when a layer is activated or not.

2 years agoAdd override_paths tests for OverrideLayer
Charles Giessen [Tue, 25 Jan 2022 02:38:22 +0000 (19:38 -0700)]
Add override_paths tests for OverrideLayer

Add 4 tests:
* Shows the override_paths object in the layer manifest is being used to find a
layer.
* Shows that regular explicit layers are not found
* Shows that the log properly identifies meta layers which have an
override_paths object but shouldn't according to their manifest.
* Shows that implicit layers not in the override paths are not found.

2 years agoFix loader manifest version checks
Charles Giessen [Tue, 25 Jan 2022 02:34:50 +0000 (19:34 -0700)]
Fix loader manifest version checks

Several version checks were underspecified and either caused false positives
or didn't catch version violations.
For example, a manifest version 1.2.0 is valid but would emit warnings implying
the version is less than 1.1.

2 years agoAdd TestLayerDetails helper struct
Charles Giessen [Tue, 25 Jan 2022 02:03:21 +0000 (19:03 -0700)]
Add TestLayerDetails helper struct

Increasingly it is common to need more control over what the framework
environment does when adding layers. While only a refactor, this change
makes it easier to extend the functionality by adding data to the
TestLayerDetails struct.

The code to check whether the lib_path specified in add_layer_impl was
improved by using the `.stem()` functionality of the fs::path abstraction.

size_t was replaced with uint32_t where the compiler gave warnings.

2 years agoMake layer tests specify number of extensions
Charles Giessen [Mon, 24 Jan 2022 21:42:04 +0000 (14:42 -0700)]
Make layer tests specify number of extensions

It is good practice to make use of equality checks vs comparison checks where
possible. Here, the number of extensions is knowable, as its debug_report +
debug_utils + however many come from implicit layers, which some tests do.

2 years agoFixup tests/README to use newlines for sentences
Charles Giessen [Fri, 21 Jan 2022 03:10:45 +0000 (20:10 -0700)]
Fixup tests/README to use newlines for sentences

2 years agoAdd meta layer blacklist test
Charles Giessen [Fri, 21 Jan 2022 03:10:03 +0000 (20:10 -0700)]
Add meta layer blacklist test

2 years agoAdd meta layer fields to layer manifest in tests
Charles Giessen [Fri, 21 Jan 2022 03:09:03 +0000 (20:09 -0700)]
Add meta layer fields to layer manifest in tests

2 years agoAdd check_permutation test helper
Charles Giessen [Tue, 18 Jan 2022 23:40:01 +0000 (16:40 -0700)]
Add check_permutation test helper

This allows easily checking that the returned list of extensions or layers
is a valid permutation. Since the order of layers and extensions isn't
deterministic, tests cannot rely on the returned order to verify the output.

2 years agoAdd many meta-layer tests
Charles Giessen [Tue, 18 Jan 2022 03:11:23 +0000 (20:11 -0700)]
Add many meta-layer tests

Add tests for:
ExplicitMetaLayer - meta layer found in explicit paths
MetaLayerNameInComponentLayers - meta layer contains itself
MetaLayerWhichAddsmetaLayer - when a meta layer enables another meta layer
InstanceExtensionInComponentLayer - instance extension propagation
DeviceExtensionInComponentLayer - device extension propagation
OverrideMetaLayer.OlderVersionThanInstance - Checks behavior of override layer
  if the applications version is greater.

2 years agoCleanup loader layer removal code
Charles Giessen [Tue, 18 Jan 2022 02:02:44 +0000 (19:02 -0700)]
Cleanup loader layer removal code

The loader_read_layer_json function wasn't decrementing the count of layers in the
list if it failed to load, leading to inconsistent results.

Several places were removing layers in a layer list manually when the functions
loader_remove_layer_in_list exists. They also weren't modifying their loop counters
when it was necessary.

2 years agoSimplify test framework FolderManager write function
Charles Giessen [Tue, 18 Jan 2022 01:27:31 +0000 (18:27 -0700)]
Simplify test framework FolderManager write function

Condense the overloaded write function from taking either an icd manifest or a layer manifest
and only take a string. This reduces the amount of copy-paste code.

2 years agoRemove redundant layer validity check
Charles Giessen [Tue, 18 Jan 2022 00:34:21 +0000 (17:34 -0700)]
Remove redundant layer validity check

The Loader makes sure all component layers in a meta layer are found. It would then do this check
immediately afterwards. This is redundant and can be removed.

2 years agoTestICD return features, props, & memprops
Charles Giessen [Wed, 1 Dec 2021 21:19:54 +0000 (14:19 -0700)]
TestICD return features, props, & memprops

Make the TestICD return the features, properties, & memory properties of
a physical device.

2 years agoCheck for version 1.3 in GetP.D.ToolProperties
Charles Giessen [Wed, 1 Dec 2021 21:02:52 +0000 (14:02 -0700)]
Check for version 1.3 in GetP.D.ToolProperties

To ensure that no crashes occur due to calling into the driver's
vkGetPhysicalDeviceToolProperties. This prevents cases where the function is
exported but the physical device doesn't actually support the function (such
as mesa with its function dispatcher shared between drivers).

2 years agoloader: Add basic 1.3 tests
Charles Giessen [Mon, 13 Sep 2021 23:57:49 +0000 (17:57 -0600)]
loader: Add basic 1.3 tests

Not complete and mainly just makes sure an app can load the function pointer and call it
without crashing.

2 years agoloader: Add manual trampolines for 1.3
Charles Giessen [Mon, 13 Sep 2021 21:13:18 +0000 (15:13 -0600)]
loader: Add manual trampolines for 1.3

2 years agoloader: Add core 1.3 function to gpa_helper
Charles Giessen [Mon, 13 Sep 2021 17:40:36 +0000 (11:40 -0600)]
loader: Add core 1.3 function to gpa_helper

2 years agoloader: Add 1.3 symbols defs to appropriate files
Charles Giessen [Mon, 13 Sep 2021 17:36:07 +0000 (11:36 -0600)]
loader: Add 1.3 symbols defs to appropriate files

vulkan-1.def and vulkan.symbols.api for fuschia

2 years agoloader: Add GetToolinInfo trampoline/terminator
Charles Giessen [Fri, 10 Sep 2021 23:06:21 +0000 (17:06 -0600)]
loader: Add GetToolinInfo trampoline/terminator

2 years agobuild: Update to header 1.3.204
Mike Schuchardt [Tue, 25 Jan 2022 15:42:28 +0000 (07:42 -0800)]
build: Update to header 1.3.204

- Update known-good
- Generate source

2 years agoAdd support for building on ChromeOS
Alexis Hetu [Tue, 25 Jan 2022 15:09:00 +0000 (10:09 -0500)]
Add support for building on ChromeOS

2 years agoFix writing to filtered extension list
Ari Suonpää [Sat, 22 Jan 2022 07:13:42 +0000 (09:13 +0200)]
Fix writing to filtered extension list

VK_KHR_get_physical_device_properties2 is added to an extension list
on Linux targets, but the index used for setting the extension string
in that list is wrong, leaving a NULL pointer where the extension
name should be.

2 years agoFix issue #802
Mark Young [Mon, 24 Jan 2022 16:34:29 +0000 (09:34 -0700)]
Fix issue #802

The loader assumed if Vulkan 1.1 is supported, then the PCI bus extension
must automatically be supported.  This was a mistake as that extension is
not part of core.

2 years agoDowngrade all policy messages from ERROR to WARN
Charles Giessen [Fri, 21 Jan 2022 03:26:37 +0000 (20:26 -0700)]
Downgrade all policy messages from ERROR to WARN

2 years agoEnable Address Sanitizser in Github Actions
Charles Giessen [Tue, 18 Jan 2022 22:54:20 +0000 (15:54 -0700)]
Enable Address Sanitizser in Github Actions

2 years agoAdd VK_LOADER_TEST_LOADER_PATH env-var for tests
Charles Giessen [Tue, 18 Jan 2022 22:19:26 +0000 (15:19 -0700)]
Add VK_LOADER_TEST_LOADER_PATH env-var for tests

The environment variable VK_LOADER_TEST_LOADER_PATH allows running of tests
using a different binary than the one built by the repo. This is extremely
useful for checking that a test exercises a bugfix, by quickly allowing the
running of the same test on the current 'fixed' loader and an older 'broken'
loader.

2 years agomurmurhash: Fix an undefined behavior when hashing function names
Yilong Li [Thu, 13 Jan 2022 05:52:21 +0000 (21:52 -0800)]
murmurhash: Fix an undefined behavior when hashing function names

In Vulkan loader GetProcAddr handlers, for functions that are
not specified in the Vulkan registry, the loader will try loading
the name from ICDs or layers, and store the function entry into
a hashtable. The hashtable uses |murmurhash()| function to hash
Vulkan function names.

murmurhash handles data as 4-byte chunks and read one chunk at a
time; and it simply converts uint8_t pointers to uint32_t pointers
while loading data. However, the address of function name might
not be 32-bit aligned and this will cause an undefined behavior in
C99 / C11.

This change fixes the murmurhash() behavior so that it handles
unaligned access correctly. For most common platforms that supports
unaligned memory access this could compile into a single mov/load
instruction even if compiling using -O0.

Change-Id: I16011720198a0ee96e556855858a9909f95ec376

2 years agoAdd test for older implicit layer version
Charles Giessen [Wed, 12 Jan 2022 23:29:55 +0000 (17:29 -0600)]
Add test for older implicit layer version

Add NewerInstanceVersionThanImplicitLayer test which exercises the loader's
removal of layers whoses API version is less than the application specified
API version.

2 years agoAdd meta-layer versioning tests
Charles Giessen [Wed, 12 Jan 2022 23:04:15 +0000 (17:04 -0600)]
Add meta-layer versioning tests

Adds three tests:
* OlderMetaLayerWithNewerInstanceVersion - Checks for interaction between app's
instance version and the meta layer version
* NewerComponentLayerInMetaLayer - When a component layer has an API version
newer than the meta layer, the meta layer is disabled.
* OlderComponentLayerInMetaLayer - When a component layer has an API version
older than the meta layer, the meta layer is disabled.

2 years agoFix layers not being removed by meta-layer
Charles Giessen [Wed, 12 Jan 2022 22:56:59 +0000 (16:56 -0600)]
Fix layers not being removed by meta-layer

The code was faulty and would remove the layers that were supposed to be kept,
such as the meta layer itself. Bugs include taking a copy instead of a pointer
which led to an assignment being forgotten and using the wrong list when
looking through the list of layers.

2 years agoCheck for duplicates before adding layer
Charles Giessen [Wed, 12 Jan 2022 22:55:12 +0000 (16:55 -0600)]
Check for duplicates before adding layer

If an application decided to enable an implicit layer, it would result in the
layer properties being stored twice in the activated layer list. Simply not
adding the layer if it already is in the list prevents the duplication.

2 years agoLog meta-layer messages when inst is NULL
Charles Giessen [Wed, 12 Jan 2022 22:51:44 +0000 (16:51 -0600)]
Log meta-layer messages when inst is NULL

The code previously would only log meta-layer messages when the instance
isn't NULL (so never during pre-instance calls). This leads to critical
information being left out while debugging, making issues harder to
diagnose.

2 years agoFix layer manifest version check
Charles Giessen [Wed, 12 Jan 2022 19:42:03 +0000 (13:42 -0600)]
Fix layer manifest version check

The check assumed that 1.1.x was the highest Layer Manifest version in existance.
This causes 1.2 layer manifests to erroneously report a message. No functionality
is affected by the check, so this commit just silences a wrong warning.

2 years agoAdd test for manually enabled implicit layer
Charles Giessen [Wed, 5 Jan 2022 21:53:00 +0000 (15:53 -0600)]
Add test for manually enabled implicit layer

If an application manually enabled an implicit layer, the layer should
be enabled without issue.

2 years agoConsistent loader device ordering
Mark Young [Mon, 15 Nov 2021 17:49:37 +0000 (10:49 -0700)]
Consistent loader device ordering

The loader ICD ordering could be random on Linux based on using readdir
to find ICD manifest files.  This can result in random behaviors as
applications that select only the first device can switch which device is
used.  To resolve this, we now sort based on device type and then
internally to the types based on PCI bus information.

This also introduces a VK_LOADER_DEFAULT_DEVICE environment variable
that can be used to force a specific PCI device.  This environment variable
is actually a duplicate of the MESA_VK_DEVICE_SELECT variable, which is
also looked for if the loader environment variable is not found.

Note, that at least one ICD must support it for the extension to be used at all.
So we only do the sorting if one ICD supports it.

Fixes part of #657

2 years agoMove the LDP_DRIVER_6 message to a warning for now
Mark Young [Tue, 11 Jan 2022 21:51:52 +0000 (14:51 -0700)]
Move the LDP_DRIVER_6 message to a warning for now

2 years agoAdd 1.2.1 as valid Layer Manifest version
Charles Giessen [Mon, 10 Jan 2022 22:52:50 +0000 (16:52 -0600)]
Add 1.2.1 as valid Layer Manifest version

2 years agoFixup phys_dev_inst_ext_tests
Charles Giessen [Mon, 10 Jan 2022 22:35:39 +0000 (16:35 -0600)]
Fixup phys_dev_inst_ext_tests

Add tests which exercise the case of a ICD being 1.0 with support for
VK_KHR_get_physical_device_properties2 while the ICD enables 1.1 and the
extension but tries to use the extension.

Removed TEST_F in this file, wasn't needed and caused an extra ICD to be found.

Converted the CompareXXX functions from internally using ASSERT_EQ to returning
a bool. This made the tests more robust since ASSERT_EQ in a function will just
return the function early, not end the test.

2 years agoTests separate 1.1 and VK_KHR_get_phys_dev_props2
Charles Giessen [Mon, 10 Jan 2022 22:33:01 +0000 (16:33 -0600)]
Tests separate 1.1 and VK_KHR_get_phys_dev_props2

Previously the TestICD would conflate the 2 distinct situations by accident. This commit
moves the logic into their separate blocks to prevent mixups.

2 years agoFallback to 2KHR terminators if available
Charles Giessen [Sun, 9 Jan 2022 23:39:39 +0000 (17:39 -0600)]
Fallback to 2KHR terminators if available

The functions added from VK_KHR_get_physical_device_properties2 were made core, but a
recent loader change meant that an application which was trying to use the extension may
use the fallback version (which ignores the pNext chain). This breaks existing
applications and thus needs to be rectified. This commit makes it so that if the core
GetPhysicalDeviceXXX functions aren't available and the extension is supported & enabled,
the extension version is used instead.

2 years agoRemove unnecessary code in test
Mark Young [Fri, 7 Jan 2022 23:27:38 +0000 (16:27 -0700)]
Remove unnecessary code in test

2 years agoFix a few code review snippets
Mark Young [Fri, 7 Jan 2022 21:27:26 +0000 (14:27 -0700)]
Fix a few code review snippets

Messages weren't clear on some errors, and rework the library ending
code based on @charles-lunarg suggestions

2 years agoAdd layer tests for instance extension support
Mark Young [Mon, 3 Jan 2022 22:16:45 +0000 (15:16 -0700)]
Add layer tests for instance extension support

Verify that the loader properly handles instance extensions defined
in a layer (both implicit and explicit).

2 years agoAdd device extension layer tests
Mark Young [Thu, 30 Dec 2021 22:26:29 +0000 (15:26 -0700)]
Add device extension layer tests

Need to make sure the loader behaves appropriately for layers which report
one or more device extensions.

2 years agoFix debug utils wrapping in tests
Mark Young [Wed, 29 Dec 2021 20:39:21 +0000 (13:39 -0700)]
Fix debug utils wrapping in tests

Also fix another compiler warning.