| 1011 | } |
| 1012 | |
| 1013 | void GPUDeviceDX12::Dispose() |
| 1014 | { |
| 1015 | GPUDeviceLock lock(this); |
| 1016 | if (_state == DeviceState::Disposed) |
| 1017 | return; |
| 1018 | |
| 1019 | // Set current state |
| 1020 | _state = DeviceState::Disposing; |
| 1021 | |
| 1022 | // Wait for rendering end |
| 1023 | WaitForGPU(); |
| 1024 | |
| 1025 | // Pre dispose |
| 1026 | preDispose(); |
| 1027 | |
| 1028 | // Release all late dispose resources (if state is Disposing all are released) |
| 1029 | updateRes2Dispose(); |
| 1030 | |
| 1031 | // Clear pipeline objects |
| 1032 | SAFE_DELETE_GPU_RESOURCE(DummyVB); |
| 1033 | for (auto& srv : _nullSrv) |
| 1034 | srv.Release(); |
| 1035 | _nullUav.Release(); |
| 1036 | for (auto* heap : QueryHeaps) |
| 1037 | { |
| 1038 | heap->Destroy(); |
| 1039 | Delete(heap); |
| 1040 | } |
| 1041 | QueryHeaps.Clear(); |
| 1042 | DX_SAFE_RELEASE_CHECK(_rootSignature, 0); |
| 1043 | Heap_CBV_SRV_UAV.ReleaseGPU(); |
| 1044 | Heap_RTV.ReleaseGPU(); |
| 1045 | Heap_DSV.ReleaseGPU(); |
| 1046 | Heap_Sampler.ReleaseGPU(); |
| 1047 | RingHeap_CBV_SRV_UAV.ReleaseGPU(); |
| 1048 | RingHeap_Sampler.ReleaseGPU(); |
| 1049 | UploadBuffer.ReleaseGPU(); |
| 1050 | SAFE_DELETE(DrawIndirectCommandSignature); |
| 1051 | SAFE_DELETE(_mainContext); |
| 1052 | SAFE_DELETE(_commandQueue); |
| 1053 | |
| 1054 | // Clear DirectX stuff |
| 1055 | SAFE_DELETE(_adapter); |
| 1056 | SAFE_RELEASE(_device); |
| 1057 | SAFE_RELEASE(_factoryDXGI); |
| 1058 | |
| 1059 | // Base |
| 1060 | GPUDeviceDX::Dispose(); |
| 1061 | |
| 1062 | // Set current state |
| 1063 | _state = DeviceState::Disposed; |
| 1064 | } |
| 1065 | |
| 1066 | void GPUDeviceDX12::WaitForGPU() |
| 1067 | { |