Framebuffers creation and commandbuffers
This commit is contained in:
@@ -62,6 +62,11 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
std::vector<VkImageView> swapChainImageViews;
|
std::vector<VkImageView> swapChainImageViews;
|
||||||
VkRenderPass renderPass;
|
VkRenderPass renderPass;
|
||||||
VkPipelineLayout pipelineLayout;
|
VkPipelineLayout pipelineLayout;
|
||||||
|
VkPipeline graphicsPipeline;
|
||||||
|
std::vector<VkFramebuffer> swapchainFrameBuffers;
|
||||||
|
VkCommandPool commandPool;
|
||||||
|
VkCommandBuffer commandBuffer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct SwapChainSupportDetails {
|
struct SwapChainSupportDetails {
|
||||||
@@ -90,6 +95,68 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
createImageViews();
|
createImageViews();
|
||||||
createRenderPass();
|
createRenderPass();
|
||||||
createGraphicsPipeline();
|
createGraphicsPipeline();
|
||||||
|
createFramebuffers();
|
||||||
|
createCommandPool();
|
||||||
|
createCommandBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
|
||||||
|
VkCommandBufferBeginInfo beginInfo{};
|
||||||
|
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
|
||||||
|
if (vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("failed to begin recording command buffer!");
|
||||||
|
}
|
||||||
|
|
||||||
|
VkRenderPassBeginInfo renderPassInfo{};
|
||||||
|
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
|
renderPassInfo.renderPass = renderPass;
|
||||||
|
renderPassInfo.framebuffer = swapchainFrameBuffers[imageIndex];
|
||||||
|
|
||||||
|
renderPassInfo.renderArea.offset = { 0,0 };
|
||||||
|
renderPassInfo.renderArea.extent = swapChainExtent;
|
||||||
|
|
||||||
|
VkClearValue clearColor = { {{0.0f, 0.0f, 0.0f, 1.0f}} };
|
||||||
|
renderPassInfo.clearValueCount = 1;
|
||||||
|
renderPassInfo.pClearValues = &clearColor;
|
||||||
|
|
||||||
|
vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
|
||||||
|
|
||||||
|
VkViewport viewport{};
|
||||||
|
viewport.x = 0.0f;
|
||||||
|
viewport.y = 0.0f;
|
||||||
|
viewport.width = static_cast<float>(swapChainExtent.width);
|
||||||
|
viewport.height = static_cast<float>(swapChainExtent.height);
|
||||||
|
viewport.minDepth = 0.0f;
|
||||||
|
viewport.maxDepth = 1.0f;
|
||||||
|
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
|
||||||
|
|
||||||
|
VkRect2D scissor{};
|
||||||
|
scissor.offset = { 0,0 };
|
||||||
|
scissor.extent = swapChainExtent;
|
||||||
|
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
|
||||||
|
|
||||||
|
vkCmdDraw(commandBuffer, 3, 1, 0, 0);
|
||||||
|
|
||||||
|
vkCmdEndRenderPass(commandBuffer);
|
||||||
|
|
||||||
|
if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("failed to record command buffer!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void createCommandBuffer() {
|
||||||
|
VkCommandBufferAllocateInfo allocInfo{};
|
||||||
|
allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||||
|
allocInfo.commandPool = commandPool;
|
||||||
|
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
|
allocInfo.commandBufferCount = 1;
|
||||||
|
|
||||||
|
if (vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("failed to allocate command buffers!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void createSurface() {
|
void createSurface() {
|
||||||
@@ -305,34 +372,6 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
inputAssembly.primitiveRestartEnable = VK_FALSE;
|
inputAssembly.primitiveRestartEnable = VK_FALSE;
|
||||||
|
|
||||||
|
|
||||||
#define STATIC_VIEWPORT_SCISSOR_PIPELINE
|
|
||||||
|
|
||||||
#if true
|
|
||||||
// STATIC VIEWPORT & SCISSOR
|
|
||||||
|
|
||||||
|
|
||||||
VkViewport viewport{};
|
|
||||||
viewport.x = 0.0f;
|
|
||||||
viewport.y = 0.0f;
|
|
||||||
viewport.width = (float)swapChainExtent.width;
|
|
||||||
viewport.height = (float)swapChainExtent.height;
|
|
||||||
viewport.minDepth = 0.0f;
|
|
||||||
viewport.maxDepth = 1.0f;
|
|
||||||
|
|
||||||
VkRect2D scissor{};
|
|
||||||
scissor.offset = { 0,0 };
|
|
||||||
scissor.extent = swapChainExtent;
|
|
||||||
|
|
||||||
VkPipelineViewportStateCreateInfo viewportState{};
|
|
||||||
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
|
||||||
viewportState.viewportCount = 1;
|
|
||||||
viewportState.pViewports = &viewport;
|
|
||||||
viewportState.scissorCount = 1;
|
|
||||||
viewportState.pScissors = &scissor;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
// DYNAMIC VIEWPORT & SCISSOR
|
// DYNAMIC VIEWPORT & SCISSOR
|
||||||
|
|
||||||
std::vector<VkDynamicState> dynamicStates = {
|
std::vector<VkDynamicState> dynamicStates = {
|
||||||
@@ -350,7 +389,6 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||||
viewportState.viewportCount = 1;
|
viewportState.viewportCount = 1;
|
||||||
viewportState.scissorCount = 1;
|
viewportState.scissorCount = 1;
|
||||||
#endif
|
|
||||||
|
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizer{};
|
VkPipelineRasterizationStateCreateInfo rasterizer{};
|
||||||
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||||
@@ -386,11 +424,75 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
throw std::runtime_error("failed to create pipeline layout!");
|
throw std::runtime_error("failed to create pipeline layout!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VkGraphicsPipelineCreateInfo pipelineInfo{};
|
||||||
|
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
pipelineInfo.stageCount = 2;
|
||||||
|
pipelineInfo.pStages = shaderStages;
|
||||||
|
|
||||||
|
pipelineInfo.pVertexInputState = &vertexInputInfo;
|
||||||
|
pipelineInfo.pInputAssemblyState = &inputAssembly;
|
||||||
|
pipelineInfo.pViewportState = &viewportState;
|
||||||
|
pipelineInfo.pRasterizationState = &rasterizer;
|
||||||
|
pipelineInfo.pMultisampleState = &multisampling;
|
||||||
|
pipelineInfo.pDepthStencilState = nullptr;
|
||||||
|
pipelineInfo.pColorBlendState = &colorBlending;
|
||||||
|
pipelineInfo.pDynamicState = &dynamicState;
|
||||||
|
|
||||||
|
pipelineInfo.layout = pipelineLayout;
|
||||||
|
|
||||||
|
pipelineInfo.renderPass = renderPass;
|
||||||
|
pipelineInfo.subpass = 0;
|
||||||
|
|
||||||
|
if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("Failed to create graphics pipeline!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
vkDestroyShaderModule(device, vertShaderModule, nullptr);
|
vkDestroyShaderModule(device, vertShaderModule, nullptr);
|
||||||
vkDestroyShaderModule(device, fragShaderModule, nullptr);
|
vkDestroyShaderModule(device, fragShaderModule, nullptr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void createFramebuffers() {
|
||||||
|
swapchainFrameBuffers.resize(swapChainImageViews.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < swapChainImageViews.size(); i++) {
|
||||||
|
VkImageView attachements[] = {
|
||||||
|
swapChainImageViews[i]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
VkFramebufferCreateInfo framebufferInfo{};
|
||||||
|
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||||
|
framebufferInfo.renderPass = renderPass;
|
||||||
|
framebufferInfo.attachmentCount = 1;
|
||||||
|
framebufferInfo.pAttachments = attachements;
|
||||||
|
framebufferInfo.width = swapChainExtent.width;
|
||||||
|
framebufferInfo.height = swapChainExtent.height;
|
||||||
|
framebufferInfo.layers = 1;
|
||||||
|
|
||||||
|
if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapchainFrameBuffers[i]) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("failed to create framebuffer!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void createCommandPool() {
|
||||||
|
QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice);
|
||||||
|
|
||||||
|
VkCommandPoolCreateInfo poolInfo{};
|
||||||
|
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||||
|
poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value();
|
||||||
|
|
||||||
|
if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) {
|
||||||
|
throw std::runtime_error("Failed to create command pool!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
VkShaderModule createShaderModule(const std::vector<char>& code) {
|
VkShaderModule createShaderModule(const std::vector<char>& code) {
|
||||||
VkShaderModuleCreateInfo createInfo{};
|
VkShaderModuleCreateInfo createInfo{};
|
||||||
@@ -717,7 +819,13 @@ const std::vector<const char*> deviceExtensions = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cleanup(){
|
void cleanup(){
|
||||||
|
vkDestroyCommandPool(device, commandPool, nullptr);
|
||||||
|
|
||||||
|
for (auto framebuffer : swapchainFrameBuffers) {
|
||||||
|
vkDestroyFramebuffer(device, framebuffer, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
vkDestroyPipeline(device, graphicsPipeline, nullptr);
|
||||||
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
||||||
vkDestroyRenderPass(device, renderPass, nullptr);
|
vkDestroyRenderPass(device, renderPass, nullptr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user