Branimir Karadžić 8 years ago
parent
commit
dbb5c5c731
1 changed files with 43 additions and 7 deletions
  1. 43 7
      src/renderer_d3d12.cpp

+ 43 - 7
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<IDXGISwapChain**>(&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;