diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 7ee792397..237c2dea8 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -3358,7 +3358,7 @@ VK_IMPORT_DEVICE } } - VkResult getRenderPass(uint8_t _num, const VkFormat* _formats, const VkImageAspectFlags* _aspects, const bool* _resolve, VkSampleCountFlagBits _samples, ::VkRenderPass* _renderPass, uint16_t _clearFlags) + VkResult getRenderPass(uint8_t _num, const VkFormat* _formats, const VkImageAspectFlags* _aspects, const bool* _resolve, VkSampleCountFlagBits _samples, uint16_t _clearFlags, ::VkRenderPass* _outRenderPass, uint32_t* _outHashKey) { VkResult result = VK_SUCCESS; @@ -3378,11 +3378,16 @@ VK_IMPORT_DEVICE } uint32_t hashKey = hash.end(); + if (NULL != _outHashKey) + { + *_outHashKey = hashKey; + } + VkRenderPass renderPass = m_renderPassCache.find(hashKey); if (VK_NULL_HANDLE != renderPass) { - *_renderPass = renderPass; + *_outRenderPass = renderPass; return result; } @@ -3527,12 +3532,12 @@ VK_IMPORT_DEVICE m_renderPassCache.add(hashKey, renderPass); - *_renderPass = renderPass; + *_outRenderPass = renderPass; return result; } - VkResult getRenderPass(uint8_t _num, const Attachment* _attachments, ::VkRenderPass* _renderPass, uint16_t _clearFlags) + VkResult getRenderPass(uint8_t _num, const Attachment* _attachments, uint16_t _clearFlags, ::VkRenderPass* _outRenderPass, uint32_t* _outHashKey = NULL) { VkFormat formats[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS]; VkImageAspectFlags aspects[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS]; @@ -3546,10 +3551,10 @@ VK_IMPORT_DEVICE samples = texture.m_sampler.Sample; } - return getRenderPass(_num, formats, aspects, NULL, samples, _renderPass, _clearFlags); + return getRenderPass(_num, formats, aspects, NULL, samples, _clearFlags, _outRenderPass, _outHashKey); } - VkResult getRenderPass(const SwapChainVK& swapChain, ::VkRenderPass* _renderPass, uint16_t _clearFlags) + VkResult getRenderPass(const SwapChainVK& swapChain, uint16_t _clearFlags, ::VkRenderPass* _outRenderPass, uint32_t* _outHashKey = NULL) { const VkFormat formats[2] = { @@ -3576,7 +3581,7 @@ VK_IMPORT_DEVICE : 1 ; - return getRenderPass(num, formats, aspects, resolve, samples, _renderPass, _clearFlags); + return getRenderPass(num, formats, aspects, resolve, samples, _clearFlags, _outRenderPass, _outHashKey); } VkSampler getSampler(uint32_t _flags, VkFormat _format, const float _palette[][4]) @@ -3819,7 +3824,7 @@ VK_IMPORT_DEVICE murmur.add(layout.m_attributes, sizeof(layout.m_attributes) ); murmur.add(_numInstanceData); - murmur.add(frameBuffer.m_renderPass); + murmur.add(frameBuffer.m_renderPassHashKey); const uint32_t hash = murmur.end(); VkPipeline pipeline = m_pipelineStateCache.find(hash); @@ -8032,7 +8037,7 @@ retry: const VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb; VkRenderPass renderPass; - result = s_renderVK->getRenderPass(*this, &renderPass, 0); + result = s_renderVK->getRenderPass(*this, 0, &renderPass); if (VK_SUCCESS != result) { @@ -8339,7 +8344,7 @@ retry: return result; } - result = s_renderVK->getRenderPass(m_swapChain, &m_renderPass, 0); + result = s_renderVK->getRenderPass(m_swapChain, 0, &m_renderPass, &m_renderPassHashKey); if (VK_SUCCESS != result) { @@ -8361,11 +8366,11 @@ retry: if (m_numTh > 0) { - VK_CHECK(s_renderVK->getRenderPass(m_numTh, m_attachment, &renderPass, _clearFlags) ); + VK_CHECK(s_renderVK->getRenderPass(m_numTh, m_attachment, _clearFlags, &renderPass) ); } else { - VK_CHECK(s_renderVK->getRenderPass(m_swapChain, &renderPass, _clearFlags) ); + VK_CHECK(s_renderVK->getRenderPass(m_swapChain, _clearFlags, &renderPass) ); } return renderPass; @@ -8395,7 +8400,7 @@ retry: const VkDevice device = s_renderVK->m_device; const VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb; - VK_CHECK(s_renderVK->getRenderPass(m_numTh, m_attachment, &m_renderPass, 0) ); + VK_CHECK(s_renderVK->getRenderPass(m_numTh, m_attachment, 0, &m_renderPass, &m_renderPassHashKey) ); m_depth = BGFX_INVALID_HANDLE; m_num = 0; @@ -8453,7 +8458,7 @@ retry: BGFX_PROFILER_SCOPE("FrameBufferVK::update", kColorResource); m_swapChain.update(_commandBuffer, m_nwh, _resolution); - VK_CHECK(s_renderVK->getRenderPass(m_swapChain, &m_renderPass, 0) ); + VK_CHECK(s_renderVK->getRenderPass(m_swapChain, 0, &m_renderPass, &m_renderPassHashKey) ); // Don't believe the passed Resolution, as the Vulkan driver might have // specified another resolution, which we had to obey. m_width = m_swapChain.m_sci.imageExtent.width; diff --git a/src/renderer_vk.h b/src/renderer_vk.h index 76b6e2507..a2ad44fbc 100644 --- a/src/renderer_vk.h +++ b/src/renderer_vk.h @@ -916,18 +916,19 @@ VK_DESTROY_FUNC(DescriptorSet); uint32_t m_width; uint32_t m_height; uint16_t m_denseIdx; - uint8_t m_num; - uint8_t m_numTh; + uint8_t m_num; + uint8_t m_numTh; Attachment m_attachment[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS]; SwapChainVK m_swapChain; void* m_nwh; - bool m_needPresent; - bool m_needResolve; + bool m_needPresent; + bool m_needResolve; - VkImageView m_textureImageViews[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS]; + VkImageView m_textureImageViews[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS]; VkFramebuffer m_framebuffer; - VkRenderPass m_renderPass; + VkRenderPass m_renderPass; + uint32_t m_renderPassHashKey; MsaaSamplerVK m_sampler; VkFramebuffer m_currentFramebuffer; @@ -953,7 +954,7 @@ VK_DESTROY_FUNC(DescriptorSet); void removeExternal(TextureHandle _handle); uint32_t m_queueFamily; - VkQueue m_queue; + VkQueue m_queue; uint32_t m_currentFrameInFlight; uint32_t m_consumeIndex;