feat: reformatted code

This commit is contained in:
2020-12-02 21:38:11 +01:00
parent ed93111f64
commit 05b66d5497
11 changed files with 218 additions and 140 deletions

View File

@@ -8,13 +8,16 @@
#include <optional>
#include <vector>
#include <array>
#define GLM_FORCE_RADIANS
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <chrono>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <cstring>
@@ -27,12 +30,13 @@ struct Vertex {
static VkVertexInputBindingDescription getBindingDescription() {
VkVertexInputBindingDescription bindingDescription{
.binding = 0,
.stride = sizeof(Vertex),
.inputRate = VK_VERTEX_INPUT_RATE_VERTEX,
.binding = 0,
.stride = sizeof(Vertex),
.inputRate = VK_VERTEX_INPUT_RATE_VERTEX,
};
return bindingDescription;
}
static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescription() {
std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions{};
attributeDescriptions[0].binding = 0;
@@ -60,8 +64,8 @@ struct UniformBufferObject {
//};
const std::vector<Vertex> vertices = {
{{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
{{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
{{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}},
};
@@ -94,8 +98,10 @@ void HelloTriangleApplication::run() {
void HelloTriangleApplication::createSwapChain() {
int width, height;
uint32_t queueFamilyIndices[] = {myVkInstance->indices.graphicsFamily.value(), myVkInstance->indices.presentFamily.value()};
SwapChainSupportDetails swapChainSupportDetails = querySwapChainSupport(myVkInstance->physicalDevice, myVkInstance->surface);
uint32_t queueFamilyIndices[] = {myVkInstance->indices.graphicsFamily.value(),
myVkInstance->indices.presentFamily.value()};
SwapChainSupportDetails swapChainSupportDetails = querySwapChainSupport(myVkInstance->physicalDevice,
myVkInstance->surface);
VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupportDetails.formats);
VkPresentModeKHR presentMode = chooseSwapChainPresentMode(swapChainSupportDetails.presentModes);
@@ -208,32 +214,33 @@ void HelloTriangleApplication::createRenderPass() {
}
void HelloTriangleApplication::createDescriptorSetLayout() {
VkDescriptorSetLayoutBinding uboLayoutBinding{
.binding = 0,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
.pImmutableSamplers = nullptr,
VkDescriptorSetLayoutBinding uboLayoutBinding{
.binding = 0,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
.pImmutableSamplers = nullptr,
};
VkDescriptorSetLayoutCreateInfo layoutCreateInfo {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = 1,
.pBindings = &uboLayoutBinding,
VkDescriptorSetLayoutCreateInfo layoutCreateInfo{
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = 1,
.pBindings = &uboLayoutBinding,
};
if (vkCreateDescriptorSetLayout(myVkInstance->device, &layoutCreateInfo, nullptr, &descriptorSetLayout) != VK_SUCCESS ) {
if (vkCreateDescriptorSetLayout(myVkInstance->device, &layoutCreateInfo, nullptr, &descriptorSetLayout) !=
VK_SUCCESS) {
throw std::runtime_error("Failed to create descriptor set layout!");
}
}
void HelloTriangleApplication::createDescriptorPool() {
VkDescriptorPoolSize poolSize {
VkDescriptorPoolSize poolSize{
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = static_cast<uint32_t>(swapChainImages.size()),
};
VkDescriptorPoolCreateInfo poolCreateInfo {
VkDescriptorPoolCreateInfo poolCreateInfo{
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.maxSets = static_cast<uint32_t>(swapChainImages.size()),
.poolSizeCount = 1,
@@ -246,7 +253,7 @@ void HelloTriangleApplication::createDescriptorPool() {
void HelloTriangleApplication::createDescriptorSets() {
std::vector<VkDescriptorSetLayout> layouts(swapChainImages.size(), descriptorSetLayout);
VkDescriptorSetAllocateInfo allocateInfo {
VkDescriptorSetAllocateInfo allocateInfo{
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
.descriptorPool = descriptorPool,
.descriptorSetCount = static_cast<uint32_t>(swapChainImages.size()),
@@ -259,12 +266,12 @@ void HelloTriangleApplication::createDescriptorSets() {
}
for (size_t i = 0; i < swapChainImages.size(); ++i) {
VkDescriptorBufferInfo bufferInfo {
VkDescriptorBufferInfo bufferInfo{
.buffer = uniformBuffers[i],
.offset = 0,
.range = sizeof(UniformBufferObject)
};
VkWriteDescriptorSet descriptorWrite {
VkWriteDescriptorSet descriptorWrite{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptorSets[i],
.dstBinding = 0,
@@ -416,7 +423,8 @@ void HelloTriangleApplication::createGraphicsPipeline() {
.pPushConstantRanges = nullptr,
};
if (vkCreatePipelineLayout(myVkInstance->device, &pipelineLayoutCreateInfo, nullptr, &pipelineLayout) != VK_SUCCESS) {
if (vkCreatePipelineLayout(myVkInstance->device, &pipelineLayoutCreateInfo, nullptr, &pipelineLayout) !=
VK_SUCCESS) {
throw std::runtime_error("failed to create pipeline layout");
}
@@ -439,7 +447,8 @@ void HelloTriangleApplication::createGraphicsPipeline() {
.basePipelineIndex = -1,
};
if (vkCreateGraphicsPipelines(myVkInstance->device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {
if (vkCreateGraphicsPipelines(myVkInstance->device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) !=
VK_SUCCESS) {
throw std::runtime_error("Failed to create graphics pipeline");
}
@@ -462,14 +471,17 @@ void HelloTriangleApplication::createFrameBuffers() {
.height = swapChainExtent.height,
.layers = 1
};
if (vkCreateFramebuffer(myVkInstance->device, &framebufferCreateInfo, nullptr, &swapChainFrameBuffers[i]) != VK_SUCCESS) {
if (vkCreateFramebuffer(myVkInstance->device, &framebufferCreateInfo, nullptr, &swapChainFrameBuffers[i]) !=
VK_SUCCESS) {
throw std::runtime_error("Failed to create frame buffer");
}
}
}
void HelloTriangleApplication::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) {
VkBufferCreateInfo bufferCreateInfo {
void
HelloTriangleApplication::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
VkBuffer &buffer, VkDeviceMemory &bufferMemory) {
VkBufferCreateInfo bufferCreateInfo{
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.size = size,
.usage = usage,
@@ -501,15 +513,16 @@ void HelloTriangleApplication::createVertexBuffer() {
VkBuffer stagingBuffer;
VkDeviceMemory stagingBufferMemory;
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer,
stagingBufferMemory);
void* data;
void *data;
vkMapMemory(myVkInstance->device, stagingBufferMemory, 0, bufferSize, 0, &data);
memcpy(data, vertices.data(), (size_t)bufferSize);
memcpy(data, vertices.data(), (size_t) bufferSize);
vkUnmapMemory(myVkInstance->device, stagingBufferMemory);
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory);
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory);
copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
vkDestroyBuffer(myVkInstance->device, stagingBuffer, nullptr);
@@ -522,11 +535,12 @@ void HelloTriangleApplication::createIndexBuffer() {
VkBuffer stagingBuffer;
VkDeviceMemory stagingBufferMemory;
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer,
stagingBufferMemory);
void* data;
void *data;
vkMapMemory(myVkInstance->device, stagingBufferMemory, 0, bufferSize, 0, &data);
memcpy(data, indices.data(), (size_t)bufferSize);
memcpy(data, indices.data(), (size_t) bufferSize);
vkUnmapMemory(myVkInstance->device, stagingBufferMemory);
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
@@ -539,29 +553,29 @@ void HelloTriangleApplication::createIndexBuffer() {
void HelloTriangleApplication::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) {
VkCommandBufferAllocateInfo commandBufferAllocateInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = 1,
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = 1,
};
VkCommandBuffer commandBuffer;
vkAllocateCommandBuffers(myVkInstance->device, &commandBufferAllocateInfo, &commandBuffer);
VkCommandBufferBeginInfo beginInfo {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
VkCommandBufferBeginInfo beginInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
};
vkBeginCommandBuffer(commandBuffer, &beginInfo);
VkBufferCopy copyRegion {
.srcOffset = 0,
.dstOffset = 0,
.size = size
VkBufferCopy copyRegion{
.srcOffset = 0,
.dstOffset = 0,
.size = size
};
vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, &copyRegion);
vkEndCommandBuffer(commandBuffer);
VkSubmitInfo submitInfo {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.commandBufferCount = 1,
.pCommandBuffers = &commandBuffer,
VkSubmitInfo submitInfo{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.commandBufferCount = 1,
.pCommandBuffers = &commandBuffer,
};
vkQueueSubmit(myVkInstance->graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(myVkInstance->graphicsQueue);
@@ -587,18 +601,20 @@ void HelloTriangleApplication::createUniformBuffers() {
uniformBuffersMemory.resize(swapChainImages.size());
for (size_t i = 0; i < swapChainImages.size(); ++i) {
createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, uniformBuffers[i], uniformBuffersMemory[i]);
createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, uniformBuffers[i],
uniformBuffersMemory[i]);
}
}
void HelloTriangleApplication::createCommandBuffers() {
commandBuffers.resize(swapChainFrameBuffers.size());
VkCommandBufferAllocateInfo allocateInfo {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = (uint32_t) commandBuffers.size(),
VkCommandBufferAllocateInfo allocateInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = (uint32_t) commandBuffers.size(),
};
if (vkAllocateCommandBuffers(myVkInstance->device, &allocateInfo, commandBuffers.data()) != VK_SUCCESS) {
@@ -606,10 +622,10 @@ void HelloTriangleApplication::createCommandBuffers() {
}
for (size_t i = 0; i < commandBuffers.size(); i++) {
VkCommandBufferBeginInfo beginInfo {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = 0,
.pInheritanceInfo = nullptr,
VkCommandBufferBeginInfo beginInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = 0,
.pInheritanceInfo = nullptr,
};
if (vkBeginCommandBuffer(commandBuffers[i], &beginInfo) != VK_SUCCESS) {
throw std::runtime_error("Failed to begin recording command buffer");
@@ -619,7 +635,7 @@ void HelloTriangleApplication::createCommandBuffers() {
.renderPass = renderPass,
.framebuffer = swapChainFrameBuffers[i],
};
renderPassInfo.renderArea.offset = {0,0};
renderPassInfo.renderArea.offset = {0, 0};
renderPassInfo.renderArea.extent = swapChainExtent;
VkClearValue clearColor = {0.0f, 0.0f, 0.0f, 1.0f};
@@ -631,7 +647,8 @@ void HelloTriangleApplication::createCommandBuffers() {
VkDeviceSize offset[] = {0};
vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offset);
vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[i], 0, nullptr);
vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1,
&descriptorSets[i], 0, nullptr);
vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
vkCmdEndRenderPass(commandBuffers[i]);
if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) {
@@ -645,17 +662,19 @@ void HelloTriangleApplication::createSyncObjects() {
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
imagesInFlight.resize(MAX_FRAMES_IN_FLIGHT, VK_NULL_HANDLE);
VkSemaphoreCreateInfo semaphoreCreateInfo {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
VkSemaphoreCreateInfo semaphoreCreateInfo{
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
};
VkFenceCreateInfo fenceInfo {
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
VkFenceCreateInfo fenceInfo{
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
};
for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
if (vkCreateSemaphore(myVkInstance->device, &semaphoreCreateInfo, nullptr, &imageAvailableSemaphores[i]) != VK_SUCCESS ||
vkCreateSemaphore(myVkInstance->device, &semaphoreCreateInfo, nullptr, &renderFinishedSemaphores[i]) != VK_SUCCESS ||
if (vkCreateSemaphore(myVkInstance->device, &semaphoreCreateInfo, nullptr, &imageAvailableSemaphores[i]) !=
VK_SUCCESS ||
vkCreateSemaphore(myVkInstance->device, &semaphoreCreateInfo, nullptr, &renderFinishedSemaphores[i]) !=
VK_SUCCESS ||
vkCreateFence(myVkInstance->device, &fenceInfo, nullptr, &inFlightFences[i])) {
throw std::runtime_error("failed to create semaphore");
}
@@ -703,11 +722,12 @@ void HelloTriangleApplication::recreateSwapChain() {
}
void HelloTriangleApplication::cleanupSwapChain() {
for (auto & swapChainFrameBuffer : swapChainFrameBuffers) {
for (auto &swapChainFrameBuffer : swapChainFrameBuffers) {
vkDestroyFramebuffer(myVkInstance->device, swapChainFrameBuffer, nullptr);
}
vkFreeCommandBuffers(myVkInstance->device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
vkFreeCommandBuffers(myVkInstance->device, commandPool, static_cast<uint32_t>(commandBuffers.size()),
commandBuffers.data());
vkDestroyPipeline(myVkInstance->device, graphicsPipeline, nullptr);
vkDestroyPipelineLayout(myVkInstance->device, pipelineLayout, nullptr);
@@ -738,7 +758,8 @@ void HelloTriangleApplication::mainLoop() {
void HelloTriangleApplication::drawFrame() {
vkWaitForFences(myVkInstance->device, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX);
uint32_t imageIndex;
VkResult result = vkAcquireNextImageKHR(myVkInstance->device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
VkResult result = vkAcquireNextImageKHR(myVkInstance->device, swapChain, UINT64_MAX,
imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
switch (result) {
case VK_ERROR_OUT_OF_DATE_KHR:
recreateSwapChain();
@@ -760,15 +781,15 @@ void HelloTriangleApplication::drawFrame() {
VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[currentFrame]};
VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[currentFrame]};
VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
VkSubmitInfo submitInfo {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.waitSemaphoreCount = 1,
.pWaitSemaphores = waitSemaphores,
.pWaitDstStageMask = waitStages,
.commandBufferCount = 1,
.pCommandBuffers = &commandBuffers[imageIndex],
.signalSemaphoreCount = 1,
.pSignalSemaphores = signalSemaphores,
VkSubmitInfo submitInfo{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.waitSemaphoreCount = 1,
.pWaitSemaphores = waitSemaphores,
.pWaitDstStageMask = waitStages,
.commandBufferCount = 1,
.pCommandBuffers = &commandBuffers[imageIndex],
.signalSemaphoreCount = 1,
.pSignalSemaphores = signalSemaphores,
};
vkResetFences(myVkInstance->device, 1, &inFlightFences[currentFrame]);
@@ -778,14 +799,14 @@ void HelloTriangleApplication::drawFrame() {
}
VkSwapchainKHR swapchains[] = {swapChain};
VkPresentInfoKHR presentInfo {
.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
.waitSemaphoreCount = 1,
.pWaitSemaphores = signalSemaphores,
.swapchainCount = 1,
.pSwapchains = swapchains,
.pImageIndices = &imageIndex,
.pResults = nullptr,
VkPresentInfoKHR presentInfo{
.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
.waitSemaphoreCount = 1,
.pWaitSemaphores = signalSemaphores,
.swapchainCount = 1,
.pSwapchains = swapchains,
.pImageIndices = &imageIndex,
.pResults = nullptr,
};
VkResult queuePresentResult = vkQueuePresentKHR(myVkInstance->presentQueue, &presentInfo);
@@ -814,8 +835,9 @@ void HelloTriangleApplication::updateUniformBuffer(uint32_t imageIndex) {
UniformBufferObject ubo{
.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f)),
.view = glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f,0.0f,0.0f), glm::vec3(0.0f,0.0f,1.0f)),
.proj = glm::perspective(glm::radians(45.0f), swapChainExtent.width / (float) swapChainExtent.height, 0.1f, 10.f),
.view = glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)),
.proj = glm::perspective(glm::radians(45.0f), swapChainExtent.width / (float) swapChainExtent.height, 0.1f,
10.f),
};
ubo.proj[1][1] *= -1;
void *data;
@@ -843,6 +865,6 @@ void HelloTriangleApplication::cleanup() {
vkDestroyCommandPool(myVkInstance->device, commandPool, nullptr);
}
void HelloTriangleApplication::frameBufferResizeCallback(void* thisptr, int width, int height) {
static_cast<HelloTriangleApplication*>(thisptr)->frameBufferResized = true;
void HelloTriangleApplication::frameBufferResizeCallback(void *thisptr, int width, int height) {
static_cast<HelloTriangleApplication *>(thisptr)->frameBufferResized = true;
}

View File

@@ -10,6 +10,7 @@
#include <vector>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
const int MAX_FRAMES_IN_FLIGHT = 2;
@@ -53,27 +54,44 @@ private:
// Vulkan initialisation
void createSwapChain();
void createImageViews();
void createRenderPass();
void createDescriptorSetLayout();
void createDescriptorPool();
void createDescriptorSets();
void createGraphicsPipeline();
void createFrameBuffers();
void createCommandPool();
void createVertexBuffer();
void createIndexBuffer();
void createUniformBuffers();
void createCommandBuffers();
void createSyncObjects();
void initVulkan();
void recreateSwapChain();
void cleanupSwapChain();
// main loop
void mainLoop();
void drawFrame();
void updateUniformBuffer(uint32_t imageIndex);
// clean up

View File

@@ -11,9 +11,9 @@
const int DEFAULT_WIDTH = 600;
const int DEFAULT_HEIGHT = 300;
const char* DEFAULT_TITLE = "Vulkan";
const char *DEFAULT_TITLE = "Vulkan";
const char* deviceExtensions[] = {
const char *deviceExtensions[] = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
};
@@ -40,7 +40,8 @@ bool isSuitableDevice(VkPhysicalDevice device, VkSurfaceKHR surface) {
vkGetPhysicalDeviceFeatures(device, &features);
indices = findQueueFamilies(device, surface);
bool extensionSupport = checkDeviceExtensionSupport(device, deviceExtensions, sizeof(deviceExtensions) / sizeof(void*));
bool extensionSupport = checkDeviceExtensionSupport(device, deviceExtensions,
sizeof(deviceExtensions) / sizeof(void *));
bool swapChainAdequate = false;
if (extensionSupport) {
SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device, surface);
@@ -55,11 +56,11 @@ bool isSuitableDevice(VkPhysicalDevice device, VkSurfaceKHR surface) {
}
MyVkInstance::MyVkInstance(){
new (this) MyVkInstance(DEFAULT_WIDTH, DEFAULT_HEIGHT, const_cast<char *&>(DEFAULT_TITLE));
MyVkInstance::MyVkInstance() {
new(this) MyVkInstance(DEFAULT_WIDTH, DEFAULT_HEIGHT, const_cast<char *&>(DEFAULT_TITLE));
}
MyVkInstance::MyVkInstance(int width, int height, char* &title) {
MyVkInstance::MyVkInstance(int width, int height, char *&title) {
this->width = width;
this->height = height;
this->title = title;
@@ -157,7 +158,8 @@ void MyVkInstance::createLogicalDevice() {
this->indices = findQueueFamilies(physicalDevice, surface);
std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
std::set<uint32_t> uniqueQueueFamilies = {this->indices.graphicsFamily.value(), this->indices.presentFamily.value()};
std::set<uint32_t> uniqueQueueFamilies = {this->indices.graphicsFamily.value(),
this->indices.presentFamily.value()};
float queuePriority = 1.0f;
for (uint32_t queueFamily : uniqueQueueFamilies) {
VkDeviceQueueCreateInfo queueCreateInfo{};
@@ -170,7 +172,7 @@ void MyVkInstance::createLogicalDevice() {
VkPhysicalDeviceFeatures deviceFeatures{};
int numel = sizeof(deviceExtensions) / sizeof(void*);
int numel = sizeof(deviceExtensions) / sizeof(void *);
VkDeviceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
@@ -204,7 +206,7 @@ void MyVkInstance::getFrameBufferSize(int *pWidth, int *pHeight) const {
}
void MyVkInstance::frameBufferResizeCallbackHandler(GLFWwindow *glfwWindow, int mWidth, int mHeight) {
auto ptr = reinterpret_cast<MyVkInstance*>(glfwGetWindowUserPointer(glfwWindow));
auto ptr = reinterpret_cast<MyVkInstance *>(glfwGetWindowUserPointer(glfwWindow));
ptr->width = mWidth;
ptr->height = mHeight;
if (ptr->framebufferResizeCallback != nullptr) {
@@ -212,7 +214,7 @@ void MyVkInstance::frameBufferResizeCallbackHandler(GLFWwindow *glfwWindow, int
}
}
void MyVkInstance::registerResizeCallback(void* thisValue, void (*callback)(void*, int, int)) {
void MyVkInstance::registerResizeCallback(void *thisValue, void (*callback)(void *, int, int)) {
this->framebufferResizeCallbackThis = thisValue;
this->framebufferResizeCallback = callback;
}

View File

@@ -4,9 +4,11 @@
#ifndef VULKANTEST_MYVKINSTANCE_H
#define VULKANTEST_MYVKINSTANCE_H
#include <string>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include "queues.h"
@@ -14,14 +16,16 @@
class MyVkInstance {
public:
MyVkInstance();
MyVkInstance(int width, int height, char* &title);
MyVkInstance(int width, int height, char *&title);
void init();
void cleanup();
void getFrameBufferSize(int *pWidth, int *pHeight) const;
void registerResizeCallback(void*, void (*callback)(void*, int, int));
void registerResizeCallback(void *, void (*callback)(void *, int, int));
VkInstance instance{};
VkDevice device{};
@@ -29,7 +33,7 @@ public:
VkSurfaceKHR surface;
VkQueue graphicsQueue;
VkQueue presentQueue;
GLFWwindow* window{};
GLFWwindow *window{};
QueueFamilyIndices indices;
@@ -42,7 +46,8 @@ private:
int height{};
std::string title;
void *framebufferResizeCallbackThis;
void (*framebufferResizeCallback)(void*, int, int) = nullptr;
void (*framebufferResizeCallback)(void *, int, int) = nullptr;
#ifdef WITH_VALIDATION_LAYERS
VkDebugUtilsMessengerEXT debugMessenger;
@@ -53,9 +58,13 @@ private:
// init vulkan
void initVulkan();
void createInstance();
void createSurface();
void pickPhysicalDevice();
void createLogicalDevice();
static void frameBufferResizeCallbackHandler(GLFWwindow *glfwWindow, int width, int height);

View File

@@ -8,17 +8,20 @@
#include <cstring>
#ifdef WITH_VALIDATION_LAYERS
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData) {
const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,
void *pUserData) {
std::cerr << "Validation layer: " << pCallbackData->pMessage << std::endl;
return VK_FALSE;
}
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) {
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkDebugUtilsMessengerEXT *pDebugMessenger) {
auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
if (func != nullptr) {
return func(instance, pCreateInfo, pAllocator, pDebugMessenger);
@@ -27,8 +30,10 @@ VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMes
}
}
void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator) {
auto func = (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger,
const VkAllocationCallbacks *pAllocator) {
auto func = (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance,
"vkDestroyDebugUtilsMessengerEXT");
if (func != nullptr) {
func(instance, debugMessenger, pAllocator);
}
@@ -42,8 +47,8 @@ bool checkValidationLayerSupport() {
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
bool layerFound = false;
for (const auto& layerProperties : availableLayers) {
for (const char* validationLayer : validationLayers) {
for (const auto &layerProperties : availableLayers) {
for (const char *validationLayer : validationLayers) {
if (strcmp(validationLayer, layerProperties.layerName) == 0) {
layerFound = true;
break;
@@ -56,11 +61,15 @@ bool checkValidationLayerSupport() {
return layerFound;
}
void setupDebugMessenger(VkInstance instance, VkDebugUtilsMessengerEXT* debugMessenger) {
VkDebugUtilsMessengerCreateInfoEXT createInfo{};
void setupDebugMessenger(VkInstance instance, VkDebugUtilsMessengerEXT *debugMessenger) {
VkDebugUtilsMessengerCreateInfoEXT createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.messageSeverity =
VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType =
VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.pfnUserCallback = debugCallback;
createInfo.pUserData = nullptr;
@@ -68,4 +77,5 @@ void setupDebugMessenger(VkInstance instance, VkDebugUtilsMessengerEXT* debugMes
throw std::runtime_error("Failed to setup debug messenger");
}
}
#endif

View File

@@ -5,22 +5,30 @@
#ifndef VULKANTEST_DEBUGLAYERS_H
#define VULKANTEST_DEBUGLAYERS_H
#ifdef WITH_VALIDATION_LAYERS
#include <vector>
#include <vulkan/vulkan.h>
const std::vector<const char*> validationLayers = {
const std::vector<const char *> validationLayers = {
"VK_LAYER_KHRONOS_validation",
};
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData);
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger);
void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,
void *pUserData);
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkDebugUtilsMessengerEXT *pDebugMessenger);
void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger,
const VkAllocationCallbacks *pAllocator);
bool checkValidationLayerSupport();
void setupDebugMessenger(VkInstance instance, VkDebugUtilsMessengerEXT* debugMessenger);
void setupDebugMessenger(VkInstance instance, VkDebugUtilsMessengerEXT *debugMessenger);
#endif
#endif //VULKANTEST_DEBUGLAYERS_H

View File

@@ -9,7 +9,7 @@ int main() {
HelloTriangleApplication app;
try {
app.run();
} catch (const std::exception& e) {
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}

View File

@@ -6,7 +6,7 @@
#include <string>
#include <set>
bool checkDeviceExtensionSupport(VkPhysicalDevice device, const char** deviceExtensions, int count) {
bool checkDeviceExtensionSupport(VkPhysicalDevice device, const char **deviceExtensions, int count) {
uint32_t extensionCount;
vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);
@@ -14,7 +14,7 @@ bool checkDeviceExtensionSupport(VkPhysicalDevice device, const char** deviceExt
vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());
std::set<std::string> requiredExtensions(deviceExtensions, deviceExtensions + count);
for (const auto& extension : availableExtensions) {
for (const auto &extension : availableExtensions) {
requiredExtensions.erase(extension.extensionName);
}
return requiredExtensions.empty();
@@ -28,7 +28,7 @@ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, VkSurfaceKHR surfa
std::vector<VkQueueFamilyProperties> queueFamilyProperties(queueFamilyCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilyProperties.data());
int i = 0;
for (const auto& queueFamily : queueFamilyProperties) {
for (const auto &queueFamily : queueFamilyProperties) {
if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
indices.graphicsFamily = i;
}
@@ -68,8 +68,8 @@ SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device, VkSurface
return details;
}
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats) {
for (const auto& format : availableFormats) {
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR> &availableFormats) {
for (const auto &format : availableFormats) {
if (format.format == VK_FORMAT_B8G8R8A8_SRGB && format.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {
return format;
}
@@ -77,7 +77,7 @@ VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>
return availableFormats[0];
}
VkPresentModeKHR chooseSwapChainPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes) {
VkPresentModeKHR chooseSwapChainPresentMode(const std::vector<VkPresentModeKHR> &availablePresentModes) {
// for (const auto& mode : availablePresentModes) {
// if (mode == VK_PRESENT_MODE_MAILBOX_KHR) {
// return mode;
@@ -86,12 +86,14 @@ VkPresentModeKHR chooseSwapChainPresentMode(const std::vector<VkPresentModeKHR>&
return VK_PRESENT_MODE_FIFO_KHR;
}
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, uint32_t width, uint32_t height) {
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities, uint32_t width, uint32_t height) {
if (capabilities.currentExtent.width != UINT32_MAX) {
return capabilities.currentExtent;
}
VkExtent2D actualExtend = {width, height};
actualExtend.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtend.width));
actualExtend.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtend.height));
actualExtend.width = std::max(capabilities.minImageExtent.width,
std::min(capabilities.maxImageExtent.width, actualExtend.width));
actualExtend.height = std::max(capabilities.minImageExtent.height,
std::min(capabilities.maxImageExtent.height, actualExtend.height));
return actualExtend;
}

View File

@@ -4,6 +4,7 @@
#ifndef VULKANTEST_QUEUES_H
#define VULKANTEST_QUEUES_H
#include <optional>
#include <vulkan/vulkan.h>
#include <vector>
@@ -23,11 +24,16 @@ struct SwapChainSupportDetails {
std::vector<VkPresentModeKHR> presentModes;
};
bool checkDeviceExtensionSupport(VkPhysicalDevice device, const char** deviceExtensions, int size);
bool checkDeviceExtensionSupport(VkPhysicalDevice device, const char **deviceExtensions, int size);
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, VkSurfaceKHR surface);
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device, VkSurfaceKHR surface);
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats);
VkPresentModeKHR chooseSwapChainPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes);
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, uint32_t width, uint32_t height);
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR> &availableFormats);
VkPresentModeKHR chooseSwapChainPresentMode(const std::vector<VkPresentModeKHR> &availablePresentModes);
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities, uint32_t width, uint32_t height);
#endif //VULKANTEST_QUEUES_H

View File

@@ -5,7 +5,7 @@
#include "util.h"
#include <fstream>
void readFile(const std::string& filename, std::vector<char>* target) {
void readFile(const std::string &filename, std::vector<char> *target) {
std::ifstream file(filename, std::ios::ate | std::ios::binary);
if (!file.is_open()) {

View File

@@ -4,9 +4,10 @@
#ifndef VULKANTEST_UTIL_H
#define VULKANTEST_UTIL_H
#include <vector>
#include <string>
void readFile(const std::string& filename, std::vector<char>* target);
void readFile(const std::string &filename, std::vector<char> *target);
#endif //VULKANTEST_UTIL_H