Use render pass creation data for render pass hash. (#3636)

This commit is contained in:
Branimir Karadžić
2026-03-21 00:14:13 -07:00
committed by GitHub
parent 4e6b6f0264
commit f26d3b1342
2 changed files with 27 additions and 21 deletions

View File

@@ -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;

View File

@@ -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;