| 221 | } |
| 222 | |
| 223 | void EndFrame(ID3D12GraphicsCommandList* cmdList, D3D12_CPU_DESCRIPTOR_HANDLE rtv, uint32 displayWidth, uint32 displayHeight) |
| 224 | { |
| 225 | Assert_(CurrBeginFrame == DX12::CurrentCPUFrame); |
| 226 | Assert_(CurrEndFrame != DX12::CurrentCPUFrame); |
| 227 | |
| 228 | ImGui::Render(); |
| 229 | |
| 230 | PIXMarker pixMarker(cmdList, "ImGui Rendering"); |
| 231 | |
| 232 | ImDrawData* drawData = ImGui::GetDrawData(); |
| 233 | |
| 234 | // Get memory for vertex and index buffers |
| 235 | const uint64 vbSize = sizeof(ImDrawVert) * drawData->TotalVtxCount; |
| 236 | const uint64 ibSize = sizeof(ImDrawIdx) * drawData->TotalIdxCount; |
| 237 | MapResult vertexMem = DX12::AcquireTempBufferMem(vbSize, 4); |
| 238 | MapResult indexMem = DX12::AcquireTempBufferMem(ibSize, 4); |
| 239 | |
| 240 | // Copy and convert all vertices into a single contiguous buffer |
| 241 | ImDrawVert* vertexCPUMem = reinterpret_cast<ImDrawVert*>(vertexMem.CPUAddress); |
| 242 | ImDrawIdx* indexCPUMem = reinterpret_cast<ImDrawIdx*>(indexMem.CPUAddress); |
| 243 | for(uint64 i = 0; i < drawData->CmdListsCount; i++) |
| 244 | { |
| 245 | const ImDrawList* drawList = drawData->CmdLists[i]; |
| 246 | memcpy(vertexCPUMem, &drawList->VtxBuffer[0], drawList->VtxBuffer.size() * sizeof(ImDrawVert)); |
| 247 | memcpy(indexCPUMem, &drawList->IdxBuffer[0], drawList->IdxBuffer.size() * sizeof(ImDrawIdx)); |
| 248 | vertexCPUMem += drawList->VtxBuffer.size(); |
| 249 | indexCPUMem += drawList->IdxBuffer.size(); |
| 250 | } |
| 251 | |
| 252 | // Setup orthographic projection matrix into our constant buffer |
| 253 | { |
| 254 | const float L = 0.0f; |
| 255 | const float R = float(displayWidth); |
| 256 | const float B = float(displayHeight); |
| 257 | const float T = 0.0f; |
| 258 | |
| 259 | CBuffer.Data.ProjectionMatrix = Float4x4(Float4(2.0f/(R-L), 0.0f, 0.0f, 0.0f), |
| 260 | Float4(0.0f, 2.0f/(T-B), 0.0f, 0.0f), |
| 261 | Float4(0.0f, 0.0f, 0.5f, 0.0f), |
| 262 | Float4((R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f)); |
| 263 | |
| 264 | CBuffer.Upload(); |
| 265 | } |
| 266 | |
| 267 | // Setup viewport |
| 268 | DX12::SetViewport(cmdList, displayWidth, displayHeight); |
| 269 | |
| 270 | cmdList->OMSetRenderTargets(1, &rtv, false, nullptr); |
| 271 | |
| 272 | // Bind shader and vertex buffers |
| 273 | cmdList->SetPipelineState(PSO); |
| 274 | cmdList->SetGraphicsRootSignature(RootSignature); |
| 275 | cmdList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); |
| 276 | CBuffer.SetAsGfxRootParameter(cmdList, 1); |
| 277 | |
| 278 | D3D12_VERTEX_BUFFER_VIEW vbView = { }; |
| 279 | vbView.BufferLocation = vertexMem.GPUAddress; |
| 280 | vbView.SizeInBytes = uint32(vbSize); |
no test coverage detected