Vulkan-Hpp
SurfaceCapabilities.cpp
Go to the documentation of this file.
1 // Copyright(c) 2019, NVIDIA CORPORATION. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // VulkanHpp Samples : SurfaceCapabilities
16 // Get surface capabilities.
17 
18 #include "../utils/utils.hpp"
19 
20 #include <iomanip>
21 #include <sstream>
22 #include <vector>
24 
25 static char const * AppName = "SurfaceCapabilities";
26 static char const * EngineName = "Vulkan.hpp";
27 
28 void cout( vk::SurfaceCapabilitiesKHR const & surfaceCapabilities )
29 {
30  std::cout << std::string( "\t" ) << "Capabilities:\n";
31  std::cout << std::string( "\t\t" ) << "currentExtent = " << surfaceCapabilities.currentExtent.width << " x "
32  << surfaceCapabilities.currentExtent.height << "\n";
33  std::cout << std::string( "\t\t" ) << "currentTransform = " << vk::to_string( surfaceCapabilities.currentTransform ) << "\n";
34  std::cout << std::string( "\t\t" ) << "maxImageArrayLayers = " << surfaceCapabilities.maxImageArrayLayers << "\n";
35  std::cout << std::string( "\t\t" ) << "maxImageCount = " << surfaceCapabilities.maxImageCount << "\n";
36  std::cout << std::string( "\t\t" ) << "maxImageExtent = " << surfaceCapabilities.maxImageExtent.width << " x "
37  << surfaceCapabilities.maxImageExtent.height << "\n";
38  std::cout << std::string( "\t\t" ) << "minImageCount = " << surfaceCapabilities.minImageCount << "\n";
39  std::cout << std::string( "\t\t" ) << "minImageExtent = " << surfaceCapabilities.minImageExtent.width << " x "
40  << surfaceCapabilities.minImageExtent.height << "\n";
41  std::cout << std::string( "\t\t" ) << "supportedCompositeAlpha = " << vk::to_string( surfaceCapabilities.supportedCompositeAlpha ) << "\n";
42  std::cout << std::string( "\t\t" ) << "supportedTransforms = " << vk::to_string( surfaceCapabilities.supportedTransforms ) << "\n";
43  std::cout << std::string( "\t\t" ) << "supportedUsageFlags = " << vk::to_string( surfaceCapabilities.supportedUsageFlags ) << "\n";
44  std::cout << "\n";
45 }
46 
47 int main( int /*argc*/, char ** /*argv*/ )
48 {
49  try
50  {
51  // need to initialize the dynamic dispatcher before the very first vulkan call
52 #if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )
54 #endif
55 
56  std::vector<vk::ExtensionProperties> instanceExtensionProperties = vk::enumerateInstanceExtensionProperties();
57  auto propertyIterator =
58  std::find_if( instanceExtensionProperties.begin(),
59  instanceExtensionProperties.end(),
60  []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME ) == 0; } );
61  bool supportsGetSurfaceCapabilities2 = ( propertyIterator != instanceExtensionProperties.end() );
62 
63  std::vector<std::string> extensions = vk::su::getInstanceExtensions();
64  if ( supportsGetSurfaceCapabilities2 )
65  {
67  }
68 
69  vk::Instance instance = vk::su::createInstance( AppName, EngineName, {}, extensions );
70 #if !defined( NDEBUG )
72 #endif
73 
74  // enumerate the physicalDevices
75  std::vector<vk::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
76 
77  vk::su::SurfaceData surfaceData( instance, AppName, vk::Extent2D( 500, 500 ) );
78 
79  /* VULKAN_KEY_START */
80 
81  std::cout << std::boolalpha;
82  for ( size_t i = 0; i < physicalDevices.size(); i++ )
83  {
84  // some properties are only valid, if a corresponding extension is available!
85  std::vector<vk::ExtensionProperties> extensionProperties = physicalDevices[i].enumerateDeviceExtensionProperties();
86 
87  std::cout << "PhysicalDevice " << i << "\n";
88  if ( supportsGetSurfaceCapabilities2 )
89  {
90  auto surfaceCapabilities2 = physicalDevices[i]
91  .getSurfaceCapabilities2KHR<vk::SurfaceCapabilities2KHR,
95 
96  vk::SurfaceCapabilitiesKHR const & surfaceCapabilities = surfaceCapabilities2.get<vk::SurfaceCapabilities2KHR>().surfaceCapabilities;
97  cout( surfaceCapabilities );
98 
99  if ( vk::su::contains( extensionProperties, "VK_AMD_display_native_hdr" ) )
100  {
101  vk::DisplayNativeHdrSurfaceCapabilitiesAMD displayNativeHdrSurfaceCapabilities =
102  surfaceCapabilities2.get<vk::DisplayNativeHdrSurfaceCapabilitiesAMD>();
103  std::cout << std::string( "\t" ) << "DisplayNativeHdrSurfaceCapabilitiesAMD:\n";
104  std::cout << std::string( "\t\t" ) << "localDimmingSupport = " << !!displayNativeHdrSurfaceCapabilities.localDimmingSupport << "\n";
105  std::cout << "\n";
106  }
107 
108  if ( vk::su::contains( extensionProperties, "VK_KHR_shared_presentable_image" ) )
109  {
110  vk::SharedPresentSurfaceCapabilitiesKHR sharedPresentSurfaceCapabilities = surfaceCapabilities2.get<vk::SharedPresentSurfaceCapabilitiesKHR>();
111  std::cout << std::string( "\t" ) << "SharedPresentSurfaceCapabilitiesKHR:\n";
112  std::cout << std::string( "\t\t" )
113  << "sharedPresentSupportedUsageFlags = " << vk::to_string( sharedPresentSurfaceCapabilities.sharedPresentSupportedUsageFlags ) << "\n";
114  std::cout << "\n";
115  }
116 
117  if ( vk::su::contains( extensionProperties, "VK_KHR_surface_protected_capabilities" ) )
118  {
119  vk::SurfaceProtectedCapabilitiesKHR surfaceProtectedCapabilities = surfaceCapabilities2.get<vk::SurfaceProtectedCapabilitiesKHR>();
120  std::cout << std::string( "\t" ) << "SurfaceProtectedCapabilitiesKHR:\n";
121  std::cout << std::string( "\t\t" ) << "supportsProtected = " << !!surfaceProtectedCapabilities.supportsProtected << "\n";
122  std::cout << "\n";
123  }
124  }
125  else
126  {
127  vk::SurfaceCapabilitiesKHR surfaceCapabilities = physicalDevices[i].getSurfaceCapabilitiesKHR( surfaceData.surface );
128  cout( surfaceCapabilities );
129  }
130  }
131 
132  /* VULKAN_KEY_END */
133 
134  instance.destroySurfaceKHR( surfaceData.surface );
135 #if !defined( NDEBUG )
136  instance.destroyDebugUtilsMessengerEXT( debugUtilsMessenger );
137 #endif
138  instance.destroy();
139  }
140  catch ( vk::SystemError & err )
141  {
142  std::cout << "vk::SystemError: " << err.what() << std::endl;
143  exit( -1 );
144  }
145  catch ( std::exception & err )
146  {
147  std::cout << "std::exception: " << err.what() << std::endl;
148  exit( -1 );
149  }
150  catch ( ... )
151  {
152  std::cout << "unknown error\n";
153  exit( -1 );
154  }
155  return 0;
156 }
void cout(vk::SurfaceCapabilitiesKHR const &surfaceCapabilities)
int main(int, char **)
VULKAN_HPP_NODISCARD Result createDebugUtilsMessengerEXT(const vk::DebugUtilsMessengerCreateInfoEXT *pCreateInfo, const vk::AllocationCallbacks *pAllocator, vk::DebugUtilsMessengerEXT *pMessenger, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroy(const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result enumeratePhysicalDevices(uint32_t *pPhysicalDeviceCount, vk::PhysicalDevice *pPhysicalDevices, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroySurfaceKHR(vk::SurfaceKHR surface, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyDebugUtilsMessengerEXT(vk::DebugUtilsMessengerEXT messenger, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
virtual const char * what() const VULKAN_HPP_NOEXCEPT
Definition: vulkan.hpp:6206
vk::DebugUtilsMessengerCreateInfoEXT makeDebugUtilsMessengerCreateInfoEXT()
Definition: utils.cpp:1025
vk::Instance createInstance(std::string const &appName, std::string const &engineName, std::vector< std::string > const &layers, std::vector< std::string > const &extensions, uint32_t apiVersion)
Definition: utils.cpp:279
std::vector< std::string > getInstanceExtensions()
Definition: utils.cpp:477
bool contains(std::vector< vk::ExtensionProperties > const &extensionProperties, std::string const &extensionName)
Definition: utils.cpp:54
VULKAN_HPP_INLINE std::string to_string(FormatFeatureFlags value)
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, vk::ExtensionProperties *pProperties, Dispatch const &d) VULKAN_HPP_NOEXCEPT
vk::SurfaceTransformFlagsKHR supportedTransforms
vk::SurfaceTransformFlagBitsKHR currentTransform
vk::ImageUsageFlags supportedUsageFlags
vk::CompositeAlphaFlagsKHR supportedCompositeAlpha
vk::SurfaceKHR surface
Definition: utils.hpp:205
#define VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME
Definition: vulkan_core.h:9598
#define VULKAN_HPP_DEFAULT_DISPATCHER