D3D12: Backbuffer MSAA.

This commit is contained in:
Branimir Karadžić
2018-05-02 15:54:14 -07:00
parent 86268a7a7e
commit f14ba5ba1a
2 changed files with 65 additions and 71 deletions

View File

@@ -3746,7 +3746,6 @@ namespace bgfx { namespace d3d11
ID3D11Texture2D* eyeTexture;
ovr_GetTextureSwapChainBufferDX(m_session, m_textureSwapChain, index, IID_PPV_ARGS(&eyeTexture));
// resolve MSAA
if (NULL != m_msaaRtv)
{
deviceCtx->ResolveSubresource(eyeTexture, 0, m_msaaTexture, 0, DXGI_FORMAT_R8G8B8A8_UNORM);

View File

@@ -1899,52 +1899,45 @@ namespace bgfx { namespace d3d12
uint32_t rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
if (NULL == m_msaaRt)
for (uint32_t ii = 0, num = m_scd.bufferCount; ii < num; ++ii)
{
for (uint32_t ii = 0, num = m_scd.bufferCount; ii < num; ++ii)
D3D12_CPU_DESCRIPTOR_HANDLE handle = getCPUHandleHeapStart(m_rtvDescriptorHeap);
handle.ptr += ii * rtvDescriptorSize;
DX_CHECK(m_swapChain->GetBuffer(ii
, IID_ID3D12Resource
, (void**)&m_backBufferColor[ii]
) );
m_device->CreateRenderTargetView(
NULL == m_msaaRt
? m_backBufferColor[ii]
: m_msaaRt
, NULL
, handle
);
if (BX_ENABLED(BX_PLATFORM_XBOXONE) )
{
D3D12_CPU_DESCRIPTOR_HANDLE handle = getCPUHandleHeapStart(m_rtvDescriptorHeap);
handle.ptr += ii * rtvDescriptorSize;
DX_CHECK(m_swapChain->GetBuffer(ii
, IID_ID3D12Resource
, (void**)&m_backBufferColor[ii]
) );
m_device->CreateRenderTargetView(m_backBufferColor[ii], NULL, handle);
ID3D12Resource* resource = m_backBufferColor[ii];
if (BX_ENABLED(BX_PLATFORM_XBOXONE) )
{
ID3D12Resource* resource = m_backBufferColor[ii];
BX_CHECK(DXGI_FORMAT_R8G8B8A8_UNORM == m_scd.format, "");
const uint32_t size = m_scd.width*m_scd.height*4;
BX_CHECK(DXGI_FORMAT_R8G8B8A8_UNORM == m_scd.format, "");
const uint32_t size = m_scd.width*m_scd.height*4;
void* ptr;
DX_CHECK(resource->Map(0, NULL, &ptr) );
bx::memSet(ptr, 0, size);
resource->Unmap(0, NULL);
}
}
}
else
{
for (uint32_t ii = 0, num = m_scd.bufferCount; ii < num; ++ii)
{
D3D12_CPU_DESCRIPTOR_HANDLE handle = getCPUHandleHeapStart(m_rtvDescriptorHeap);
handle.ptr += ii * rtvDescriptorSize;
m_device->CreateRenderTargetView(m_msaaRt, NULL, handle);
void* ptr;
DX_CHECK(resource->Map(0, NULL, &ptr) );
bx::memSet(ptr, 0, size);
resource->Unmap(0, NULL);
}
}
D3D12_RESOURCE_DESC resourceDesc;
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
resourceDesc.Alignment = 0;
resourceDesc.Alignment = 1 < m_scd.sampleDesc.Count ? D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : 0;
resourceDesc.Width = bx::uint32_max(m_resolution.width, 1);
resourceDesc.Height = bx::uint32_max(m_resolution.height, 1);
resourceDesc.DepthOrArraySize = 1;
resourceDesc.MipLevels = 1;
resourceDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
resourceDesc.SampleDesc.Count = 1;
resourceDesc.SampleDesc.Quality = 0;
resourceDesc.DepthOrArraySize = 1;
resourceDesc.MipLevels = 1;
resourceDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
resourceDesc.SampleDesc = m_scd.sampleDesc;
resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
@@ -1954,20 +1947,7 @@ namespace bgfx { namespace d3d12
clearValue.DepthStencil.Stencil = 0;
m_backBufferDepthStencil = createCommittedResource(m_device, HeapProperty::Default, &resourceDesc, &clearValue);
D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc;
bx::memSet(&dsvDesc, 0, sizeof(dsvDesc) );
dsvDesc.Format = resourceDesc.Format;
dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
dsvDesc.Flags = D3D12_DSV_FLAGS(0)
// | D3D12_DSV_FLAG_READ_ONLY_DEPTH
// | D3D12_DSV_FLAG_READ_ONLY_DEPTH
;
m_device->CreateDepthStencilView(m_backBufferDepthStencil
, &dsvDesc
, getCPUHandleHeapStart(m_dsvDescriptorHeap)
);
m_device->CreateDepthStencilView(m_backBufferDepthStencil, NULL, getCPUHandleHeapStart(m_dsvDescriptorHeap));
m_commandList = m_cmd.alloc();
@@ -1981,7 +1961,7 @@ namespace bgfx { namespace d3d12
setResourceBarrier(m_commandList
, m_msaaRt
, D3D12_RESOURCE_STATE_COMMON
, D3D12_RESOURCE_STATE_RENDER_TARGET
, D3D12_RESOURCE_STATE_RESOLVE_SOURCE
);
}
@@ -2013,7 +1993,7 @@ namespace bgfx { namespace d3d12
&& 0 < data.NumQualityLevels)
{
s_msaa[ii].Count = data.SampleCount;
s_msaa[ii].Quality = DXGI_STANDARD_MULTISAMPLE_QUALITY_PATTERN;
s_msaa[ii].Quality = data.NumQualityLevels-1;
last = ii;
}
else
@@ -2127,12 +2107,11 @@ namespace bgfx { namespace d3d12
BGFX_FATAL(SUCCEEDED(hr), bgfx::Fatal::UnableToInitialize, "Failed to create swap chain.");
}
if (BX_ENABLED(false)
&& 1 < m_scd.sampleDesc.Count)
if (1 < m_scd.sampleDesc.Count)
{
D3D12_RESOURCE_DESC resourceDesc;
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
resourceDesc.Alignment = 0;
resourceDesc.Alignment = D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT;
resourceDesc.Width = m_scd.width;
resourceDesc.Height = m_scd.height;
resourceDesc.MipLevels = 1;
@@ -2150,6 +2129,7 @@ namespace bgfx { namespace d3d12
clearValue.Color[3] = 0.0f;
m_msaaRt = createCommittedResource(m_device, HeapProperty::Texture, &resourceDesc, &clearValue, true);
setDebugObjectName(m_msaaRt, "MSAA Backbuffer");
}
postReset();
@@ -2756,7 +2736,7 @@ namespace bgfx { namespace d3d12
desc.StreamOutput.RasterizedStream = 0;
setBlendState(desc.BlendState, _state);
desc.SampleMask = 1;
desc.SampleMask = UINT32_MAX;
setRasterizerState(desc.RasterizerState, _state);
setDepthStencilState(desc.DepthStencilState, _state, _stencil);
@@ -2802,8 +2782,7 @@ namespace bgfx { namespace d3d12
desc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
}
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.SampleDesc = m_scd.sampleDesc;
uint32_t length = g_callback->cacheReadSize(hash);
bool cached = length > 0;
@@ -4551,7 +4530,7 @@ namespace bgfx { namespace d3d12
ID3D12GraphicsCommandList* commandList = s_renderD3D12->m_commandList;
D3D12_RESOURCE_DESC resourceDesc;
resourceDesc.Alignment = 0;
resourceDesc.Alignment = 1 < msaa.Count ? D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : 0;
resourceDesc.Width = textureWidth;
resourceDesc.Height = textureHeight;
resourceDesc.MipLevels = numMips;
@@ -5571,12 +5550,6 @@ namespace bgfx { namespace d3d12
StateCacheLru<Bind, 64> bindLru;
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_PRESENT
, D3D12_RESOURCE_STATE_RENDER_TARGET
);
if (NULL != m_msaaRt)
{
setResourceBarrier(m_commandList
@@ -5584,6 +5557,20 @@ namespace bgfx { namespace d3d12
, D3D12_RESOURCE_STATE_RESOLVE_SOURCE
, D3D12_RESOURCE_STATE_RENDER_TARGET
);
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_PRESENT
, D3D12_RESOURCE_STATE_RESOLVE_DEST
);
}
else
{
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_PRESENT
, D3D12_RESOURCE_STATE_RENDER_TARGET
);
}
if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
@@ -6518,13 +6505,21 @@ namespace bgfx { namespace d3d12
);
m_commandList->ResolveSubresource(m_backBufferColor[m_backBufferColorIdx], 0, m_msaaRt, 0, m_scd.format);
}
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_RENDER_TARGET
, D3D12_RESOURCE_STATE_PRESENT
);
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_RESOLVE_DEST
, D3D12_RESOURCE_STATE_PRESENT
);
}
else
{
setResourceBarrier(m_commandList
, m_backBufferColor[m_backBufferColorIdx]
, D3D12_RESOURCE_STATE_RENDER_TARGET
, D3D12_RESOURCE_STATE_PRESENT
);
}
#if BX_PLATFORM_WINDOWS
for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)