feat: reformatted code
This commit is contained in:
@@ -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, ©Region);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
14
src/queues.h
14
src/queues.h
@@ -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
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user