From 3fff761bcad942446d2a2f686252782e813fd16c Mon Sep 17 00:00:00 2001 From: kearwood Date: Thu, 12 Aug 2021 19:51:47 -0700 Subject: [PATCH] Creating Vulkan framebufffers --- kraken/KRContext.cpp | 30 +++++++++++++++++++++++++++++- kraken/KRContext.h | 1 + kraken/KRPipeline.cpp | 5 +++++ kraken/KRPipeline.h | 2 ++ kraken/KRPipelineManager.cpp | 12 ++++++++++++ kraken/KRPipelineManager.h | 1 + 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index 9fb7528..3228b66 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -804,6 +804,9 @@ KRContext::destroySurfaces() for (auto itr = m_surfaces.begin(); itr != m_surfaces.end(); itr++) { SurfaceInfo& surfaceInfo = (*itr).second; DeviceInfo& deviceInfo = GetDeviceInfo(surfaceInfo.deviceHandle); + for (auto framebuffer : surfaceInfo.swapChainFramebuffers) { + vkDestroyFramebuffer(deviceInfo.logicalDevice, framebuffer, nullptr); + } vkDestroySwapchainKHR(deviceInfo.logicalDevice, surfaceInfo.swapChain, nullptr); vkDestroySurfaceKHR(m_vulkanInstance, surfaceInfo.surface, nullptr); @@ -913,7 +916,6 @@ KrResult KRContext::createWindowSurface(const KrCreateWindowSurfaceInfo* createW return KR_ERROR_NO_DEVICE; } - // TODO - Support multiple devices rather than just choosing the first DeviceInfo* deviceInfo = nullptr; #ifdef WIN32 @@ -1072,11 +1074,37 @@ KrResult KRContext::createWindowSurface(const KrCreateWindowSurfaceInfo* createW KrSurfaceHandle surfaceHandle = ++m_topSurfaceHandle; m_surfaces.insert(std::pair(surfaceHandle, info)); + m_surfaceHandleMap.insert(std::pair(createWindowSurfaceInfo->surfaceHandle, surfaceHandle)); m_pPipelineManager->createPipelines(surfaceHandle); + { + KRPipeline* testPipeline = m_pPipelineManager->get("simple_blit"); + SurfaceInfo& surface = m_surfaces[surfaceHandle]; + surface.swapChainFramebuffers.resize(surface.swapChainImageViews.size()); + + for (size_t i = 0; i < surface.swapChainImageViews.size(); i++) { + VkImageView attachments[] = { + surface.swapChainImageViews[i] + }; + + VkFramebufferCreateInfo framebufferInfo{}; + framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + framebufferInfo.renderPass = testPipeline->GetRenderPass(); + framebufferInfo.attachmentCount = 1; + framebufferInfo.pAttachments = attachments; + framebufferInfo.width = surface.swapChainExtent.width; + framebufferInfo.height = surface.swapChainExtent.height; + framebufferInfo.layers = 1; + + if (vkCreateFramebuffer(deviceInfo->logicalDevice, &framebufferInfo, nullptr, &surface.swapChainFramebuffers[i]) != VK_SUCCESS) { + // TODO - Error Handling + } + } + } + return KR_SUCCESS; #else // Not implemented for this platform diff --git a/kraken/KRContext.h b/kraken/KRContext.h index e4baf6e..62389ff 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -150,6 +150,7 @@ public: VkFormat swapChainImageFormat; VkExtent2D swapChainExtent; std::vector swapChainImageViews; + std::vector swapChainFramebuffers; #ifdef WIN32 HWND hWnd; #endif diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 94fdd59..3f503d3 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -763,3 +763,8 @@ bool KRPipeline::bind(KRCamera &camera, const KRViewport &viewport, const Matrix const char *KRPipeline::getKey() const { return m_szKey; } + +VkRenderPass& KRPipeline::GetRenderPass() +{ + return m_renderPass; +} \ No newline at end of file diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index f539c31..b55a33e 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -144,6 +144,8 @@ public: void setUniform(int location, const Vector3 &value); void setUniform(int location, const Vector4 &value); void setUniform(int location, const Matrix4 &value); + + VkRenderPass& GetRenderPass(); private: GLuint m_iProgram; diff --git a/kraken/KRPipelineManager.cpp b/kraken/KRPipelineManager.cpp index 89df35f..e0e46fb 100644 --- a/kraken/KRPipelineManager.cpp +++ b/kraken/KRPipelineManager.cpp @@ -286,3 +286,15 @@ bool KRPipelineManager::selectPipeline(KRCamera &camera, KRPipeline *pPipeline, size_t KRPipelineManager::getPipelineHandlesUsed() { return m_pipelines.size(); } + + +KRPipeline* KRPipelineManager::get(const char* name) +{ + std::pair > key; + key.first = name; + auto itr = m_pipelines.find(key); + if (itr == m_pipelines.end()) { + return nullptr; + } + return (*itr).second; +} \ No newline at end of file diff --git a/kraken/KRPipelineManager.h b/kraken/KRPipelineManager.h index 1923166..a90ba47 100644 --- a/kraken/KRPipelineManager.h +++ b/kraken/KRPipelineManager.h @@ -52,6 +52,7 @@ public: KRPipelineManager(KRContext &context); virtual ~KRPipelineManager(); void createPipelines(KrSurfaceHandle surface); + KRPipeline* get(const char* szKey); KRPipeline *getPipeline(const std::string &pipeline_name, KRCamera *pCamera, const std::vector &point_lights, const std::vector &directional_lights, const std::vector&spot_lights, int bone_count, bool bDiffuseMap, bool bNormalMap, bool bSpecMap, bool bReflectionMap, bool bReflectionCubeMap, bool bLightMap, bool bDiffuseMapScale,bool bSpecMapScale, bool bNormalMapScale, bool bReflectionMapScale, bool bDiffuseMapOffset, bool bSpecMapOffset, bool bNormalMapOffset, bool bReflectionMapOffset, bool bAlphaTest, bool bAlphaBlend, KRNode::RenderPass renderPass, bool bRimColor = false);