diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 45dec829e..346a18991 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -2318,6 +2318,30 @@ data.NumQualityLevels = 0; } } + D3D12_CPU_DESCRIPTOR_HANDLE getRtv(FrameBufferHandle _fbh, uint8_t _attachment) const + { + if (NULL != m_frameBuffers[_fbh.idx].m_swapChain) + { + _attachment = m_backBufferColorIdx; + } + + D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor = getCPUHandleHeapStart(m_rtvDescriptorHeap); + uint32_t rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + D3D12_CPU_DESCRIPTOR_HANDLE result = + { + rtvDescriptor.ptr + (BX_COUNTOF(m_backBufferColor) + _fbh.idx * BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS + _attachment) * rtvDescriptorSize + }; + return result; + } + + D3D12_CPU_DESCRIPTOR_HANDLE getDsv(FrameBufferHandle _fbh) const + { + D3D12_CPU_DESCRIPTOR_HANDLE dsvDescriptor = getCPUHandleHeapStart(m_dsvDescriptorHeap); + uint32_t dsvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); + D3D12_CPU_DESCRIPTOR_HANDLE result = { dsvDescriptor.ptr + (1 + _fbh.idx) * dsvDescriptorSize }; + return result; + } + void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true) { if (isValid(m_fbh) @@ -2359,10 +2383,8 @@ data.NumQualityLevels = 0; if (0 < frameBuffer.m_num) { - D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor = getCPUHandleHeapStart(m_rtvDescriptorHeap); - uint32_t rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); - m_rtvHandle.ptr = rtvDescriptor.ptr + (BX_COUNTOF(m_backBufferColor) + _fbh.idx * BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) * rtvDescriptorSize; - m_currentColor = &m_rtvHandle; + m_rtvHandle = getRtv(_fbh, 0); + m_currentColor = &m_rtvHandle; } else { @@ -2371,9 +2393,7 @@ data.NumQualityLevels = 0; if (isValid(frameBuffer.m_depth) ) { - D3D12_CPU_DESCRIPTOR_HANDLE dsvDescriptor = getCPUHandleHeapStart(m_dsvDescriptorHeap); - uint32_t dsvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); - m_dsvHandle.ptr = dsvDescriptor.ptr + (1 + _fbh.idx) * dsvDescriptorSize; + m_dsvHandle = getDsv(_fbh); m_currentDepthStencil = &m_dsvHandle; } else @@ -4918,6 +4938,22 @@ data.NumQualityLevels = 0; , reinterpret_cast(&m_swapChain) ); BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain."); + + ID3D12Device* device = s_renderD3D12->m_device; + FrameBufferHandle fbh = { uint16_t(this - s_renderD3D12->m_frameBuffers) }; + uint32_t rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + + for (uint32_t ii = 0, num = scd.BufferCount; ii < num; ++ii) + { + D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = s_renderD3D12->getRtv(fbh, ii); + + ID3D12Resource* colorBuffer; + DX_CHECK(m_swapChain->GetBuffer(ii + , IID_ID3D12Resource + , (void**)&colorBuffer + ) ); + device->CreateRenderTargetView(colorBuffer, NULL, rtvHandle); + } #endif // BX_PLATFORM_WINDOWS m_denseIdx = _denseIdx;