Fixed auto-gen mips on resolved MSAA render targets. (#3845)

This commit is contained in:
Branimir Karadžić
2026-07-24 15:44:05 -07:00
committed by GitHub
parent c1da9d62b0
commit 8e50cd586c
5 changed files with 152 additions and 29 deletions

View File

@@ -6556,7 +6556,6 @@ VK_DESTROY
if (m_sampler.Count > 1)
{
BX_ASSERT(VK_IMAGE_VIEW_TYPE_3D != m_type, "Can't create multisample 3D image.");
BX_ASSERT(m_numMips <= 1, "Can't create multisample image with mip chain.");
}
VkImageCreateInfo ici;
@@ -6614,6 +6613,10 @@ VK_DESTROY
: ici.mipLevels
;
BX_ASSERT(1 == m_sampler.Count || ici.mipLevels <= 1
, "Can't create multisample image with mip chain."
);
if (0 != _external)
{
static_assert(sizeof(m_textureImage) == sizeof(_external), "Size must match!");
@@ -7245,6 +7248,84 @@ VK_DESTROY
, 1
, &resolve
);
const bool autoGenMips = true
&& 0 != (_resolve & BGFX_RESOLVE_AUTO_GEN_MIPS)
&& 0 == (m_flags & BGFX_TEXTURE_RT_WRITE_ONLY)
&& (_mip + 1) < m_numMips
;
if (autoGenMips)
{
BGFX_PROFILER_SCOPE("Resolve - Generate Mipmaps (MSAA)", kColorResource);
int32_t mipWidth = bx::max<int32_t>(int32_t(m_width) >> _mip, 1);
int32_t mipHeight = bx::max<int32_t>(int32_t(m_height) >> _mip, 1);
const VkFilter filter = bimg::isDepth(bimg::TextureFormat::Enum(m_textureFormat) )
? VK_FILTER_NEAREST
: VK_FILTER_LINEAR
;
VkImageBlit blit;
blit.srcOffsets[0] = { 0, 0, 0 };
blit.srcSubresource.aspectMask = m_aspectFlags;
blit.srcSubresource.baseArrayLayer = _layer;
blit.srcSubresource.layerCount = numLayers;
blit.dstOffsets[0] = { 0, 0, 0 };
blit.dstSubresource.aspectMask = m_aspectFlags;
blit.dstSubresource.baseArrayLayer = _layer;
blit.dstSubresource.layerCount = numLayers;
for (uint32_t i = _mip + 1; i < m_numMips; i++)
{
BGFX_PROFILER_SCOPE("Mipmap", kColorResource);
blit.srcOffsets[1] = { mipWidth, mipHeight, 1 };
blit.srcSubresource.mipLevel = i - 1;
mipWidth = bx::max(mipWidth >> 1, 1);
mipHeight = bx::max(mipHeight >> 1, 1);
blit.dstOffsets[1] = { mipWidth, mipHeight, 1 };
blit.dstSubresource.mipLevel = i;
setImageMemoryBarrier(
_commandBuffer
, m_singleMsaaImage
, m_aspectFlags
, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
, blit.srcSubresource.mipLevel
, 1
, _layer
, numLayers
);
vkCmdBlitImage(
_commandBuffer
, m_singleMsaaImage
, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
, m_singleMsaaImage
, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
, 1
, &blit
, filter
);
}
setImageMemoryBarrier(
_commandBuffer
, m_singleMsaaImage
, m_aspectFlags
, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
, _mip
, m_numMips - _mip - 1
, _layer
, numLayers
);
}
}
if (needMipGen)