Vulkan-Hpp
utils.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 // Copyright(c) 2019, NVIDIA CORPORATION. All rights reserved.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 
18 #include <vulkan/vulkan.hpp>
19 
20 #define GLFW_INCLUDE_NONE
21 #include <GLFW/glfw3.h>
22 #include <iostream>
23 #include <limits>
24 #include <map>
25 #include <memory> // std::unique_ptr
26 
27 namespace vk
28 {
29  namespace su
30  {
31  const uint64_t FenceTimeout = 100000000;
32 
33  template <typename Func>
34  void oneTimeSubmit( vk::Device const & device, vk::CommandPool const & commandPool, vk::Queue const & queue, Func const & func )
35  {
36  vk::CommandBuffer commandBuffer =
39  func( commandBuffer );
40  commandBuffer.end();
41  queue.submit( vk::SubmitInfo( 0, nullptr, nullptr, 1, &commandBuffer ), nullptr );
42  queue.waitIdle();
43  }
44 
45  template <class T>
46  void copyToDevice( vk::Device const & device, vk::DeviceMemory const & deviceMemory, T const * pData, size_t count, vk::DeviceSize stride = sizeof( T ) )
47  {
48  assert( sizeof( T ) <= stride );
49  uint8_t * deviceData = static_cast<uint8_t *>( device.mapMemory( deviceMemory, 0, count * stride ) );
50  if ( stride == sizeof( T ) )
51  {
52  memcpy( deviceData, pData, count * sizeof( T ) );
53  }
54  else
55  {
56  for ( size_t i = 0; i < count; i++ )
57  {
58  memcpy( deviceData, &pData[i], sizeof( T ) );
59  deviceData += stride;
60  }
61  }
62  device.unmapMemory( deviceMemory );
63  }
64 
65  template <class T>
66  void copyToDevice( vk::Device const & device, vk::DeviceMemory const & deviceMemory, T const & data )
67  {
68  copyToDevice<T>( device, deviceMemory, &data, 1 );
69  }
70 
71  template <class T>
72  VULKAN_HPP_INLINE constexpr const T & clamp( const T & v, const T & lo, const T & hi )
73  {
74  return v < lo ? lo : hi < v ? hi : v;
75  }
76 
77  void setImageLayout(
78  vk::CommandBuffer const & commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout );
79 
80  struct WindowData
81  {
82  WindowData( GLFWwindow * wnd, std::string const & name, vk::Extent2D const & extent );
83  WindowData( const WindowData & ) = delete;
84  WindowData( WindowData && other );
85  ~WindowData() noexcept;
86 
87  GLFWwindow * handle;
88  std::string name;
90  };
91 
92  WindowData createWindow( std::string const & windowName, vk::Extent2D const & extent );
93 
94  struct BufferData
95  {
96  BufferData( vk::PhysicalDevice const & physicalDevice,
97  vk::Device const & device,
98  vk::DeviceSize size,
101 
102  void clear( vk::Device const & device )
103  {
104  device.destroyBuffer( buffer ); // to prevent some validation layer warning, the Buffer needs to be destroyed before the bound DeviceMemory
105  device.freeMemory( deviceMemory );
106  }
107 
108  template <typename DataType>
109  void upload( vk::Device const & device, DataType const & data ) const
110  {
111  assert( ( m_propertyFlags & vk::MemoryPropertyFlagBits::eHostCoherent ) && ( m_propertyFlags & vk::MemoryPropertyFlagBits::eHostVisible ) );
112  assert( sizeof( DataType ) <= m_size );
113 
114  void * dataPtr = device.mapMemory( deviceMemory, 0, sizeof( DataType ) );
115  memcpy( dataPtr, &data, sizeof( DataType ) );
116  device.unmapMemory( deviceMemory );
117  }
118 
119  template <typename DataType>
120  void upload( vk::Device const & device, std::vector<DataType> const & data, size_t stride = 0 ) const
121  {
122  assert( m_propertyFlags & vk::MemoryPropertyFlagBits::eHostVisible );
123 
124  size_t elementSize = stride ? stride : sizeof( DataType );
125  assert( sizeof( DataType ) <= elementSize );
126 
127  copyToDevice( device, deviceMemory, data.data(), data.size(), elementSize );
128  }
129 
130  template <typename DataType>
131  void upload( vk::PhysicalDevice const & physicalDevice,
132  vk::Device const & device,
133  vk::CommandPool const & commandPool,
134  vk::Queue queue,
135  std::vector<DataType> const & data,
136  size_t stride ) const
137  {
138  assert( m_usage & vk::BufferUsageFlagBits::eTransferDst );
139  assert( m_propertyFlags & vk::MemoryPropertyFlagBits::eDeviceLocal );
140 
141  size_t elementSize = stride ? stride : sizeof( DataType );
142  assert( sizeof( DataType ) <= elementSize );
143 
144  size_t dataSize = data.size() * elementSize;
145  assert( dataSize <= m_size );
146 
147  vk::su::BufferData stagingBuffer( physicalDevice, device, dataSize, vk::BufferUsageFlagBits::eTransferSrc );
148  copyToDevice( device, stagingBuffer.deviceMemory, data.data(), data.size(), elementSize );
149 
150  vk::su::oneTimeSubmit( device,
151  commandPool,
152  queue,
153  [&]( vk::CommandBuffer const & commandBuffer )
154  { commandBuffer.copyBuffer( stagingBuffer.buffer, buffer, vk::BufferCopy( 0, 0, dataSize ) ); } );
155 
156  stagingBuffer.clear( device );
157  }
158 
161 #if !defined( NDEBUG )
162  private:
163  vk::DeviceSize m_size;
164  vk::BufferUsageFlags m_usage;
165  vk::MemoryPropertyFlags m_propertyFlags;
166 #endif
167  };
168 
169  struct ImageData
170  {
171  ImageData( vk::PhysicalDevice const & physicalDevice,
172  vk::Device const & device,
173  vk::Format format,
174  vk::Extent2D const & extent,
175  vk::ImageTiling tiling,
176  vk::ImageUsageFlags usage,
177  vk::ImageLayout initialLayout,
178  vk::MemoryPropertyFlags memoryProperties,
179  vk::ImageAspectFlags aspectMask );
180 
181  void clear( vk::Device const & device )
182  {
183  device.destroyImageView( imageView );
184  device.destroyImage( image ); // the Image should to be destroyed before the bound DeviceMemory is freed
185  device.freeMemory( deviceMemory );
186  }
187 
192  };
193 
194  struct DepthBufferData : public ImageData
195  {
196  DepthBufferData( vk::PhysicalDevice const & physicalDevice, vk::Device const & device, vk::Format format, vk::Extent2D const & extent );
197  };
198 
199  struct SurfaceData
200  {
201  SurfaceData( vk::Instance const & instance, std::string const & windowName, vk::Extent2D const & extent );
202 
206  };
207 
209  {
210  SwapChainData( vk::PhysicalDevice const & physicalDevice,
211  vk::Device const & device,
212  vk::SurfaceKHR const & surface,
213  vk::Extent2D const & extent,
214  vk::ImageUsageFlags usage,
215  vk::SwapchainKHR const & oldSwapChain,
216  uint32_t graphicsFamilyIndex,
217  uint32_t presentFamilyIndex );
218 
219  void clear( vk::Device const & device )
220  {
221  for ( auto & imageView : imageViews )
222  {
223  device.destroyImageView( imageView );
224  }
225  imageViews.clear();
226  images.clear();
227  device.destroySwapchainKHR( swapChain );
228  }
229 
232  std::vector<vk::Image> images;
233  std::vector<vk::ImageView> imageViews;
234  };
235 
237  {
238  public:
239  CheckerboardImageGenerator( std::array<uint8_t, 3> const & rgb0 = { { 0, 0, 0 } }, std::array<uint8_t, 3> const & rgb1 = { { 255, 255, 255 } } );
240 
241  void operator()( void * data, vk::Extent2D & extent ) const;
242 
243  private:
244  std::array<uint8_t, 3> const & m_rgb0;
245  std::array<uint8_t, 3> const & m_rgb1;
246  };
247 
249  {
250  public:
251  MonochromeImageGenerator( std::array<unsigned char, 3> const & rgb );
252 
253  void operator()( void * data, vk::Extent2D const & extent ) const;
254 
255  private:
256  std::array<unsigned char, 3> const & m_rgb;
257  };
258 
260  {
261  public:
262  PixelsImageGenerator( vk::Extent2D const & extent, size_t channels, unsigned char const * pixels );
263 
264  void operator()( void * data, vk::Extent2D const & extent ) const;
265 
266  private:
267  vk::Extent2D m_extent;
268  size_t m_channels;
269  unsigned char const * m_pixels;
270  };
271 
272  struct TextureData
273  {
274  TextureData( vk::PhysicalDevice const & physicalDevice,
275  vk::Device const & device,
276  vk::Extent2D const & extent_ = { 256, 256 },
277  vk::ImageUsageFlags usageFlags = {},
278  vk::FormatFeatureFlags formatFeatureFlags = {},
279  bool anisotropyEnable = false,
280  bool forceStaging = false );
281 
282  void clear( vk::Device const & device )
283  {
284  if ( stagingBufferData )
285  {
286  stagingBufferData->clear( device );
287  }
288  imageData->clear( device );
289  device.destroySampler( sampler );
290  }
291 
292  template <typename ImageGenerator>
293  void setImage( vk::Device const & device, vk::CommandBuffer const & commandBuffer, ImageGenerator const & imageGenerator )
294  {
295  void * data = needsStaging
296  ? device.mapMemory( stagingBufferData->deviceMemory, 0, device.getBufferMemoryRequirements( stagingBufferData->buffer ).size )
297  : device.mapMemory( imageData->deviceMemory, 0, device.getImageMemoryRequirements( imageData->image ).size );
298  imageGenerator( data, extent );
299  device.unmapMemory( needsStaging ? stagingBufferData->deviceMemory : imageData->deviceMemory );
300 
301  if ( needsStaging )
302  {
303  // Since we're going to blit to the texture image, set its layout to eTransferDstOptimal
304  vk::su::setImageLayout( commandBuffer, imageData->image, imageData->format, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal );
305  vk::BufferImageCopy copyRegion( 0,
306  extent.width,
307  extent.height,
309  vk::Offset3D( 0, 0, 0 ),
310  vk::Extent3D( extent, 1 ) );
311  commandBuffer.copyBufferToImage( stagingBufferData->buffer, imageData->image, vk::ImageLayout::eTransferDstOptimal, copyRegion );
312  // Set the layout for the texture image from eTransferDstOptimal to SHADER_READ_ONLY
314  commandBuffer, imageData->image, imageData->format, vk::ImageLayout::eTransferDstOptimal, vk::ImageLayout::eShaderReadOnlyOptimal );
315  }
316  else
317  {
318  // If we can use the linear tiled image as a texture, just do it
320  commandBuffer, imageData->image, imageData->format, vk::ImageLayout::ePreinitialized, vk::ImageLayout::eShaderReadOnlyOptimal );
321  }
322  }
323 
327  std::unique_ptr<BufferData> stagingBufferData;
328  std::unique_ptr<ImageData> imageData;
330  };
331 
332  struct UUID
333  {
334  public:
335  UUID( uint8_t const data[VK_UUID_SIZE] );
336 
337  uint8_t m_data[VK_UUID_SIZE];
338  };
339 
340  template <typename TargetType, typename SourceType>
341  VULKAN_HPP_INLINE TargetType checked_cast( SourceType value )
342  {
343  static_assert( sizeof( TargetType ) <= sizeof( SourceType ), "No need to cast from smaller to larger type!" );
344  static_assert( std::numeric_limits<SourceType>::is_integer, "Only integer types supported!" );
345  static_assert( !std::numeric_limits<SourceType>::is_signed, "Only unsigned types supported!" );
346  static_assert( std::numeric_limits<TargetType>::is_integer, "Only integer types supported!" );
347  static_assert( !std::numeric_limits<TargetType>::is_signed, "Only unsigned types supported!" );
348  assert( value <= std::numeric_limits<TargetType>::max() );
349  return static_cast<TargetType>( value );
350  }
351 
353  vk::PhysicalDeviceMemoryProperties const & memoryProperties,
354  vk::MemoryRequirements const & memoryRequirements,
355  vk::MemoryPropertyFlags memoryPropertyFlags );
356  bool contains( std::vector<vk::ExtensionProperties> const & extensionProperties, std::string const & extensionName );
357  vk::DescriptorPool createDescriptorPool( vk::Device const & device, std::vector<vk::DescriptorPoolSize> const & poolSizes );
359  std::vector<std::tuple<vk::DescriptorType, uint32_t, vk::ShaderStageFlags>> const & bindingData,
361  vk::Device createDevice( vk::PhysicalDevice const & physicalDevice,
362  uint32_t queueFamilyIndex,
363  std::vector<std::string> const & extensions = {},
364  vk::PhysicalDeviceFeatures const * physicalDeviceFeatures = nullptr,
365  void const * pNext = nullptr );
366  std::vector<vk::Framebuffer> createFramebuffers( vk::Device const & device,
367  vk::RenderPass & renderPass,
368  std::vector<vk::ImageView> const & imageViews,
369  vk::ImageView const & depthImageView,
370  vk::Extent2D const & extent );
372  vk::PipelineCache const & pipelineCache,
373  std::pair<vk::ShaderModule, vk::SpecializationInfo const *> const & vertexShaderData,
374  std::pair<vk::ShaderModule, vk::SpecializationInfo const *> const & fragmentShaderData,
375  uint32_t vertexStride,
376  std::vector<std::pair<vk::Format, uint32_t>> const & vertexInputAttributeFormatOffset,
377  vk::FrontFace frontFace,
378  bool depthBuffered,
379  vk::PipelineLayout const & pipelineLayout,
380  vk::RenderPass const & renderPass );
381  vk::Instance createInstance( std::string const & appName,
382  std::string const & engineName,
383  std::vector<std::string> const & layers = {},
384  std::vector<std::string> const & extensions = {},
385  uint32_t apiVersion = VK_API_VERSION_1_0 );
387  vk::Format colorFormat,
388  vk::Format depthFormat,
391  VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
392  VkDebugUtilsMessageTypeFlagsEXT messageTypes,
393  VkDebugUtilsMessengerCallbackDataEXT const * pCallbackData,
394  void * /*pUserData*/ );
395  uint32_t findGraphicsQueueFamilyIndex( std::vector<vk::QueueFamilyProperties> const & queueFamilyProperties );
396  std::pair<uint32_t, uint32_t> findGraphicsAndPresentQueueFamilyIndex( vk::PhysicalDevice physicalDevice, vk::SurfaceKHR const & surface );
397  uint32_t findMemoryType( vk::PhysicalDeviceMemoryProperties const & memoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirementsMask );
398  std::vector<char const *> gatherExtensions( std::vector<std::string> const & extensions
399 #if !defined( NDEBUG )
400  ,
401  std::vector<vk::ExtensionProperties> const & extensionProperties
402 #endif
403  );
404  std::vector<char const *> gatherLayers( std::vector<std::string> const & layers
405 #if !defined( NDEBUG )
406  ,
407  std::vector<vk::LayerProperties> const & layerProperties
408 #endif
409  );
410  std::vector<std::string> getDeviceExtensions();
411  std::vector<std::string> getInstanceExtensions();
413 #if defined( NDEBUG )
415 #else
417 #endif
418  makeInstanceCreateInfoChain( vk::ApplicationInfo const & applicationInfo,
419  std::vector<char const *> const & layers,
420  std::vector<char const *> const & extensions );
421  vk::Format pickDepthFormat( vk::PhysicalDevice const & physicalDevice );
422  vk::PresentModeKHR pickPresentMode( std::vector<vk::PresentModeKHR> const & presentModes );
423  vk::SurfaceFormatKHR pickSurfaceFormat( std::vector<vk::SurfaceFormatKHR> const & formats );
424  void submitAndWait( vk::Device const & device, vk::Queue const & queue, vk::CommandBuffer const & commandBuffer );
425  void updateDescriptorSets( vk::Device const & device,
426  vk::DescriptorSet const & descriptorSet,
427  std::vector<std::tuple<vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const &>> const & bufferData,
428  vk::su::TextureData const & textureData,
429  uint32_t bindingOffset = 0 );
430  void updateDescriptorSets( vk::Device const & device,
431  vk::DescriptorSet const & descriptorSet,
432  std::vector<std::tuple<vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const &>> const & bufferData,
433  std::vector<vk::su::TextureData> const & textureData,
434  uint32_t bindingOffset = 0 );
435 
436  } // namespace su
437 } // namespace vk
438 
439 std::ostream & operator<<( std::ostream & os, vk::su::UUID const & uuid );
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS ResultValueType< void >::type end(Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const
void copyBufferToImage(vk::Buffer srcBuffer, vk::Image dstImage, vk::ImageLayout dstImageLayout, uint32_t regionCount, const vk::BufferImageCopy *pRegions, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result begin(const vk::CommandBufferBeginInfo *pBeginInfo, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void copyBuffer(vk::Buffer srcBuffer, vk::Buffer dstBuffer, uint32_t regionCount, const vk::BufferCopy *pRegions, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void getImageMemoryRequirements(vk::Image image, vk::MemoryRequirements *pMemoryRequirements, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void unmapMemory(vk::DeviceMemory memory, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyImageView(vk::ImageView imageView, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result mapMemory(vk::DeviceMemory memory, vk::DeviceSize offset, vk::DeviceSize size, vk::MemoryMapFlags flags, void **ppData, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroySampler(vk::Sampler sampler, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void freeMemory(vk::DeviceMemory memory, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyBuffer(vk::Buffer buffer, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyImage(vk::Image image, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result allocateCommandBuffers(const vk::CommandBufferAllocateInfo *pAllocateInfo, vk::CommandBuffer *pCommandBuffers, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void getBufferMemoryRequirements(vk::Buffer buffer, vk::MemoryRequirements *pMemoryRequirements, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroySwapchainKHR(vk::SwapchainKHR swapchain, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result submit(uint32_t submitCount, const vk::SubmitInfo *pSubmits, vk::Fence fence, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS ResultValueType< void >::type waitIdle(Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const
Definition: vulkan.hpp:854
uint32_t findGraphicsQueueFamilyIndex(std::vector< vk::QueueFamilyProperties > const &queueFamilyProperties)
Definition: utils.cpp:409
std::vector< vk::Framebuffer > createFramebuffers(vk::Device const &device, vk::RenderPass &renderPass, std::vector< vk::ImageView > const &imageViews, vk::ImageView const &depthImageView, vk::Extent2D const &extent)
Definition: utils.cpp:111
vk::DebugUtilsMessengerCreateInfoEXT makeDebugUtilsMessengerCreateInfoEXT()
Definition: utils.cpp:1025
vk::DeviceMemory allocateDeviceMemory(vk::Device const &device, vk::PhysicalDeviceMemoryProperties const &memoryProperties, vk::MemoryRequirements const &memoryRequirements, vk::MemoryPropertyFlags memoryPropertyFlags)
Definition: utils.cpp:44
void copyToDevice(vk::Device const &device, vk::DeviceMemory const &deviceMemory, T const *pData, size_t count, vk::DeviceSize stride=sizeof(T))
Definition: utils.hpp:46
vk::RenderPass createRenderPass(vk::Device const &device, vk::Format colorFormat, vk::Format depthFormat, vk::AttachmentLoadOp loadOp, vk::ImageLayout colorFinalLayout)
Definition: utils.cpp:314
vk::Pipeline createGraphicsPipeline(vk::Device const &device, vk::PipelineCache const &pipelineCache, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &vertexShaderData, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &fragmentShaderData, uint32_t vertexStride, std::vector< std::pair< vk::Format, uint32_t >> const &vertexInputAttributeFormatOffset, vk::FrontFace frontFace, bool depthBuffered, vk::PipelineLayout const &pipelineLayout, vk::RenderPass const &renderPass)
Definition: utils.cpp:133
vk::StructureChain< vk::InstanceCreateInfo, vk::DebugUtilsMessengerCreateInfoEXT > makeInstanceCreateInfoChain(vk::ApplicationInfo const &applicationInfo, std::vector< char const * > const &layers, std::vector< char const * > const &extensions)
Definition: utils.cpp:1039
uint32_t findMemoryType(vk::PhysicalDeviceMemoryProperties const &memoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirementsMask)
Definition: utils.cpp:456
void setImageLayout(vk::CommandBuffer const &commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout)
Definition: utils.cpp:574
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
const uint64_t FenceTimeout
Definition: utils.hpp:31
vk::Device createDevice(vk::PhysicalDevice const &physicalDevice, uint32_t queueFamilyIndex, std::vector< std::string > const &extensions, vk::PhysicalDeviceFeatures const *physicalDeviceFeatures, void const *pNext)
Definition: utils.cpp:86
void oneTimeSubmit(vk::Device const &device, vk::CommandPool const &commandPool, vk::Queue const &queue, Func const &func)
Definition: utils.hpp:34
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, VkDebugUtilsMessengerCallbackDataEXT const *pCallbackData, void *)
Definition: utils.cpp:351
vk::DescriptorSetLayout createDescriptorSetLayout(vk::Device const &device, std::vector< std::tuple< vk::DescriptorType, uint32_t, vk::ShaderStageFlags >> const &bindingData, vk::DescriptorSetLayoutCreateFlags flags)
Definition: utils.cpp:73
WindowData createWindow(std::string const &windowName, vk::Extent2D const &extent)
Definition: utils.cpp:996
std::vector< char const * > gatherLayers(std::vector< std::string > const &layers, std::vector< vk::LayerProperties > const &layerProperties)
Definition: utils.cpp:252
std::pair< uint32_t, uint32_t > findGraphicsAndPresentQueueFamilyIndex(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR const &surface)
Definition: utils.cpp:420
void submitAndWait(vk::Device const &device, vk::Queue const &queue, vk::CommandBuffer const &commandBuffer)
Definition: utils.cpp:651
std::vector< char const * > gatherExtensions(std::vector< std::string > const &extensions, std::vector< vk::ExtensionProperties > const &extensionProperties)
Definition: utils.cpp:224
std::vector< std::string > getInstanceExtensions()
Definition: utils.cpp:477
void updateDescriptorSets(vk::Device const &device, vk::DescriptorSet const &descriptorSet, std::vector< std::tuple< vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const & >> const &bufferData, vk::su::TextureData const &textureData, uint32_t bindingOffset)
Definition: utils.cpp:660
vk::DescriptorPool createDescriptorPool(vk::Device const &device, std::vector< vk::DescriptorPoolSize > const &poolSizes)
Definition: utils.cpp:62
bool contains(std::vector< vk::ExtensionProperties > const &extensionProperties, std::string const &extensionName)
Definition: utils.cpp:54
vk::Format pickDepthFormat(vk::PhysicalDevice const &physicalDevice)
Definition: utils.cpp:505
vk::PresentModeKHR pickPresentMode(std::vector< vk::PresentModeKHR > const &presentModes)
Definition: utils.cpp:520
vk::SurfaceFormatKHR pickSurfaceFormat(std::vector< vk::SurfaceFormatKHR > const &formats)
Definition: utils.cpp:539
constexpr VULKAN_HPP_INLINE const T & clamp(const T &v, const T &lo, const T &hi)
Definition: utils.hpp:72
std::vector< std::string > getDeviceExtensions()
Definition: utils.cpp:472
VULKAN_HPP_INLINE TargetType checked_cast(SourceType value)
Definition: utils.hpp:341
Definition: vulkan.cppm:23
uint64_t DeviceSize
Definition: vulkan.hpp:6122
PresentModeKHR
AttachmentLoadOp
vk::DeviceMemory deviceMemory
Definition: utils.hpp:160
void clear(vk::Device const &device)
Definition: utils.hpp:102
void upload(vk::Device const &device, DataType const &data) const
Definition: utils.hpp:109
void upload(vk::Device const &device, std::vector< DataType > const &data, size_t stride=0) const
Definition: utils.hpp:120
void upload(vk::PhysicalDevice const &physicalDevice, vk::Device const &device, vk::CommandPool const &commandPool, vk::Queue queue, std::vector< DataType > const &data, size_t stride) const
Definition: utils.hpp:131
vk::Buffer buffer
Definition: utils.hpp:159
vk::DeviceMemory deviceMemory
Definition: utils.hpp:190
vk::ImageView imageView
Definition: utils.hpp:191
void clear(vk::Device const &device)
Definition: utils.hpp:181
vk::Image image
Definition: utils.hpp:189
vk::Format format
Definition: utils.hpp:188
WindowData window
Definition: utils.hpp:204
vk::Extent2D extent
Definition: utils.hpp:203
vk::SurfaceKHR surface
Definition: utils.hpp:205
vk::SwapchainKHR swapChain
Definition: utils.hpp:231
std::vector< vk::ImageView > imageViews
Definition: utils.hpp:233
vk::Format colorFormat
Definition: utils.hpp:230
void clear(vk::Device const &device)
Definition: utils.hpp:219
std::vector< vk::Image > images
Definition: utils.hpp:232
std::unique_ptr< BufferData > stagingBufferData
Definition: utils.hpp:327
void clear(vk::Device const &device)
Definition: utils.hpp:282
void setImage(vk::Device const &device, vk::CommandBuffer const &commandBuffer, ImageGenerator const &imageGenerator)
Definition: utils.hpp:293
vk::Extent2D extent
Definition: utils.hpp:325
vk::Format format
Definition: utils.hpp:324
vk::Sampler sampler
Definition: utils.hpp:329
std::unique_ptr< ImageData > imageData
Definition: utils.hpp:328
GLFWwindow * handle
Definition: utils.hpp:87
WindowData(const WindowData &)=delete
vk::Extent2D extent
Definition: utils.hpp:89
WindowData(GLFWwindow *wnd, std::string const &name, vk::Extent2D const &extent)
Definition: utils.cpp:982
std::string name
Definition: utils.hpp:88
~WindowData() noexcept
Definition: utils.cpp:991
std::ostream & operator<<(std::ostream &os, vk::su::UUID const &uuid)
Definition: utils.cpp:1061
#define VK_API_VERSION_1_0
Definition: vulkan_core.h:69
VkFlags VkDebugUtilsMessageTypeFlagsEXT
#define VK_UUID_SIZE
Definition: vulkan_core.h:135
uint32_t VkBool32
Definition: vulkan_core.h:94
VkDebugUtilsMessageSeverityFlagBitsEXT
#define VULKAN_HPP_INLINE