Add render function
This commit is contained in:
parent
e93f375ca6
commit
e085acbe40
3 changed files with 94 additions and 0 deletions
|
@ -5,6 +5,12 @@
|
||||||
struct RenderTarget {
|
struct RenderTarget {
|
||||||
VkSurfaceKHR surface = nullptr;
|
VkSurfaceKHR surface = nullptr;
|
||||||
VkSwapchainKHR swapchain = nullptr;
|
VkSwapchainKHR swapchain = nullptr;
|
||||||
|
|
||||||
|
VkCommandBuffer* commandBuffers = nullptr;
|
||||||
|
|
||||||
|
VkSemaphore imageAvailableSemaphore = nullptr;
|
||||||
|
VkSemaphore renderFinishedSemaphore = nullptr;
|
||||||
|
VkFence* fences = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Renderer {
|
class Renderer {
|
||||||
|
@ -12,6 +18,8 @@ public:
|
||||||
Renderer();
|
Renderer();
|
||||||
~Renderer();
|
~Renderer();
|
||||||
|
|
||||||
|
void render(RenderTarget* target);
|
||||||
|
|
||||||
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface);
|
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface);
|
||||||
void destroyRenderTarget(RenderTarget* target);
|
void destroyRenderTarget(RenderTarget* target);
|
||||||
|
|
||||||
|
@ -25,6 +33,7 @@ private:
|
||||||
void createDebugMessenger();
|
void createDebugMessenger();
|
||||||
#endif
|
#endif
|
||||||
void createLogicalDevice();
|
void createLogicalDevice();
|
||||||
|
void createCommandPool();
|
||||||
|
|
||||||
VkInstance instance_ = nullptr;
|
VkInstance instance_ = nullptr;
|
||||||
|
|
||||||
|
@ -45,4 +54,6 @@ private:
|
||||||
} queueIndices;
|
} queueIndices;
|
||||||
|
|
||||||
VkQueue graphicsQueue_ = nullptr;
|
VkQueue graphicsQueue_ = nullptr;
|
||||||
|
|
||||||
|
VkCommandPool commandPool_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,6 +35,8 @@ int main(int, char*[]) {
|
||||||
if(event.type == SDL_QUIT)
|
if(event.type == SDL_QUIT)
|
||||||
running = false;
|
running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer->render(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->destroyRenderTarget(target);
|
renderer->destroyRenderTarget(target);
|
||||||
|
|
|
@ -14,6 +14,7 @@ Renderer::Renderer() {
|
||||||
createDebugMessenger();
|
createDebugMessenger();
|
||||||
#endif
|
#endif
|
||||||
createLogicalDevice();
|
createLogicalDevice();
|
||||||
|
createCommandPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::~Renderer() {
|
Renderer::~Renderer() {
|
||||||
|
@ -26,6 +27,47 @@ Renderer::~Renderer() {
|
||||||
vkDestroyInstance(instance_, nullptr);
|
vkDestroyInstance(instance_, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::render(RenderTarget* target) {
|
||||||
|
uint32_t imageIndex = 0;
|
||||||
|
vkAcquireNextImageKHR(device_, target->swapchain, UINT64_MAX, target->imageAvailableSemaphore, nullptr, &imageIndex);
|
||||||
|
|
||||||
|
vkWaitForFences(device_, 1, &target->fences[imageIndex], true, UINT64_MAX);
|
||||||
|
vkResetFences(device_, 1, &target->fences[imageIndex]);
|
||||||
|
|
||||||
|
const VkCommandBuffer commandBuffer = target->commandBuffers[imageIndex];
|
||||||
|
|
||||||
|
VkCommandBufferBeginInfo beginInfo = {};
|
||||||
|
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
|
||||||
|
vkBeginCommandBuffer(commandBuffer, &beginInfo);
|
||||||
|
|
||||||
|
vkEndCommandBuffer(commandBuffer);
|
||||||
|
|
||||||
|
const VkPipelineStageFlags waitStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
|
||||||
|
VkSubmitInfo submitInfo = {};
|
||||||
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
submitInfo.waitSemaphoreCount = 1;
|
||||||
|
submitInfo.pWaitSemaphores = &target->imageAvailableSemaphore;
|
||||||
|
submitInfo.pWaitDstStageMask = &waitStage;
|
||||||
|
submitInfo.commandBufferCount = 1;
|
||||||
|
submitInfo.pCommandBuffers = &commandBuffer;
|
||||||
|
submitInfo.signalSemaphoreCount = 1;
|
||||||
|
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
|
||||||
|
|
||||||
|
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[imageIndex]);
|
||||||
|
|
||||||
|
VkPresentInfoKHR presentInfo = {};
|
||||||
|
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
|
presentInfo.waitSemaphoreCount = 1;
|
||||||
|
presentInfo.pWaitSemaphores = &target->renderFinishedSemaphore;
|
||||||
|
presentInfo.swapchainCount = 1;
|
||||||
|
presentInfo.pSwapchains = &target->swapchain;
|
||||||
|
presentInfo.pImageIndices = &imageIndex;
|
||||||
|
|
||||||
|
vkQueuePresentKHR(graphicsQueue_, &presentInfo);
|
||||||
|
}
|
||||||
|
|
||||||
RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
|
RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
|
||||||
RenderTarget* target = new RenderTarget();
|
RenderTarget* target = new RenderTarget();
|
||||||
target->surface = surface;
|
target->surface = surface;
|
||||||
|
@ -68,6 +110,37 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
|
||||||
|
|
||||||
delete[] surfaceFormats;
|
delete[] surfaceFormats;
|
||||||
|
|
||||||
|
uint32_t swapchainImageCount = 0;
|
||||||
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr);
|
||||||
|
|
||||||
|
VkImage* swapchainImages = new VkImage[swapchainImageCount];
|
||||||
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, swapchainImages);
|
||||||
|
|
||||||
|
VkCommandBufferAllocateInfo allocateInfo = {};
|
||||||
|
allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||||
|
allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
|
allocateInfo.commandPool = commandPool_;
|
||||||
|
allocateInfo.commandBufferCount = swapchainImageCount;
|
||||||
|
|
||||||
|
target->commandBuffers = new VkCommandBuffer[swapchainImageCount];
|
||||||
|
|
||||||
|
vkAllocateCommandBuffers(device_, &allocateInfo, target->commandBuffers);
|
||||||
|
|
||||||
|
VkSemaphoreCreateInfo semaphoreCreateInfo = {};
|
||||||
|
semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||||
|
|
||||||
|
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->imageAvailableSemaphore);
|
||||||
|
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->renderFinishedSemaphore);
|
||||||
|
|
||||||
|
VkFenceCreateInfo fenceCreateInfo = {};
|
||||||
|
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
|
fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||||
|
|
||||||
|
target->fences = new VkFence[swapchainImageCount];
|
||||||
|
|
||||||
|
for(uint32_t i = 0; i < swapchainImageCount; i++)
|
||||||
|
vkCreateFence(device_, &fenceCreateInfo, nullptr, &target->fences[i]);
|
||||||
|
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,3 +276,11 @@ void Renderer::createLogicalDevice() {
|
||||||
|
|
||||||
vkGetDeviceQueue(device_, queueIndices.graphics, 0, &graphicsQueue_);
|
vkGetDeviceQueue(device_, queueIndices.graphics, 0, &graphicsQueue_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::createCommandPool() {
|
||||||
|
VkCommandPoolCreateInfo poolCreateInfo = {};
|
||||||
|
poolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
poolCreateInfo.queueFamilyIndex = queueIndices.graphics;
|
||||||
|
|
||||||
|
vkCreateCommandPool(device_, &poolCreateInfo, nullptr, &commandPool_);
|
||||||
|
}
|
||||||
|
|
Reference in a new issue