mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-10-25 10:20:52 +00:00
Fixed auto-gen mips on resolved MSAA render targets. (#3845)
This commit is contained in:
committed by
GitHub
parent
c1da9d62b0
commit
8e50cd586c
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user