2020-03-09 12:30:07 +01:00
|
|
|
#include "VulkanInitializer.h"
|
2020-04-01 02:17:49 +02:00
|
|
|
#include <iostream>
|
2020-03-09 12:30:07 +01:00
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
using namespace Seele::Vulkan;
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkApplicationInfo init::ApplicationInfo(const char *appName, uint32_t appVersion, const char *engineName, uint32_t engineVersion, uint32_t apiVersion)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkApplicationInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
|
|
|
|
|
info.pApplicationName = appName;
|
|
|
|
|
info.applicationVersion = appVersion;
|
|
|
|
|
info.pEngineName = engineName;
|
|
|
|
|
info.engineVersion = engineVersion;
|
2020-04-12 15:47:19 +02:00
|
|
|
info.apiVersion = apiVersion;
|
2020-03-09 12:30:07 +01:00
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkInstanceCreateInfo init::InstanceCreateInfo(VkApplicationInfo *appInfo, const Array<const char *> &extensions, const Array<const char *> &layers)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkInstanceCreateInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
|
|
|
|
info.pApplicationInfo = appInfo;
|
|
|
|
|
info.enabledExtensionCount = (uint32_t)extensions.size();
|
|
|
|
|
info.ppEnabledExtensionNames = extensions.data();
|
|
|
|
|
info.enabledLayerCount = (uint32_t)layers.size();
|
|
|
|
|
info.ppEnabledLayerNames = layers.data();
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDebugReportCallbackCreateInfoEXT init::DebugReportCallbackCreateInfo(VkDebugReportFlagsEXT flags)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkDebugReportCallbackCreateInfoEXT createInfo = {};
|
|
|
|
|
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
|
|
|
|
createInfo.flags = flags;
|
|
|
|
|
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT)debugCallback;
|
|
|
|
|
return createInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDeviceQueueCreateInfo init::DeviceQueueCreateInfo(int queueFamilyIndex, int queueCount)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
float priority = 1.0f;
|
|
|
|
|
return DeviceQueueCreateInfo(queueFamilyIndex, queueCount, &priority);
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDeviceQueueCreateInfo init::DeviceQueueCreateInfo(int queueFamilyIndex, int queueCount, float *queuePriority)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkDeviceQueueCreateInfo createInfo = {};
|
|
|
|
|
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
|
|
|
|
createInfo.queueFamilyIndex = queueFamilyIndex;
|
2020-04-01 02:17:49 +02:00
|
|
|
createInfo.queueCount = queueCount;
|
2020-03-09 12:30:07 +01:00
|
|
|
createInfo.pQueuePriorities = queuePriority;
|
|
|
|
|
return createInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDeviceCreateInfo init::DeviceCreateInfo(VkDeviceQueueCreateInfo *queueInfos, uint32_t queueCount, VkPhysicalDeviceFeatures *features)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
return DeviceCreateInfo(queueInfos, queueCount, features, nullptr, 0, nullptr, 0);
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkSwapchainCreateInfoKHR init::SwapchainCreateInfo(VkSurfaceKHR surface, uint32_t minImageCount, VkFormat imageFormat, VkColorSpaceKHR colorSpace, VkExtent2D extent, uint32_t arrayLayers, VkImageUsageFlags usage, VkSurfaceTransformFlagBitsKHR Transform, VkCompositeAlphaFlagBitsKHR alpha, VkPresentModeKHR presentMode, VkBool32 clipped)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSwapchainCreateInfoKHR createInfo = {};
|
|
|
|
|
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
|
|
|
|
createInfo.surface = surface;
|
|
|
|
|
createInfo.minImageCount = minImageCount;
|
|
|
|
|
createInfo.imageFormat = imageFormat;
|
|
|
|
|
createInfo.imageColorSpace = colorSpace;
|
|
|
|
|
createInfo.imageExtent = extent;
|
|
|
|
|
createInfo.imageArrayLayers = arrayLayers;
|
|
|
|
|
createInfo.imageUsage = usage;
|
|
|
|
|
createInfo.preTransform = Transform;
|
|
|
|
|
createInfo.compositeAlpha = alpha;
|
|
|
|
|
createInfo.presentMode = presentMode;
|
|
|
|
|
createInfo.clipped = clipped;
|
|
|
|
|
return createInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkSwapchainCreateInfoKHR init::SwapchainCreateInfo(VkSurfaceKHR surface, uint32_t minImageCount, VkFormat imageFormat, VkColorSpaceKHR colorSpace, uint32_t width, uint32_t height, uint32_t arrayLayers, VkImageUsageFlags usage, VkSurfaceTransformFlagBitsKHR Transform, VkCompositeAlphaFlagBitsKHR alpha, VkPresentModeKHR presentMode, VkBool32 clipped)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSwapchainCreateInfoKHR createInfo = {};
|
|
|
|
|
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
|
|
|
|
createInfo.surface = surface;
|
|
|
|
|
createInfo.minImageCount = minImageCount;
|
|
|
|
|
createInfo.imageFormat = imageFormat;
|
|
|
|
|
createInfo.imageColorSpace = colorSpace;
|
|
|
|
|
createInfo.imageExtent.width = width;
|
|
|
|
|
createInfo.imageExtent.height = height;
|
|
|
|
|
createInfo.imageArrayLayers = arrayLayers;
|
|
|
|
|
createInfo.imageUsage = usage;
|
|
|
|
|
createInfo.preTransform = Transform;
|
|
|
|
|
createInfo.compositeAlpha = alpha;
|
|
|
|
|
createInfo.presentMode = presentMode;
|
|
|
|
|
createInfo.clipped = clipped;
|
|
|
|
|
return createInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkFramebufferCreateInfo init::FramebufferCreateInfo(VkRenderPass renderPass, uint32_t attachmentCount, VkImageView *attachments, uint32_t width, uint32_t height, uint32_t layers)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkFramebufferCreateInfo frameBufferCreateInfo = {};
|
|
|
|
|
frameBufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
|
|
|
|
frameBufferCreateInfo.pNext = nullptr;
|
|
|
|
|
frameBufferCreateInfo.renderPass = renderPass;
|
|
|
|
|
frameBufferCreateInfo.attachmentCount = attachmentCount;
|
|
|
|
|
frameBufferCreateInfo.pAttachments = attachments;
|
|
|
|
|
frameBufferCreateInfo.width = width;
|
|
|
|
|
frameBufferCreateInfo.height = height;
|
|
|
|
|
frameBufferCreateInfo.layers = layers;
|
|
|
|
|
return frameBufferCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkAttachmentDescription init::AttachmentDescription(VkFormat format, VkSampleCountFlagBits sample, VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp, VkAttachmentLoadOp stencilLoadOp, VkAttachmentStoreOp stencilStoreOp, VkImageLayout imageLayout, VkImageLayout finalLayout)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkAttachmentDescription desc = {};
|
|
|
|
|
desc.format = format;
|
|
|
|
|
desc.samples = sample;
|
|
|
|
|
desc.loadOp = loadOp;
|
|
|
|
|
desc.storeOp = storeOp;
|
|
|
|
|
desc.stencilLoadOp = stencilLoadOp;
|
|
|
|
|
desc.stencilStoreOp = stencilStoreOp;
|
|
|
|
|
desc.initialLayout = imageLayout;
|
|
|
|
|
desc.finalLayout = finalLayout;
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkSubpassDescription init::SubpassDescription(VkPipelineBindPoint bindPoint,
|
|
|
|
|
uint32_t colorAttachmentCount, VkAttachmentReference *colorReference,
|
|
|
|
|
VkAttachmentReference *depthReference,
|
|
|
|
|
uint32_t inputAttachmentCount, VkAttachmentReference *inputReference,
|
|
|
|
|
VkAttachmentReference *resolveReference, uint32_t preserveAttachmentCount, uint32_t *preserveReference)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSubpassDescription desc = {};
|
|
|
|
|
desc.pipelineBindPoint = bindPoint;
|
|
|
|
|
desc.colorAttachmentCount = colorAttachmentCount;
|
|
|
|
|
desc.pColorAttachments = colorReference;
|
2020-04-12 15:47:19 +02:00
|
|
|
desc.inputAttachmentCount = inputAttachmentCount;
|
|
|
|
|
desc.pInputAttachments = inputReference;
|
|
|
|
|
desc.pResolveAttachments = resolveReference;
|
|
|
|
|
desc.preserveAttachmentCount = preserveAttachmentCount;
|
|
|
|
|
desc.pPreserveAttachments = preserveReference;
|
|
|
|
|
desc.pDepthStencilAttachment = depthReference;
|
2020-03-09 12:30:07 +01:00
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkRenderPassCreateInfo init::RenderPassCreateInfo(uint32_t attachmentCount, const VkAttachmentDescription *attachments, uint32_t subpassCount, const VkSubpassDescription *subpasses, uint32_t dependencyCount, const VkSubpassDependency *subpassDependencies)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkRenderPassCreateInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
|
|
|
|
info.attachmentCount = attachmentCount;
|
|
|
|
|
info.pAttachments = attachments;
|
|
|
|
|
info.subpassCount = subpassCount;
|
|
|
|
|
info.pSubpasses = subpasses;
|
|
|
|
|
info.dependencyCount = dependencyCount;
|
|
|
|
|
info.pDependencies = subpassDependencies;
|
|
|
|
|
|
|
|
|
|
return info;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDeviceCreateInfo init::DeviceCreateInfo(VkDeviceQueueCreateInfo *queueInfos, uint32_t queueCount, VkPhysicalDeviceFeatures *features, const char *const *deviceExtensions, uint32_t deviceExtensionCount, const char *const *layers, uint32_t layerCount)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkDeviceCreateInfo createInfo = {};
|
|
|
|
|
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
|
|
|
|
createInfo.pQueueCreateInfos = queueInfos;
|
|
|
|
|
createInfo.queueCreateInfoCount = queueCount;
|
|
|
|
|
|
|
|
|
|
createInfo.pEnabledFeatures = features;
|
|
|
|
|
|
|
|
|
|
createInfo.ppEnabledExtensionNames = deviceExtensions;
|
|
|
|
|
createInfo.enabledExtensionCount = deviceExtensionCount;
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_VALIDATION
|
|
|
|
|
createInfo.enabledLayerCount = layerCount;
|
|
|
|
|
createInfo.ppEnabledLayerNames = layers;
|
|
|
|
|
#else
|
|
|
|
|
createInfo.enabledLayerCount = 0;
|
2020-04-12 15:47:19 +02:00
|
|
|
layerCount = 0;
|
|
|
|
|
layers = nullptr;
|
2020-03-09 12:30:07 +01:00
|
|
|
#endif // ENABLE_VALIDATION
|
|
|
|
|
|
|
|
|
|
return createInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkMemoryAllocateInfo init::MemoryAllocateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkMemoryAllocateInfo memAllocInfo = {};
|
|
|
|
|
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
|
|
|
memAllocInfo.pNext = NULL;
|
|
|
|
|
return memAllocInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkCommandBufferAllocateInfo init::CommandBufferAllocateInfo(VkCommandPool commandPool, VkCommandBufferLevel level, uint32_t bufferCount)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkCommandBufferAllocateInfo commandBufferAllocateInfo = {};
|
|
|
|
|
commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
|
|
|
|
commandBufferAllocateInfo.commandPool = commandPool;
|
|
|
|
|
commandBufferAllocateInfo.level = level;
|
|
|
|
|
commandBufferAllocateInfo.commandBufferCount = bufferCount;
|
|
|
|
|
return commandBufferAllocateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkCommandPoolCreateInfo init::CommandPoolCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkCommandPoolCreateInfo cmdPoolCreateInfo = {};
|
|
|
|
|
cmdPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
|
|
|
|
return cmdPoolCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkCommandBufferBeginInfo init::CommandBufferBeginInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkCommandBufferBeginInfo cmdBufferBeginInfo = {};
|
|
|
|
|
cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
|
|
|
|
cmdBufferBeginInfo.pNext = NULL;
|
|
|
|
|
return cmdBufferBeginInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkCommandBufferInheritanceInfo init::CommandBufferInheritanceInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkCommandBufferInheritanceInfo cmdBufferInheritanceInfo = {};
|
|
|
|
|
cmdBufferInheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
|
|
|
|
|
return cmdBufferInheritanceInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkRenderPassBeginInfo init::RenderPassBeginInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
|
|
|
|
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
|
|
|
|
renderPassBeginInfo.pNext = NULL;
|
|
|
|
|
return renderPassBeginInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkRenderPassCreateInfo init::RenderPassCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkRenderPassCreateInfo renderPassCreateInfo = {};
|
|
|
|
|
renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
|
|
|
|
renderPassCreateInfo.pNext = NULL;
|
|
|
|
|
return renderPassCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkImageMemoryBarrier init::ImageMemoryBarrier(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t srcQueue, uint32_t dstQueue)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkImageMemoryBarrier barrier = {};
|
|
|
|
|
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
|
|
|
barrier.oldLayout = oldLayout;
|
|
|
|
|
barrier.newLayout = newLayout;
|
|
|
|
|
barrier.srcQueueFamilyIndex = srcQueue;
|
|
|
|
|
barrier.dstQueueFamilyIndex = dstQueue;
|
|
|
|
|
barrier.image = image;
|
2020-04-12 15:47:19 +02:00
|
|
|
if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
|
|
|
}
|
|
|
|
|
barrier.subresourceRange.baseMipLevel = 0;
|
|
|
|
|
barrier.subresourceRange.levelCount = 1;
|
|
|
|
|
barrier.subresourceRange.baseArrayLayer = 0;
|
|
|
|
|
barrier.subresourceRange.layerCount = 1;
|
2020-04-12 15:47:19 +02:00
|
|
|
if (oldLayout == VK_IMAGE_LAYOUT_PREINITIALIZED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
|
|
|
|
|
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else if (oldLayout == VK_IMAGE_LAYOUT_PREINITIALIZED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
|
|
|
|
|
barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
|
|
|
|
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.srcAccessMask = 0;
|
|
|
|
|
barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
barrier.srcAccessMask = 0;
|
|
|
|
|
barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
|
|
|
|
}
|
|
|
|
|
return barrier;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkImageMemoryBarrier init::ImageMemoryBarrier()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkImageMemoryBarrier barrier = {};
|
|
|
|
|
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
|
|
|
barrier.pNext = nullptr;
|
|
|
|
|
return barrier;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkBufferMemoryBarrier init::BufferMemoryBarrier()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkBufferMemoryBarrier bufferMemoryBarrier = {};
|
|
|
|
|
bufferMemoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
|
|
|
|
|
bufferMemoryBarrier.pNext = NULL;
|
|
|
|
|
return bufferMemoryBarrier;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkMemoryBarrier init::MemoryBarrier()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkMemoryBarrier memoryBarrier = {};
|
|
|
|
|
memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
|
|
|
|
|
memoryBarrier.pNext = NULL;
|
|
|
|
|
return memoryBarrier;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkImageCreateInfo init::ImageCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkImageCreateInfo imageCreateInfo = {};
|
|
|
|
|
imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
|
|
|
|
imageCreateInfo.pNext = NULL;
|
|
|
|
|
return imageCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkSamplerCreateInfo init::SamplerCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSamplerCreateInfo samplerCreateInfo = {};
|
|
|
|
|
samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
|
|
|
|
samplerCreateInfo.pNext = NULL;
|
|
|
|
|
samplerCreateInfo.magFilter = VK_FILTER_LINEAR;
|
|
|
|
|
samplerCreateInfo.minFilter = VK_FILTER_LINEAR;
|
|
|
|
|
samplerCreateInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
|
|
|
samplerCreateInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
|
|
|
samplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
|
|
|
|
|
|
|
|
samplerCreateInfo.anisotropyEnable = VK_FALSE;
|
|
|
|
|
samplerCreateInfo.maxAnisotropy = 1.0f;
|
|
|
|
|
samplerCreateInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
|
|
|
|
|
samplerCreateInfo.unnormalizedCoordinates = VK_FALSE;
|
|
|
|
|
samplerCreateInfo.compareEnable = VK_FALSE;
|
|
|
|
|
samplerCreateInfo.compareOp = VK_COMPARE_OP_ALWAYS;
|
|
|
|
|
|
|
|
|
|
samplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
|
|
|
|
samplerCreateInfo.mipLodBias = 0.0f;
|
|
|
|
|
samplerCreateInfo.minLod = 0.0f;
|
|
|
|
|
samplerCreateInfo.maxLod = 0.0f;
|
|
|
|
|
return samplerCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkImageViewCreateInfo init::ImageViewCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkImageViewCreateInfo imageViewCreateInfo = {};
|
|
|
|
|
imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
|
|
|
|
imageViewCreateInfo.pNext = NULL;
|
|
|
|
|
return imageViewCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkSemaphoreCreateInfo init::SemaphoreCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSemaphoreCreateInfo semaphoreCreateInfo = {};
|
|
|
|
|
semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
|
|
|
|
semaphoreCreateInfo.pNext = NULL;
|
|
|
|
|
semaphoreCreateInfo.flags = 0;
|
|
|
|
|
return semaphoreCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkFenceCreateInfo init::FenceCreateInfo(VkFenceCreateFlags flags)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkFenceCreateInfo fenceCreateInfo = {};
|
|
|
|
|
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
|
|
|
|
fenceCreateInfo.flags = flags;
|
|
|
|
|
return fenceCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkEventCreateInfo init::EventCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkEventCreateInfo eventCreateInfo = {};
|
|
|
|
|
eventCreateInfo.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
|
|
|
|
|
return eventCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkSubmitInfo init::SubmitInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkSubmitInfo submitInfo = {};
|
|
|
|
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
|
|
|
|
submitInfo.pNext = NULL;
|
|
|
|
|
return submitInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkImageSubresourceRange init::ImageSubresourceRange(VkImageAspectFlags aspect, uint32_t startMip)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkImageSubresourceRange range;
|
|
|
|
|
std::memset(&range, 0, sizeof(VkImageSubresourceRange));
|
|
|
|
|
range.aspectMask = aspect;
|
|
|
|
|
range.baseMipLevel = startMip;
|
|
|
|
|
range.levelCount = 1;
|
|
|
|
|
range.baseArrayLayer = 0;
|
|
|
|
|
range.layerCount = 1;
|
|
|
|
|
return range;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkViewport init::Viewport(
|
2020-03-09 12:30:07 +01:00
|
|
|
float width,
|
|
|
|
|
float height,
|
|
|
|
|
float minDepth,
|
|
|
|
|
float maxDepth)
|
|
|
|
|
{
|
|
|
|
|
VkViewport viewport = {};
|
|
|
|
|
viewport.width = width;
|
|
|
|
|
viewport.height = height;
|
|
|
|
|
viewport.minDepth = minDepth;
|
|
|
|
|
viewport.maxDepth = maxDepth;
|
|
|
|
|
return viewport;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkRect2D init::Rect2D(
|
2020-03-09 12:30:07 +01:00
|
|
|
int32_t width,
|
|
|
|
|
int32_t height,
|
|
|
|
|
int32_t offsetX,
|
|
|
|
|
int32_t offsetY)
|
|
|
|
|
{
|
|
|
|
|
VkRect2D rect2D = {};
|
|
|
|
|
rect2D.extent.width = width;
|
|
|
|
|
rect2D.extent.height = height;
|
|
|
|
|
rect2D.offset.x = offsetX;
|
|
|
|
|
rect2D.offset.y = offsetY;
|
|
|
|
|
return rect2D;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkBufferCreateInfo init::BufferCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkBufferCreateInfo bufCreateInfo = {};
|
|
|
|
|
bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
|
|
|
return bufCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkBufferCreateInfo init::BufferCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkBufferUsageFlags usage,
|
|
|
|
|
VkDeviceSize size)
|
|
|
|
|
{
|
|
|
|
|
VkBufferCreateInfo bufCreateInfo = {};
|
|
|
|
|
bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
|
|
|
bufCreateInfo.pNext = NULL;
|
|
|
|
|
bufCreateInfo.usage = usage;
|
|
|
|
|
bufCreateInfo.size = size;
|
|
|
|
|
bufCreateInfo.flags = 0;
|
|
|
|
|
return bufCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorPoolCreateInfo init::DescriptorPoolCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t poolSizeCount,
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDescriptorPoolSize *pPoolSizes,
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t maxSets)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorPoolCreateInfo descriptorPoolInfo = {};
|
|
|
|
|
descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
|
|
|
|
descriptorPoolInfo.pNext = NULL;
|
|
|
|
|
descriptorPoolInfo.poolSizeCount = poolSizeCount;
|
|
|
|
|
descriptorPoolInfo.pPoolSizes = pPoolSizes;
|
|
|
|
|
descriptorPoolInfo.maxSets = maxSets;
|
|
|
|
|
return descriptorPoolInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorPoolSize init::DescriptorPoolSize(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkDescriptorType type,
|
|
|
|
|
uint32_t descriptorCount)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorPoolSize descriptorPoolSize = {};
|
|
|
|
|
descriptorPoolSize.type = type;
|
|
|
|
|
descriptorPoolSize.descriptorCount = descriptorCount;
|
|
|
|
|
return descriptorPoolSize;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorSetLayoutBinding init::DescriptorSetLayoutBinding(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkDescriptorType type,
|
|
|
|
|
VkShaderStageFlags stageFlags,
|
|
|
|
|
uint32_t binding,
|
|
|
|
|
uint32_t count)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorSetLayoutBinding setLayoutBinding = {};
|
|
|
|
|
setLayoutBinding.descriptorType = type;
|
|
|
|
|
setLayoutBinding.stageFlags = stageFlags;
|
|
|
|
|
setLayoutBinding.binding = binding;
|
|
|
|
|
setLayoutBinding.descriptorCount = count;
|
|
|
|
|
return setLayoutBinding;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorSetLayoutCreateInfo init::DescriptorSetLayoutCreateInfo(
|
2020-04-12 15:47:19 +02:00
|
|
|
const VkDescriptorSetLayoutBinding *pBindings,
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t bindingCount)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = {};
|
|
|
|
|
descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
|
|
|
descriptorSetLayoutCreateInfo.pNext = NULL;
|
|
|
|
|
descriptorSetLayoutCreateInfo.pBindings = pBindings;
|
|
|
|
|
descriptorSetLayoutCreateInfo.bindingCount = bindingCount;
|
|
|
|
|
return descriptorSetLayoutCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineLayoutCreateInfo init::PipelineLayoutCreateInfo(
|
2020-04-12 15:47:19 +02:00
|
|
|
const VkDescriptorSetLayout *pSetLayouts,
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t setLayoutCount)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = {};
|
|
|
|
|
pipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
|
|
|
pipelineLayoutCreateInfo.pNext = NULL;
|
|
|
|
|
pipelineLayoutCreateInfo.setLayoutCount = setLayoutCount;
|
|
|
|
|
pipelineLayoutCreateInfo.pSetLayouts = pSetLayouts;
|
|
|
|
|
return pipelineLayoutCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorSetAllocateInfo init::DescriptorSetAllocateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkDescriptorPool descriptorPool,
|
2020-04-12 15:47:19 +02:00
|
|
|
const VkDescriptorSetLayout *pSetLayouts,
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t descriptorSetCount)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = {};
|
|
|
|
|
descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
|
|
|
descriptorSetAllocateInfo.pNext = NULL;
|
|
|
|
|
descriptorSetAllocateInfo.descriptorPool = descriptorPool;
|
|
|
|
|
descriptorSetAllocateInfo.pSetLayouts = pSetLayouts;
|
|
|
|
|
descriptorSetAllocateInfo.descriptorSetCount = descriptorSetCount;
|
|
|
|
|
return descriptorSetAllocateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorBufferInfo init::DescriptorBufferInfo(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize range)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkDescriptorBufferInfo bufferInfo = {};
|
|
|
|
|
bufferInfo.buffer = buffer;
|
|
|
|
|
bufferInfo.offset = offset;
|
|
|
|
|
bufferInfo.range = range;
|
|
|
|
|
|
|
|
|
|
return bufferInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkDescriptorImageInfo init::DescriptorImageInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkSampler sampler,
|
|
|
|
|
VkImageView imageView,
|
|
|
|
|
VkImageLayout imageLayout)
|
|
|
|
|
{
|
|
|
|
|
VkDescriptorImageInfo descriptorImageInfo = {};
|
|
|
|
|
descriptorImageInfo.sampler = sampler;
|
|
|
|
|
descriptorImageInfo.imageView = imageView;
|
|
|
|
|
descriptorImageInfo.imageLayout = imageLayout;
|
|
|
|
|
return descriptorImageInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkWriteDescriptorSet init::WriteDescriptorSet(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkDescriptorSet dstSet,
|
|
|
|
|
VkDescriptorType type,
|
|
|
|
|
uint32_t binding,
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDescriptorBufferInfo *bufferInfo)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkWriteDescriptorSet writeDescriptorSet = {};
|
|
|
|
|
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
|
|
|
|
writeDescriptorSet.pNext = NULL;
|
|
|
|
|
writeDescriptorSet.dstSet = dstSet;
|
|
|
|
|
writeDescriptorSet.descriptorType = type;
|
|
|
|
|
writeDescriptorSet.dstBinding = binding;
|
|
|
|
|
writeDescriptorSet.pBufferInfo = bufferInfo;
|
|
|
|
|
// Default value in all examples
|
|
|
|
|
writeDescriptorSet.descriptorCount = 1;
|
|
|
|
|
return writeDescriptorSet;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkWriteDescriptorSet init::WriteDescriptorSet(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkDescriptorSet dstSet,
|
|
|
|
|
VkDescriptorType type,
|
|
|
|
|
uint32_t binding,
|
2020-04-12 15:47:19 +02:00
|
|
|
VkDescriptorImageInfo *bufferInfo)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkWriteDescriptorSet writeDescriptorSet = {};
|
|
|
|
|
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
|
|
|
|
writeDescriptorSet.pNext = NULL;
|
|
|
|
|
writeDescriptorSet.dstSet = dstSet;
|
|
|
|
|
writeDescriptorSet.descriptorType = type;
|
|
|
|
|
writeDescriptorSet.dstBinding = binding;
|
|
|
|
|
writeDescriptorSet.pImageInfo = bufferInfo;
|
|
|
|
|
// Default value in all examples
|
|
|
|
|
writeDescriptorSet.descriptorCount = 1;
|
|
|
|
|
return writeDescriptorSet;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkVertexInputBindingDescription init::VertexInputBindingDescription(
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t binding,
|
|
|
|
|
uint32_t stride,
|
|
|
|
|
VkVertexInputRate inputRate)
|
|
|
|
|
{
|
|
|
|
|
VkVertexInputBindingDescription vInputBindDescription = {};
|
|
|
|
|
vInputBindDescription.binding = binding;
|
|
|
|
|
vInputBindDescription.stride = stride;
|
|
|
|
|
vInputBindDescription.inputRate = inputRate;
|
|
|
|
|
return vInputBindDescription;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkVertexInputAttributeDescription init::VertexInputAttributeDescription(
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t binding,
|
|
|
|
|
uint32_t location,
|
|
|
|
|
VkFormat format,
|
|
|
|
|
uint32_t offset)
|
|
|
|
|
{
|
|
|
|
|
VkVertexInputAttributeDescription vInputAttribDescription = {};
|
|
|
|
|
vInputAttribDescription.location = location;
|
|
|
|
|
vInputAttribDescription.binding = binding;
|
|
|
|
|
vInputAttribDescription.format = format;
|
|
|
|
|
vInputAttribDescription.offset = offset;
|
|
|
|
|
return vInputAttribDescription;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineVertexInputStateCreateInfo init::PipelineVertexInputStateCreateInfo()
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = {};
|
|
|
|
|
pipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
|
|
|
|
pipelineVertexInputStateCreateInfo.pNext = NULL;
|
|
|
|
|
return pipelineVertexInputStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineInputAssemblyStateCreateInfo init::PipelineInputAssemblyStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkPrimitiveTopology topology,
|
|
|
|
|
VkPipelineInputAssemblyStateCreateFlags flags,
|
|
|
|
|
VkBool32 primitiveRestartEnable)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo = {};
|
|
|
|
|
pipelineInputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
|
|
|
|
pipelineInputAssemblyStateCreateInfo.topology = topology;
|
|
|
|
|
pipelineInputAssemblyStateCreateInfo.flags = flags;
|
|
|
|
|
pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = primitiveRestartEnable;
|
|
|
|
|
return pipelineInputAssemblyStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineRasterizationStateCreateInfo init::PipelineRasterizationStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkPolygonMode polygonMode,
|
|
|
|
|
VkCullModeFlags cullMode,
|
|
|
|
|
VkFrontFace frontFace,
|
|
|
|
|
VkPipelineRasterizationStateCreateFlags flags)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo = {};
|
|
|
|
|
pipelineRasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.polygonMode = polygonMode;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.cullMode = cullMode;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.frontFace = frontFace;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.flags = flags;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.depthClampEnable = VK_FALSE;
|
|
|
|
|
pipelineRasterizationStateCreateInfo.lineWidth = 1.0f;
|
|
|
|
|
return pipelineRasterizationStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineColorBlendAttachmentState init::PipelineColorBlendAttachmentState(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkColorComponentFlags colorWriteMask,
|
|
|
|
|
VkBool32 blendEnable)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState = {};
|
|
|
|
|
pipelineColorBlendAttachmentState.colorWriteMask = colorWriteMask;
|
|
|
|
|
pipelineColorBlendAttachmentState.blendEnable = blendEnable;
|
|
|
|
|
return pipelineColorBlendAttachmentState;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineColorBlendStateCreateInfo init::PipelineColorBlendStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t attachmentCount,
|
2020-04-12 15:47:19 +02:00
|
|
|
const VkPipelineColorBlendAttachmentState *pAttachments)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo = {};
|
|
|
|
|
pipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
|
|
|
|
pipelineColorBlendStateCreateInfo.pNext = NULL;
|
|
|
|
|
pipelineColorBlendStateCreateInfo.attachmentCount = attachmentCount;
|
|
|
|
|
pipelineColorBlendStateCreateInfo.pAttachments = pAttachments;
|
|
|
|
|
return pipelineColorBlendStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineDepthStencilStateCreateInfo init::PipelineDepthStencilStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkBool32 depthTestEnable,
|
|
|
|
|
VkBool32 depthWriteEnable,
|
|
|
|
|
VkCompareOp depthCompareOp)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo = {};
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.depthTestEnable = depthTestEnable;
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.depthWriteEnable = depthWriteEnable;
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.depthCompareOp = depthCompareOp;
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.front = pipelineDepthStencilStateCreateInfo.back;
|
|
|
|
|
pipelineDepthStencilStateCreateInfo.back.compareOp = VK_COMPARE_OP_ALWAYS;
|
|
|
|
|
return pipelineDepthStencilStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineViewportStateCreateInfo init::PipelineViewportStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t viewportCount,
|
|
|
|
|
uint32_t scissorCount,
|
|
|
|
|
VkPipelineViewportStateCreateFlags flags)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo = {};
|
|
|
|
|
pipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
|
|
|
|
pipelineViewportStateCreateInfo.viewportCount = viewportCount;
|
|
|
|
|
pipelineViewportStateCreateInfo.scissorCount = scissorCount;
|
|
|
|
|
pipelineViewportStateCreateInfo.flags = flags;
|
|
|
|
|
return pipelineViewportStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineMultisampleStateCreateInfo init::PipelineMultisampleStateCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkSampleCountFlagBits rasterizationSamples,
|
|
|
|
|
VkPipelineMultisampleStateCreateFlags flags)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo = {};
|
|
|
|
|
pipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
2020-04-12 15:47:19 +02:00
|
|
|
pipelineMultisampleStateCreateInfo.flags = flags;
|
2020-03-09 12:30:07 +01:00
|
|
|
pipelineMultisampleStateCreateInfo.rasterizationSamples = rasterizationSamples;
|
|
|
|
|
return pipelineMultisampleStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineDynamicStateCreateInfo init::PipelineDynamicStateCreateInfo(
|
2020-04-12 15:47:19 +02:00
|
|
|
const VkDynamicState *pDynamicStates,
|
2020-03-09 12:30:07 +01:00
|
|
|
uint32_t dynamicStateCount,
|
|
|
|
|
VkPipelineDynamicStateCreateFlags flags)
|
|
|
|
|
{
|
|
|
|
|
VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo = {};
|
|
|
|
|
pipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
|
2020-04-12 15:47:19 +02:00
|
|
|
pipelineDynamicStateCreateInfo.flags = flags;
|
2020-03-09 12:30:07 +01:00
|
|
|
pipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates;
|
|
|
|
|
pipelineDynamicStateCreateInfo.dynamicStateCount = dynamicStateCount;
|
|
|
|
|
return pipelineDynamicStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPipelineTessellationStateCreateInfo init::PipelineTessellationStateCreateInfo(uint32_t patchControlPoints)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkPipelineTessellationStateCreateInfo pipelineTessellationStateCreateInfo = {};
|
|
|
|
|
pipelineTessellationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
|
|
|
|
|
pipelineTessellationStateCreateInfo.patchControlPoints = patchControlPoints;
|
|
|
|
|
return pipelineTessellationStateCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkGraphicsPipelineCreateInfo init::PipelineCreateInfo(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkPipelineLayout layout,
|
|
|
|
|
VkRenderPass renderPass,
|
|
|
|
|
VkPipelineCreateFlags flags)
|
|
|
|
|
{
|
|
|
|
|
VkGraphicsPipelineCreateInfo pipelineCreateInfo = {};
|
|
|
|
|
pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
|
|
|
pipelineCreateInfo.pNext = NULL;
|
|
|
|
|
pipelineCreateInfo.layout = layout;
|
|
|
|
|
pipelineCreateInfo.renderPass = renderPass;
|
|
|
|
|
pipelineCreateInfo.flags = flags;
|
|
|
|
|
return pipelineCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkComputePipelineCreateInfo init::ComputePipelineCreateInfo(VkPipelineLayout layout, VkPipelineCreateFlags flags)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkComputePipelineCreateInfo computePipelineCreateInfo = {};
|
|
|
|
|
computePipelineCreateInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
|
|
|
|
|
computePipelineCreateInfo.layout = layout;
|
|
|
|
|
computePipelineCreateInfo.flags = flags;
|
|
|
|
|
return computePipelineCreateInfo;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-20 01:27:40 +01:00
|
|
|
VkPushConstantRange init::PushConstantRange(
|
2020-03-09 12:30:07 +01:00
|
|
|
VkShaderStageFlags stageFlags,
|
|
|
|
|
uint32_t size,
|
|
|
|
|
uint32_t offset)
|
|
|
|
|
{
|
|
|
|
|
VkPushConstantRange pushConstantRange = {};
|
|
|
|
|
pushConstantRange.stageFlags = stageFlags;
|
|
|
|
|
pushConstantRange.offset = offset;
|
|
|
|
|
pushConstantRange.size = size;
|
|
|
|
|
return pushConstantRange;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkPipelineShaderStageCreateInfo init::PipelineShaderStageCreateInfo(VkShaderStageFlagBits stage, VkShaderModule module, const char *entryName)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
VkPipelineShaderStageCreateInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
|
|
|
info.module = module;
|
|
|
|
|
info.stage = stage;
|
|
|
|
|
info.pName = entryName;
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
#pragma warning(disable : 4100)
|
|
|
|
|
VkBool32 Seele::Vulkan::debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char *layerPrefix, const char *msg, void *userDataManager)
|
|
|
|
|
{
|
2021-01-19 15:30:00 +01:00
|
|
|
std::cerr << layerPrefix << ": " << msg << std::endl;
|
2020-03-09 12:30:07 +01:00
|
|
|
return VK_FALSE;
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
#pragma warning(default : 4100)
|
2020-11-03 01:18:30 +01:00
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
VkResult Seele::Vulkan::CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pCallback)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
auto func = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT");
|
2020-04-12 15:47:19 +02:00
|
|
|
if (func != nullptr)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
return func(instance, pCreateInfo, pAllocator, pCallback);
|
|
|
|
|
}
|
2020-04-12 15:47:19 +02:00
|
|
|
else
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
void Seele::Vulkan::DestroyDebugReportCallbackEXT(VkInstance instance, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT pCallback)
|
2020-03-09 12:30:07 +01:00
|
|
|
{
|
|
|
|
|
auto func = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT");
|
2020-04-12 15:47:19 +02:00
|
|
|
if (func != nullptr)
|
|
|
|
|
{
|
2020-03-09 12:30:07 +01:00
|
|
|
func(instance, pCallback, pAllocator);
|
|
|
|
|
}
|
|
|
|
|
}
|