Fix MSAA + mipmaps combination on D3D11/D3D12/Vulkan/Metal. (#3717)

This commit is contained in:
Branimir Karadžić
2026-05-21 15:53:17 -07:00
committed by GitHub
parent 526b886105
commit 7d03e160fa
4 changed files with 36 additions and 10 deletions

View File

@@ -4604,9 +4604,13 @@ namespace bgfx { namespace d3d11
if (needResolve)
{
const uint32_t savedMipLevels = desc.MipLevels;
desc.MipLevels = 1;
DX_CHECK(s_renderD3D11->m_device->CreateTexture2D(&desc, NULL, &m_rt2d) );
desc.BindFlags &= ~(D3D11_BIND_RENDER_TARGET|D3D11_BIND_DEPTH_STENCIL);
desc.SampleDesc = s_msaa[0];
desc.MipLevels = savedMipLevels;
}
if (!external)

View File

@@ -5757,6 +5757,15 @@ namespace bgfx { namespace d3d12
}
else
{
const uint32_t savedMipLevels = resourceDesc.MipLevels;
const D3D12_RESOURCE_FLAGS savedFlags = resourceDesc.Flags;
if (needResolve)
{
resourceDesc.MipLevels = 1;
resourceDesc.Flags &= ~D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
}
m_ptr = createCommittedResource(
device
, HeapProperty::Texture
@@ -5768,6 +5777,12 @@ namespace bgfx { namespace d3d12
: D3D12_HEAP_FLAG_NONE
);
if (needResolve)
{
resourceDesc.MipLevels = savedMipLevels;
resourceDesc.Flags = savedFlags;
}
if (externalShared)
{
DX_CHECK(device->CreateSharedHandle(

View File

@@ -3498,6 +3498,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
{
desc->setTextureType(MTL::TextureType2DMultisample);
desc->setSampleCount(sampleCount);
desc->setMipmapLevelCount(1);
if (s_renderMtl->m_hasCPUCacheModesAndStorageModes)
{

View File

@@ -6504,6 +6504,18 @@ retry:
;
ici.tiling = VK_IMAGE_TILING_OPTIMAL;
const bool needResolve = true
&& 1 < m_sampler.Count
&& 0 != (ici.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
&& 0 == (m_flags & BGFX_TEXTURE_MSAA_SAMPLE)
&& 0 == (m_flags & BGFX_TEXTURE_RT_WRITE_ONLY)
;
ici.mipLevels = needResolve
? 1
: ici.mipLevels
;
if (0 != _external)
{
static_assert(sizeof(m_textureImage) == sizeof(_external), "Size must match!");
@@ -6545,19 +6557,13 @@ retry:
: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
;
const bool needResolve = true
&& 1 < m_sampler.Count
&& 0 != (ici.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
&& 0 == (m_flags & BGFX_TEXTURE_MSAA_SAMPLE)
&& 0 == (m_flags & BGFX_TEXTURE_RT_WRITE_ONLY)
;
if (needResolve)
{
VkImageCreateInfo ici_resolve = ici;
ici_resolve.samples = s_msaa[0].Sample;
ici_resolve.usage &= ~VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
ici_resolve.flags &= ~VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
ici_resolve.samples = s_msaa[0].Sample;
ici_resolve.mipLevels = m_numMips;
ici_resolve.usage &= ~VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
ici_resolve.flags &= ~VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
result = vkCreateImage(device, &ici_resolve, allocatorCb, &m_singleMsaaImage);
if (VK_SUCCESS != result)