// Copyright (c) 2016-2017 The Khronos Group Inc.
// Copyright notice at https://www.khronos.org/registry/speccopyright.html

[[VK_KHR_get_physical_device_properties2]]
== VK_KHR_get_physical_device_properties2

*Name String*::
    +VK_KHR_get_physical_device_properties2+
*Extension Type*::
    Instance extension
*Registered Extension Number*::
    60
*Status*::
    Complete.
*Last Modified Date*::
    2016-11-02
*Revision*::
    2
*IP Status*::
    No known IP claims.
*Dependencies*::
  - This extension is written against version 1.0 of the Vulkan API.
*Contributors*::
  - Jeff Bolz, NVIDIA
  - Ian Elliott, Google
*Contacts*::
  - Jeff Bolz (jbolz 'at' nvidia.com)

This extension provides new entry points to query device features, device
properties, and format properties in a way that can be easily extended by
other extensions, without introducing any further entry points.
The Vulkan 1.0 feature/limit/formatproperty structures do not include
ptext:sType/ptext:pNext members.
This extension wraps them in new structures with ptext:sType/ptext:pNext
members, so an application can query a chain of feature/limit/formatproperty
structures by constructing the chain and letting the implementation fill
them in.
A new command is added for each ftext:vkGetPhysicalDevice* command in core
Vulkan 1.0.
The new feature structure (and a chain of extension structures) can also be
passed in to device creation to enable features.

This extension also allows applications to use the physical-device
components of device extensions before flink:vkCreateDevice is called.

=== New Object Types

None.

=== New Enum Constants

  * Extending ename:VkStructureType:
  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR
  ** ename:VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR
  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR

=== New Enums

None.

=== New Structures

  * slink:VkPhysicalDeviceFeatures2KHR
  * slink:VkPhysicalDeviceProperties2KHR
  * slink:VkFormatProperties2KHR
  * slink:VkImageFormatProperties2KHR
  * slink:VkPhysicalDeviceImageFormatInfo2KHR
  * slink:VkQueueFamilyProperties2KHR
  * slink:VkPhysicalDeviceMemoryProperties2KHR
  * slink:VkSparseImageFormatProperties2KHR
  * slink:VkPhysicalDeviceSparseImageFormatInfo2KHR

=== New Functions

  * flink:vkGetPhysicalDeviceFeatures2KHR
  * flink:vkGetPhysicalDeviceProperties2KHR
  * flink:vkGetPhysicalDeviceFormatProperties2KHR
  * flink:vkGetPhysicalDeviceImageFormatProperties2KHR
  * flink:vkGetPhysicalDeviceQueueFamilyProperties2KHR
  * flink:vkGetPhysicalDeviceMemoryProperties2KHR
  * flink:vkGetPhysicalDeviceSparseImageFormatProperties2KHR

=== Issues

None.

=== Examples

[source,c++]
----------------------------------------

    // Get features with a hypothetical future extension.
    VkHypotheticalExtensionFeaturesKHR hypotheticalFeatures =
    {
        VK_STRUCTURE_TYPE_HYPOTHETICAL_FEATURES_KHR,                            // sType
        NULL,                                                                   // pNext
    };

    VkPhysicalDeviceFeatures2KHR features =
    {
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,                       // sType
        &hypotheticalFeatures,                                                  // pNext
    };

    // After this call, features and hypotheticalFeatures have been filled out.
    vkGetPhysicalDeviceFeatures2KHR(physicalDevice, &features);

    // Properties/limits can be chained and queried similarly.

    // Enable some features:
    VkHypotheticalExtensionFeaturesKHR enabledHypotheticalFeatures =
    {
        VK_STRUCTURE_TYPE_HYPOTHETICAL_FEATURES_KHR,                            // sType
        NULL,                                                                   // pNext
    };

    VkPhysicalDeviceFeatures2KHR enabledFeatures =
    {
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,                       // sType
        &enabledHypotheticalFeatures,                                           // pNext
    };

    enabledFeatures.features.xyz = VK_TRUE;
    enabledHypotheticalFeatures.abc = VK_TRUE;

    VkDeviceCreateInfo deviceCreateInfo =
    {
        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                   // sType
        &enabledFeatures,                                                       // pNext
        ...
        NULL,                                                                   // pEnabledFeatures
    }

    VkDevice device;
    vkCreateDevice(physicalDevice, &deviceCreateInfo, NULL, &device);

----------------------------------------

=== Version History

 * Revision 1, 2016-09-12 (Jeff Bolz)
   - Internal revisions

 * Revision 2, 2016-11-02 (Ian Elliott)
   - Added ability for applications to use the physical-device components of
     device extensions before vkCreateDevice is called.
