20 #define GLFW_INCLUDE_NONE
21 #include <GLFW/glfw3.h>
33 template <
typename Func>
39 func( commandBuffer );
48 assert(
sizeof( T ) <= stride );
49 uint8_t * deviceData =
static_cast<uint8_t *
>( device.
mapMemory( deviceMemory, 0, count * stride ) );
50 if ( stride ==
sizeof( T ) )
52 memcpy( deviceData, pData, count *
sizeof( T ) );
56 for (
size_t i = 0; i < count; i++ )
58 memcpy( deviceData, &pData[i],
sizeof( T ) );
68 copyToDevice<T>( device, deviceMemory, &data, 1 );
74 return v < lo ? lo : hi < v ? hi : v;
108 template <
typename DataType>
112 assert(
sizeof( DataType ) <= m_size );
114 void * dataPtr = device.
mapMemory( deviceMemory, 0,
sizeof( DataType ) );
115 memcpy( dataPtr, &data,
sizeof( DataType ) );
119 template <
typename DataType>
120 void upload(
vk::Device const & device, std::vector<DataType>
const & data,
size_t stride = 0 )
const
124 size_t elementSize = stride ? stride :
sizeof( DataType );
125 assert(
sizeof( DataType ) <= elementSize );
127 copyToDevice( device, deviceMemory, data.data(), data.size(), elementSize );
130 template <
typename DataType>
135 std::vector<DataType>
const & data,
136 size_t stride )
const
141 size_t elementSize = stride ? stride :
sizeof( DataType );
142 assert(
sizeof( DataType ) <= elementSize );
144 size_t dataSize = data.size() * elementSize;
145 assert( dataSize <= m_size );
156 stagingBuffer.
clear( device );
161 #if !defined( NDEBUG )
216 uint32_t graphicsFamilyIndex,
217 uint32_t presentFamilyIndex );
221 for (
auto & imageView : imageViews )
239 CheckerboardImageGenerator( std::array<uint8_t, 3>
const & rgb0 = { { 0, 0, 0 } }, std::array<uint8_t, 3>
const & rgb1 = { { 255, 255, 255 } } );
244 std::array<uint8_t, 3>
const & m_rgb0;
245 std::array<uint8_t, 3>
const & m_rgb1;
256 std::array<unsigned char, 3>
const & m_rgb;
269 unsigned char const * m_pixels;
279 bool anisotropyEnable =
false,
280 bool forceStaging = false );
284 if ( stagingBufferData )
286 stagingBufferData->clear( device );
288 imageData->clear( device );
292 template <
typename ImageGenerator>
295 void * data = needsStaging
298 imageGenerator( data,
extent );
299 device.
unmapMemory( needsStaging ? stagingBufferData->deviceMemory : imageData->deviceMemory );
340 template <
typename TargetType,
typename SourceType>
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 );
356 bool contains( std::vector<vk::ExtensionProperties>
const & extensionProperties, std::string
const & extensionName );
359 std::vector<std::tuple<vk::DescriptorType, uint32_t, vk::ShaderStageFlags>>
const & bindingData,
362 uint32_t queueFamilyIndex,
363 std::vector<std::string>
const & extensions = {},
365 void const * pNext = nullptr );
368 std::vector<vk::ImageView>
const & imageViews,
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,
382 std::string
const & engineName,
383 std::vector<std::string>
const & layers = {},
384 std::vector<std::string>
const & extensions = {},
398 std::vector<char const *>
gatherExtensions( std::vector<std::string>
const & extensions
399 #
if !defined( NDEBUG )
401 std::vector<vk::ExtensionProperties>
const & extensionProperties
404 std::vector<char const *>
gatherLayers( std::vector<std::string>
const & layers
405 #
if !defined( NDEBUG )
407 std::vector<vk::LayerProperties>
const & layerProperties
413 #if defined( NDEBUG )
419 std::vector<char const *>
const & layers,
420 std::vector<char const *>
const & extensions );
427 std::vector<std::tuple<vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const &>>
const & bufferData,
429 uint32_t bindingOffset = 0 );
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 );
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
uint32_t findGraphicsQueueFamilyIndex(std::vector< vk::QueueFamilyProperties > const &queueFamilyProperties)
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)
vk::DebugUtilsMessengerCreateInfoEXT makeDebugUtilsMessengerCreateInfoEXT()
vk::DeviceMemory allocateDeviceMemory(vk::Device const &device, vk::PhysicalDeviceMemoryProperties const &memoryProperties, vk::MemoryRequirements const &memoryRequirements, vk::MemoryPropertyFlags memoryPropertyFlags)
void copyToDevice(vk::Device const &device, vk::DeviceMemory const &deviceMemory, T const *pData, size_t count, vk::DeviceSize stride=sizeof(T))
vk::RenderPass createRenderPass(vk::Device const &device, vk::Format colorFormat, vk::Format depthFormat, vk::AttachmentLoadOp loadOp, vk::ImageLayout colorFinalLayout)
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)
vk::StructureChain< vk::InstanceCreateInfo, vk::DebugUtilsMessengerCreateInfoEXT > makeInstanceCreateInfoChain(vk::ApplicationInfo const &applicationInfo, std::vector< char const * > const &layers, std::vector< char const * > const &extensions)
uint32_t findMemoryType(vk::PhysicalDeviceMemoryProperties const &memoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirementsMask)
void setImageLayout(vk::CommandBuffer const &commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout)
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)
const uint64_t FenceTimeout
vk::Device createDevice(vk::PhysicalDevice const &physicalDevice, uint32_t queueFamilyIndex, std::vector< std::string > const &extensions, vk::PhysicalDeviceFeatures const *physicalDeviceFeatures, void const *pNext)
void oneTimeSubmit(vk::Device const &device, vk::CommandPool const &commandPool, vk::Queue const &queue, Func const &func)
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, VkDebugUtilsMessengerCallbackDataEXT const *pCallbackData, void *)
vk::DescriptorSetLayout createDescriptorSetLayout(vk::Device const &device, std::vector< std::tuple< vk::DescriptorType, uint32_t, vk::ShaderStageFlags >> const &bindingData, vk::DescriptorSetLayoutCreateFlags flags)
WindowData createWindow(std::string const &windowName, vk::Extent2D const &extent)
std::vector< char const * > gatherLayers(std::vector< std::string > const &layers, std::vector< vk::LayerProperties > const &layerProperties)
std::pair< uint32_t, uint32_t > findGraphicsAndPresentQueueFamilyIndex(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR const &surface)
void submitAndWait(vk::Device const &device, vk::Queue const &queue, vk::CommandBuffer const &commandBuffer)
std::vector< char const * > gatherExtensions(std::vector< std::string > const &extensions, std::vector< vk::ExtensionProperties > const &extensionProperties)
std::vector< std::string > getInstanceExtensions()
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)
vk::DescriptorPool createDescriptorPool(vk::Device const &device, std::vector< vk::DescriptorPoolSize > const &poolSizes)
bool contains(std::vector< vk::ExtensionProperties > const &extensionProperties, std::string const &extensionName)
vk::Format pickDepthFormat(vk::PhysicalDevice const &physicalDevice)
vk::PresentModeKHR pickPresentMode(std::vector< vk::PresentModeKHR > const &presentModes)
vk::SurfaceFormatKHR pickSurfaceFormat(std::vector< vk::SurfaceFormatKHR > const &formats)
constexpr VULKAN_HPP_INLINE const T & clamp(const T &v, const T &lo, const T &hi)
std::vector< std::string > getDeviceExtensions()
VULKAN_HPP_INLINE TargetType checked_cast(SourceType value)
vk::DeviceMemory deviceMemory
void clear(vk::Device const &device)
void upload(vk::Device const &device, DataType const &data) const
void upload(vk::Device const &device, std::vector< DataType > const &data, size_t stride=0) const
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
vk::DeviceMemory deviceMemory
void clear(vk::Device const &device)
vk::SwapchainKHR swapChain
std::vector< vk::ImageView > imageViews
void clear(vk::Device const &device)
std::vector< vk::Image > images
std::unique_ptr< BufferData > stagingBufferData
void clear(vk::Device const &device)
void setImage(vk::Device const &device, vk::CommandBuffer const &commandBuffer, ImageGenerator const &imageGenerator)
std::unique_ptr< ImageData > imageData
WindowData(const WindowData &)=delete
WindowData(GLFWwindow *wnd, std::string const &name, vk::Extent2D const &extent)
std::ostream & operator<<(std::ostream &os, vk::su::UUID const &uuid)
#define VK_API_VERSION_1_0
VkFlags VkDebugUtilsMessageTypeFlagsEXT
VkDebugUtilsMessageSeverityFlagBitsEXT
#define VULKAN_HPP_INLINE