mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-06-08 03:13:52 +00:00
Fix MSAA + mipmaps combination on D3D11/D3D12/Vulkan/Metal. (#3717)
This commit is contained in:
committed by
GitHub
parent
526b886105
commit
7d03e160fa
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user