DX12GraphicsApi.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. #include "DX12GraphicsApi.h"
  2. #include <d3d11.h>
  3. #include <d3d12.h>
  4. #include <dxgi1_6.h>
  5. #include <dxgidebug.h>
  6. #include "Camera3D.h"
  7. #include "d3dx12.h"
  8. #include "DLLRegister.h"
  9. #include "DX12BLASModel.h"
  10. #include "DX12CommandQueue.h"
  11. #include "DX12HitShader.h"
  12. #include "DX12MissShader.h"
  13. #include "DX12RayGenShader.h"
  14. #include "DX12Shader.h"
  15. #include "DX12Texture.h"
  16. #include "DX12TLAS.h"
  17. #include "Globals.h"
  18. #include "Image.h"
  19. #include "Model3D.h"
  20. #include "Model3DList.h"
  21. #include "Screen.h"
  22. #include "TextureList.h"
  23. #include "TextureModel.h"
  24. #include "Window.h"
  25. #include "World3D.h"
  26. using namespace Framework;
  27. DirectX12::DirectX12()
  28. : GraphicsApi(DIRECTX12),
  29. debug(0),
  30. infoQueue(0),
  31. directCommandQueue(0),
  32. swapChain(0),
  33. backBufferIndex(0),
  34. tearing(0),
  35. signature(0),
  36. uiTexture(0),
  37. texturRegister(new TextureList()),
  38. blasModels(0),
  39. worldTLAS(0),
  40. worldShaderBindingTables(0),
  41. lastTLASId(-1),
  42. lastModelId(-1),
  43. defaultRenderTarget(0),
  44. defaultKamera(0),
  45. cameraCount(0),
  46. rayGenSettingsBuffer(0),
  47. device(0),
  48. pfnD3D12SerializeRootSignature(0),
  49. pipeline(0),
  50. globalDescriptorHeap(0),
  51. defaultHitGroup(0),
  52. defaultRayGenerationShaderFunction(0)
  53. {
  54. for (int i = 0; i < 2; i++)
  55. backBuffer[i] = 0;
  56. }
  57. DirectX12::~DirectX12()
  58. {
  59. if (blasModels)
  60. {
  61. for (int i = 0; i <= lastModelId; i++)
  62. {
  63. if (blasModels[i]) blasModels[i]->release();
  64. }
  65. delete[] blasModels;
  66. }
  67. if (worldTLAS)
  68. {
  69. for (int i = 0; i <= lastTLASId; i++)
  70. {
  71. if (worldTLAS[i]) worldTLAS[i]->release();
  72. }
  73. delete[] worldTLAS;
  74. }
  75. if (worldShaderBindingTables)
  76. {
  77. for (int i = 0; i <= lastTLASId; i++)
  78. {
  79. if (worldShaderBindingTables[i])
  80. worldShaderBindingTables[i]->release();
  81. }
  82. delete[] worldShaderBindingTables;
  83. }
  84. if (globalDescriptorHeap)
  85. {
  86. globalDescriptorHeap->release();
  87. }
  88. if (pipeline)
  89. {
  90. pipeline->release();
  91. }
  92. if (directCommandQueue)
  93. {
  94. directCommandQueue->flush();
  95. directCommandQueue->release();
  96. }
  97. if (rayGenSettingsBuffer)
  98. {
  99. rayGenSettingsBuffer->release();
  100. }
  101. texturRegister->release();
  102. if (uiTexture) uiTexture->release();
  103. if (defaultKamera) defaultKamera->release();
  104. if (defaultRenderTarget) defaultRenderTarget->release();
  105. if (signature) signature->Release();
  106. for (int i = 0; i < 2; i++)
  107. {
  108. if (backBuffer[i]) backBuffer[i]->Release();
  109. }
  110. if (swapChain) swapChain->Release();
  111. if (infoQueue) infoQueue->Release();
  112. if (device)
  113. {
  114. device->Release();
  115. getDLLRegister()->releaseDLL("dxgi.dll");
  116. getDLLRegister()->releaseDLL("d3d12.dll");
  117. }
  118. if (debug) debug->Release();
  119. }
  120. void DirectX12::updateBottomLevelAccelerationStructure()
  121. {
  122. cs.lock();
  123. bool updateRequired = 0;
  124. for (const Model3DData* model : *modelList->zModels())
  125. {
  126. if (model->wasIndexBufferChanged() || model->wasVertexBufferChanged())
  127. {
  128. updateRequired = true;
  129. break;
  130. }
  131. }
  132. int bufferCount = 0;
  133. if (updateRequired)
  134. {
  135. for (const Model3DData* model : *modelList->zModels())
  136. {
  137. int id = model->getId();
  138. blasModels[id]->calculateBuffers();
  139. bufferCount += blasModels[id]->getBufferCount();
  140. }
  141. }
  142. cs.unlock();
  143. }
  144. void Framework::DirectX12::renderKamera(
  145. Cam3D* zKamera, DX12Texture* zTarget, bool guiVisible)
  146. {
  147. updateBottomLevelAccelerationStructure();
  148. if (guiVisible)
  149. {
  150. uiTexture->updateTextur();
  151. }
  152. if (!pipeline)
  153. {
  154. setPipeline(new DX12Pipeline());
  155. }
  156. directCommandQueue->zCommandList()->RSSetViewports(
  157. 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
  158. Mat4<float> identity = Mat4<float>::identity();
  159. World3D* w = zKamera->zWorld();
  160. if (w->getId() < 0)
  161. {
  162. w->setId(++lastTLASId);
  163. DX12TLAS** tmp = new DX12TLAS*[lastTLASId + 1];
  164. if (lastTLASId)
  165. {
  166. memcpy(tmp, worldTLAS, sizeof(DX12TLAS*) * lastTLASId);
  167. }
  168. tmp[lastTLASId] = new DX12TLAS(device, directCommandQueue);
  169. delete[] worldTLAS;
  170. worldTLAS = tmp;
  171. DX12ShaderBindingTable** tmpsbts
  172. = new DX12ShaderBindingTable*[lastTLASId + 1];
  173. if (lastTLASId)
  174. {
  175. memcpy(tmpsbts,
  176. worldShaderBindingTables,
  177. sizeof(DX12ShaderBindingTable*) * lastTLASId);
  178. }
  179. tmpsbts[lastTLASId] = pipeline->createShaderBindingTable();
  180. delete[] worldShaderBindingTables;
  181. worldShaderBindingTables = tmpsbts;
  182. }
  183. else if (worldShaderBindingTables[w->getId()]->zPipeline() != pipeline)
  184. {
  185. worldShaderBindingTables[w->getId()]->release();
  186. worldShaderBindingTables[w->getId()]
  187. = pipeline->createShaderBindingTable();
  188. }
  189. DX12TLAS* tlas = worldTLAS[w->getId()];
  190. DX12ShaderBindingTable* sbt = worldShaderBindingTables[w->getId()];
  191. tlas->startUpdate();
  192. sbt->startUpdate();
  193. int objectIndex = 0;
  194. int instanceIndex = 0;
  195. w->render([this, &tlas, &objectIndex, &instanceIndex, &identity, &sbt](
  196. Model3D* obj) {
  197. obj->calculateMatrices(identity, matrixBuffer);
  198. int modelId = obj->zModelData()->getId();
  199. DX12BLASModel* blasModel = blasModels[modelId];
  200. blasModel->calculateBuffers();
  201. ArrayIterator<int> boneIds = blasModel->zBoneIds()->begin();
  202. for (const DX12BLAS* blas : *blasModel->zBLAS())
  203. {
  204. D3D12_RAYTRACING_INSTANCE_DESC* desc = tlas->nextInstanceDesc();
  205. desc->InstanceID = objectIndex;
  206. desc->InstanceContributionToHitGroupIndex = objectIndex;
  207. desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
  208. desc->InstanceMask = 0xFF;
  209. desc->AccelerationStructure
  210. = blas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress();
  211. memcpy(desc->Transform,
  212. &matrixBuffer[boneIds.val()],
  213. sizeof(float) * 12);
  214. boneIds++;
  215. instanceIndex++;
  216. }
  217. fillShaderBindingTable(sbt, obj, objectIndex);
  218. objectIndex++;
  219. });
  220. tlas->endUpdate();
  221. settings.inverseProjection = zKamera->getInverseProjectionMatrix();
  222. settings.inverseView = zKamera->getInverseViewMatrix();
  223. settings.minDistance = zKamera->zViewPort()->front;
  224. settings.maxDistance = zKamera->zViewPort()->back;
  225. settings.useRays = 1;
  226. settings.renderGui = (int)guiVisible;
  227. rayGenSettingsBuffer->setData(&settings, 1);
  228. rayGenSettingsBuffer->copyToGPU(sizeof(settings));
  229. if (defaultRayGenerationShaderFunction)
  230. {
  231. globalDescriptorHeap->updateTextureInput(
  232. 0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, zTarget);
  233. globalDescriptorHeap->updateTLASInput(
  234. 3, DX12_SHADER_REGISTER_T_SHADER_RESOURCE, tlas);
  235. }
  236. sbt->setGlobalDescriptorHeap(dynamic_cast<DX12GlobalDescriptorHeap*>(
  237. globalDescriptorHeap->getThis()));
  238. sbt->endUpdate(device, directCommandQueue);
  239. ID3D12DescriptorHeap* heaps[] = {globalDescriptorHeap->zDescriptorHeap()};
  240. directCommandQueue->zCommandList()->SetDescriptorHeaps(1, heaps);
  241. D3D12_DISPATCH_RAYS_DESC desc;
  242. sbt->fillDispatchRaysDesc(&desc);
  243. desc.Width = zTarget->zImage()->getWidth();
  244. desc.Height = zTarget->zImage()->getHeight();
  245. desc.Depth = 1;
  246. directCommandQueue->zCommandList()->SetPipelineState1(
  247. pipeline->zPipelineState());
  248. directCommandQueue->zCommandList()->DispatchRays(&desc);
  249. }
  250. void Framework::DirectX12::initializePipeline()
  251. {
  252. if (pipeline->getShaders().getEntryCount() == 0)
  253. { // add default shaders
  254. DX12Shader* rayGenShader
  255. = new DX12Shader(DX12DefaultRayGenerationShaderBytes,
  256. sizeof(DX12DefaultRayGenerationShaderBytes));
  257. // RayGen from RayGen.hlsl
  258. DX12ShaderSignature* rayGenSignature = new DX12ShaderSignature();
  259. rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
  260. 0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
  261. rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
  262. 1, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
  263. rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
  264. 2, DX12_SHADER_REGISTER_B_CONST_BUFFER, 0);
  265. rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
  266. 3, DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
  267. defaultRayGenerationShaderFunction = new DX12ShaderFunction(
  268. "RayGen", rayGenSignature, DX12_SHADER_FUNCTION_TYPE_RAY_GEN);
  269. rayGenShader->addFunction(defaultRayGenerationShaderFunction);
  270. pipeline->addShader(rayGenShader);
  271. DX12Shader* missShader = new DX12Shader(
  272. DX12DefaultMissShaderBytes, sizeof(DX12DefaultMissShaderBytes));
  273. // Miss from Miss.hlsl
  274. missShader->addFunction(new DX12ShaderFunction(
  275. "Miss", new DX12ShaderSignature(), DX12_SHADER_FUNCTION_TYPE_MISS));
  276. pipeline->addShader(missShader);
  277. DX12Shader* hitShader = new DX12Shader(
  278. DX12DefaultHitShaderBytes, sizeof(DX12DefaultHitShaderBytes));
  279. // ClosestHit from Hit.hlsl
  280. DX12ShaderFunction* closestHitFunction
  281. = new DX12ShaderFunction("ClosestHit",
  282. new DX12ShaderSignature(),
  283. DX12_SHADER_FUNCTION_TYPE_CLOSEST_HIT);
  284. hitShader->addFunction(closestHitFunction);
  285. pipeline->addShader(hitShader);
  286. defaultHitGroup = new DX12ShaderHitGroup("HitGroup");
  287. defaultHitGroup->setAttributeSize(8);
  288. defaultHitGroup->setPayloadSize(16);
  289. defaultHitGroup->setClosestHitShaderFunction(closestHitFunction);
  290. pipeline->addHitGroup(defaultHitGroup);
  291. pipeline->setMaxRecursionDepth(10);
  292. }
  293. pipeline->createPipelineState(device, pfnD3D12SerializeRootSignature);
  294. }
  295. void Framework::DirectX12::initializeGlobalDescriptorHeap()
  296. {
  297. globalDescriptorHeap->addTextureInput(
  298. DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, defaultRenderTarget);
  299. globalDescriptorHeap->addTextureInput(
  300. DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, uiTexture);
  301. globalDescriptorHeap->addBufferInput(
  302. DX12_SHADER_REGISTER_B_CONST_BUFFER, rayGenSettingsBuffer);
  303. globalDescriptorHeap->addTLASInput(
  304. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
  305. globalDescriptorHeap->updateDescriptorHeap(device);
  306. }
  307. void Framework::DirectX12::fillShaderBindingTable(
  308. DX12ShaderBindingTable* zShaderBindingTable,
  309. Model3D* zModel,
  310. int instanceIndex)
  311. {
  312. if (defaultHitGroup)
  313. {
  314. zShaderBindingTable->addHitGroup(defaultHitGroup);
  315. }
  316. }
  317. typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
  318. typedef HRESULT(__stdcall* D3D12CreateDeviceFunction)(
  319. IDXGIAdapter*, D3D_FEATURE_LEVEL, REFIID, void**);
  320. typedef HRESULT(__stdcall* D3D12GetDebugInterfaceFunction)(REFIID, void**);
  321. typedef HRESULT(__stdcall* DXGIGetDebugInterface1Function)(
  322. UINT Flags, REFIID riid, _COM_Outptr_ void** pDebug);
  323. void DirectX12::initialize(
  324. NativeWindow* fenster, Vec2<int> backBufferSize, bool fullScreen)
  325. {
  326. GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
  327. #ifdef _DEBUG
  328. if (debugDX)
  329. {
  330. HINSTANCE pixDebugger = getDLLRegister()->loadDLL(
  331. "WinPixGpuCapturer.dll",
  332. "C:\\Program Files\\Microsoft PIX\\2603.25\\WinPixGpuCapturer.dll");
  333. }
  334. #endif
  335. HINSTANCE dxgiDLL = getDLLRegister()->loadDLL("dxgi.dll", "dxgi.dll");
  336. if (!dxgiDLL)
  337. {
  338. WMessageBox(fenster->getWindowHandle(),
  339. new Text("Fehler"),
  340. new Text("dxgi.dll konnte nicht gefunden werden."),
  341. MB_ICONERROR);
  342. return;
  343. }
  344. HINSTANCE d3d12DLL = getDLLRegister()->loadDLL("d3d12.dll", "d3d12.dll");
  345. if (!d3d12DLL)
  346. {
  347. getDLLRegister()->releaseDLL("dxgi.dll");
  348. WMessageBox(fenster->getWindowHandle(),
  349. new Text("Fehler"),
  350. new Text("DirectX 12 konnte nicht gefunden werden."),
  351. MB_ICONERROR);
  352. return;
  353. }
  354. pfnD3D12SerializeRootSignature
  355. = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(
  356. d3d12DLL, "D3D12SerializeRootSignature");
  357. if (!pfnD3D12SerializeRootSignature)
  358. {
  359. getDLLRegister()->releaseDLL("dxgi.dll");
  360. getDLLRegister()->releaseDLL("d3d12.dll");
  361. WMessageBox(fenster->getWindowHandle(),
  362. new Text("Fehler"),
  363. new Text(
  364. "Der Einstiegspunkt D3D12SerializeRootSignature fon d3d12.dll "
  365. "konnte nicht gefunden werden."),
  366. MB_ICONERROR);
  367. return;
  368. }
  369. // CreateDXGIFactory2
  370. CreateDXGIFactory2Function createFactory
  371. = (CreateDXGIFactory2Function)GetProcAddress(
  372. dxgiDLL, "CreateDXGIFactory2");
  373. if (!createFactory)
  374. {
  375. getDLLRegister()->releaseDLL("dxgi.dll");
  376. getDLLRegister()->releaseDLL("d3d12.dll");
  377. WMessageBox(fenster->getWindowHandle(),
  378. new Text("Fehler"),
  379. new Text(
  380. "Der Einstiegspunkt CreateDXGIFactory2 fon dxgi.dll konnte "
  381. "nicht gefunden werden."),
  382. MB_ICONERROR);
  383. return;
  384. }
  385. // D3D12CreateDevice
  386. D3D12CreateDeviceFunction createDevice
  387. = (D3D12CreateDeviceFunction)GetProcAddress(
  388. d3d12DLL, "D3D12CreateDevice");
  389. if (!createDevice)
  390. {
  391. getDLLRegister()->releaseDLL("dxgi.dll");
  392. getDLLRegister()->releaseDLL("d3d12.dll");
  393. WMessageBox(fenster->getWindowHandle(),
  394. new Text("Fehler"),
  395. new Text("Der Einstiegspunkt D3D12CreateDevice fon DirectX 12 "
  396. "konnte nicht gefunden werden."),
  397. MB_ICONERROR);
  398. return;
  399. }
  400. // D3D12SerializeVersionedRootSignature
  401. PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE d3d12svrsf
  402. = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress(
  403. d3d12DLL, "D3D12SerializeVersionedRootSignature");
  404. // D3D12SerializeRootSignature
  405. PFN_D3D12_SERIALIZE_ROOT_SIGNATURE d3d12srsf
  406. = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(
  407. d3d12DLL, "D3D12SerializeRootSignature");
  408. bool debugDXGI = 0;
  409. #ifdef _DEBUG
  410. IDXGIInfoQueue* dxgiInfoQueue;
  411. if (debugDX)
  412. {
  413. // D3D12GetDebugInterface
  414. D3D12GetDebugInterfaceFunction getDebugInterface
  415. = (D3D12GetDebugInterfaceFunction)GetProcAddress(
  416. d3d12DLL, "D3D12GetDebugInterface");
  417. if (SUCCEEDED(getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug)))
  418. debug->EnableDebugLayer();
  419. // DXGIGetDebugInterface1
  420. DXGIGetDebugInterface1Function dxgiDebugInterface
  421. = (DXGIGetDebugInterface1Function)GetProcAddress(
  422. dxgiDLL, "DXGIGetDebugInterface1");
  423. if (SUCCEEDED(dxgiDebugInterface(
  424. 0, __uuidof(IDXGIInfoQueue), (void**)&dxgiInfoQueue)))
  425. debugDXGI = 1;
  426. }
  427. #endif
  428. IDXGIFactory6* factory;
  429. UINT createFactoryFlags = 0;
  430. #if defined(_DEBUG)
  431. if (debugDX && debugDXGI) createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
  432. #endif
  433. HRESULT res = createFactory(
  434. createFactoryFlags, __uuidof(IDXGIFactory6), (void**)&factory);
  435. if (FAILED(res))
  436. {
  437. getDLLRegister()->releaseDLL("dxgi.dll");
  438. getDLLRegister()->releaseDLL("d3d12.dll");
  439. Logging::error() << "ERROR DXGI: createFactory returned " << res
  440. << "\n";
  441. WMessageBox(fenster->getWindowHandle(),
  442. new Text("Fehler"),
  443. new Text("createFactory ist Fehlgeschlagen."),
  444. MB_ICONERROR);
  445. return;
  446. }
  447. IDXGIAdapter1* adapter = 0;
  448. for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND
  449. != factory->EnumAdapterByGpuPreference(adapterID,
  450. DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
  451. __uuidof(IDXGIAdapter1),
  452. (void**)&adapter);
  453. ++adapterID)
  454. {
  455. DXGI_ADAPTER_DESC1 desc;
  456. adapter->GetDesc1(&desc);
  457. if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
  458. {
  459. adapter->Release();
  460. // Don't select the Basic Render Driver adapter.
  461. continue;
  462. }
  463. // Check to see if the adapter supports Direct3D 12, but don't create
  464. // the actual device yet.
  465. if (SUCCEEDED(createDevice(adapter,
  466. D3D_FEATURE_LEVEL_12_1,
  467. _uuidof(ID3D12Device),
  468. nullptr)))
  469. {
  470. char buff[256] = {};
  471. printf_s(buff,
  472. L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n",
  473. adapterID,
  474. desc.VendorId,
  475. desc.DeviceId,
  476. desc.Description);
  477. Logging::info() << buff;
  478. break;
  479. }
  480. adapter->Release();
  481. }
  482. if (!adapter)
  483. {
  484. if (FAILED(factory->EnumWarpAdapter(
  485. _uuidof(IDXGIAdapter1), (void**)&adapter)))
  486. Logging::error()
  487. << "ERROR: WARP12 not available. Enable the 'Graphics "
  488. "Tools' optional feature";
  489. }
  490. if (!adapter)
  491. {
  492. factory->Release();
  493. getDLLRegister()->releaseDLL("dxgi.dll");
  494. getDLLRegister()->releaseDLL("d3d12.dll");
  495. WMessageBox(fenster->getWindowHandle(),
  496. new Text("Fehler"),
  497. new Text("Es wurde keine passende Grafigkarte gefunden."),
  498. MB_ICONERROR);
  499. return;
  500. }
  501. res = createDevice(adapter,
  502. D3D_FEATURE_LEVEL_12_1,
  503. __uuidof(ID3D12Device5),
  504. (void**)&device);
  505. adapter->Release();
  506. if (FAILED(res))
  507. {
  508. factory->Release();
  509. getDLLRegister()->releaseDLL("dxgi.dll");
  510. getDLLRegister()->releaseDLL("d3d12.dll");
  511. Logging::error() << "ERROR: createDevice returned " << res << "\n";
  512. WMessageBox(fenster->getWindowHandle(),
  513. new Text("Fehler"),
  514. new Text("createDevice ist Fehlgeschlagen."),
  515. MB_ICONERROR);
  516. return;
  517. }
  518. D3D12_FEATURE_DATA_D3D12_OPTIONS5 featureSupportData = {};
  519. device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5,
  520. &featureSupportData,
  521. sizeof(featureSupportData));
  522. if (featureSupportData.RaytracingTier < D3D12_RAYTRACING_TIER_1_0)
  523. {
  524. device->Release();
  525. factory->Release();
  526. getDLLRegister()->releaseDLL("dxgi.dll");
  527. getDLLRegister()->releaseDLL("d3d12.dll");
  528. Logging::error() << "ERROR: Raytracing is not available\n";
  529. WMessageBox(fenster->getWindowHandle(),
  530. new Text("Fehler"),
  531. new Text("Raytracing ist nicht verfügbar. DirectX12 kann nicht "
  532. "verwendet werden."),
  533. MB_ICONERROR);
  534. return;
  535. }
  536. res = device->QueryInterface(__uuidof(ID3D12InfoQueue), (void**)&infoQueue);
  537. if (SUCCEEDED(res))
  538. {
  539. if (debugDX)
  540. {
  541. infoQueue->SetBreakOnSeverity(
  542. D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
  543. infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
  544. infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, TRUE);
  545. }
  546. // Suppress individual messages by their ID
  547. D3D12_MESSAGE_ID DenyIds[] = {
  548. // D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE, //
  549. // I'm really not sure how to avoid this message.
  550. D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE, // This warning occurs when
  551. // using capture frame while
  552. // graphics debugging.
  553. D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE, // This warning occurs
  554. // when using capture
  555. // frame while graphics
  556. // debugging.
  557. };
  558. D3D12_INFO_QUEUE_FILTER NewFilter = {};
  559. NewFilter.DenyList.NumSeverities = 0; //_countof( Severities );
  560. NewFilter.DenyList.pSeverityList = 0; // Severities;
  561. NewFilter.DenyList.NumIDs = _countof(DenyIds);
  562. NewFilter.DenyList.pIDList = DenyIds;
  563. infoQueue->PushStorageFilter(&NewFilter);
  564. }
  565. directCommandQueue = new DX12DirectCommandQueue(device);
  566. settings.minDistance = 0.0f;
  567. settings.maxDistance = 100000.f;
  568. settings.renderGui = 0;
  569. settings.useRays = 0;
  570. rayGenSettingsBuffer = new DX12Buffer(1,
  571. device,
  572. dynamic_cast<DX12CommandQueue*>(directCommandQueue->getThis()),
  573. D3D12_RESOURCE_FLAG_NONE);
  574. rayGenSettingsBuffer->setLength(
  575. ROUND_UP_POWER_OF_2(sizeof(RayGenerationSettings), 256));
  576. rayGenSettingsBuffer->setData(&settings, 1);
  577. rayGenSettingsBuffer->copyToGPU(sizeof(RayGenerationSettings));
  578. IDXGIFactory5* fac5 = 0;
  579. factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
  580. if (fac5)
  581. {
  582. res = fac5->CheckFeatureSupport(
  583. DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, sizeof(tearing));
  584. if (FAILED(res)) tearing = 0;
  585. fac5->Release();
  586. }
  587. DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
  588. swapChainDesc.Width = backBufferSize.x;
  589. swapChainDesc.Height = backBufferSize.y;
  590. swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
  591. swapChainDesc.Stereo = FALSE;
  592. swapChainDesc.SampleDesc = {1, 0};
  593. swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  594. swapChainDesc.BufferCount = 2;
  595. swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
  596. swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
  597. swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
  598. swapChainDesc.Flags = tearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
  599. IDXGISwapChain1* tmpSwapChain;
  600. res = factory->CreateSwapChainForHwnd(directCommandQueue->zQueue(),
  601. fenster->getWindowHandle(),
  602. &swapChainDesc,
  603. 0,
  604. 0,
  605. &tmpSwapChain);
  606. if (FAILED(res))
  607. {
  608. factory->Release();
  609. Logging::error() << "ERROR: CreateSwapChainForHwnd returned " << res
  610. << "\n";
  611. WMessageBox(fenster->getWindowHandle(),
  612. new Text("Fehler"),
  613. new Text("CreateSwapChainForHwnd ist Fehlgeschlagen."),
  614. MB_ICONERROR);
  615. return;
  616. }
  617. res = tmpSwapChain->QueryInterface(
  618. __uuidof(IDXGISwapChain4), (void**)&swapChain);
  619. tmpSwapChain->Release();
  620. if (FAILED(res))
  621. {
  622. factory->Release();
  623. Logging::error() << "ERROR: QueryInterface returned " << res << "\n";
  624. WMessageBox(fenster->getWindowHandle(),
  625. new Text("Fehler"),
  626. new Text("QueryInterface ist Fehlgeschlagen."),
  627. MB_ICONERROR);
  628. return;
  629. }
  630. factory->MakeWindowAssociation(
  631. fenster->getWindowHandle(), DXGI_MWA_NO_ALT_ENTER);
  632. for (int i = 0; i < 2; i++)
  633. {
  634. ID3D12Resource* backBuffer;
  635. res = swapChain->GetBuffer(
  636. i, __uuidof(ID3D12Resource), (void**)&backBuffer);
  637. if (FAILED(res))
  638. {
  639. factory->Release();
  640. Logging::error() << "ERROR: GetBuffer returned " << res << "\n";
  641. WMessageBox(fenster->getWindowHandle(),
  642. new Text("Fehler"),
  643. new Text("GetBuffer ist Fehlgeschlagen."),
  644. MB_ICONERROR);
  645. return;
  646. }
  647. this->backBuffer[i] = backBuffer;
  648. }
  649. Image* renderTargetImage = new Image();
  650. renderTargetImage->newImage(backBufferSize.x, backBufferSize.y, 0);
  651. defaultRenderTarget = dynamic_cast<DX12Texture*>(
  652. createOrGetTexture("_f_RenderTarget", renderTargetImage, GPU_TO_RAM));
  653. defaultRenderTarget->updateTextur();
  654. Image* renderB = new Image(1);
  655. renderB->setAlpha3D(1);
  656. renderB->newImage(this->backBufferSize.x, this->backBufferSize.y, 0);
  657. uiTexture = createOrGetTexture("_f_Render_Image", renderB, RAM_TO_GPU);
  658. D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
  659. featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
  660. if (FAILED(device->CheckFeatureSupport(
  661. D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof(featureData))))
  662. featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
  663. D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags
  664. = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
  665. | D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS
  666. | D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS
  667. | D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
  668. D3D12_DESCRIPTOR_RANGE1 range[2];
  669. range[0].NumDescriptors = 5;
  670. range[0].BaseShaderRegister = 0;
  671. range[0].RegisterSpace = 0;
  672. range[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
  673. range[0].OffsetInDescriptorsFromTableStart
  674. = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
  675. range[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
  676. range[1].NumDescriptors = 1;
  677. range[1].BaseShaderRegister = 0;
  678. range[1].RegisterSpace = 0;
  679. range[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
  680. range[1].OffsetInDescriptorsFromTableStart
  681. = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
  682. range[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
  683. D3D12_ROOT_PARAMETER1 rootParameters[1];
  684. rootParameters[0].ParameterType
  685. = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
  686. rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
  687. rootParameters[0].DescriptorTable.NumDescriptorRanges = 2;
  688. rootParameters[0].DescriptorTable.pDescriptorRanges = range;
  689. D3D12_STATIC_SAMPLER_DESC sampler = {};
  690. sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
  691. sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  692. sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  693. sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  694. sampler.MipLODBias = 0;
  695. sampler.MaxAnisotropy = 0;
  696. sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
  697. sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
  698. sampler.MinLOD = 0.0f;
  699. sampler.MaxLOD = D3D12_FLOAT32_MAX;
  700. sampler.ShaderRegister = 0;
  701. sampler.RegisterSpace = 0;
  702. sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
  703. D3D12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDescription;
  704. rootSignatureDescription.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
  705. rootSignatureDescription.Desc_1_1.NumParameters = 1;
  706. rootSignatureDescription.Desc_1_1.pParameters = rootParameters;
  707. rootSignatureDescription.Desc_1_1.NumStaticSamplers = 1;
  708. rootSignatureDescription.Desc_1_1.pStaticSamplers = &sampler;
  709. rootSignatureDescription.Desc_1_1.Flags = rootSignatureFlags;
  710. ID3DBlob* rootSignature;
  711. ID3DBlob* error;
  712. res = D3DX12SerializeVersionedRootSignature(&rootSignatureDescription,
  713. featureData.HighestVersion,
  714. &rootSignature,
  715. &error,
  716. d3d12svrsf,
  717. d3d12srsf);
  718. if (FAILED(res))
  719. {
  720. factory->Release();
  721. Logging::error()
  722. << "ERROR: D3DX12SerializeVersionedRootSignature returned " << res
  723. << "\n";
  724. WMessageBox(fenster->getWindowHandle(),
  725. new Text("Fehler"),
  726. new Text(
  727. "D3DX12SerializeVersionedRootSignature ist Fehlgeschlagen."),
  728. MB_ICONERROR);
  729. if (error) error->Release();
  730. return;
  731. }
  732. res = device->CreateRootSignature(0,
  733. rootSignature->GetBufferPointer(),
  734. rootSignature->GetBufferSize(),
  735. __uuidof(ID3D12RootSignature),
  736. (void**)&signature);
  737. if (FAILED(res))
  738. {
  739. factory->Release();
  740. Logging::error() << "ERROR: CreateRootSignature returned " << res
  741. << "\n";
  742. WMessageBox(fenster->getWindowHandle(),
  743. new Text("Fehler"),
  744. new Text("CreateRootSignature ist Fehlgeschlagen."),
  745. MB_ICONERROR);
  746. return;
  747. }
  748. rootSignature->Release();
  749. D3D12_RASTERIZER_DESC rdesc;
  750. rdesc.FillMode = D3D12_FILL_MODE_SOLID;
  751. rdesc.CullMode = D3D12_CULL_MODE_BACK;
  752. rdesc.FrontCounterClockwise = 0;
  753. rdesc.DepthBias = 0;
  754. rdesc.DepthBiasClamp = 0.f;
  755. rdesc.SlopeScaledDepthBias = 0.f;
  756. rdesc.DepthClipEnable = 1;
  757. rdesc.MultisampleEnable = 0;
  758. rdesc.AntialiasedLineEnable = 0;
  759. rdesc.ForcedSampleCount = 0;
  760. rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  761. uiTexture->updateTextur();
  762. directCommandQueue->execute();
  763. factory->Release();
  764. }
  765. void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
  766. {
  767. cs.lock();
  768. cameraCount = 0;
  769. D3D12_RESOURCE_BARRIER barrier;
  770. ZeroMemory(&barrier, sizeof(barrier));
  771. barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
  772. barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
  773. barrier.Transition.pResource = this->backBuffer[backBufferIndex];
  774. barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
  775. barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
  776. barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
  777. directCommandQueue->zCommandList()->ResourceBarrier(1, &barrier);
  778. if (fill2D) uiTexture->zImage()->setColor(fillColor);
  779. CD3DX12_RESOURCE_BARRIER transition
  780. = CD3DX12_RESOURCE_BARRIER::Transition(defaultRenderTarget->zResource(),
  781. D3D12_RESOURCE_STATE_COPY_SOURCE,
  782. D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
  783. directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
  784. }
  785. void DirectX12::renderKamera(Cam3D* zKamera)
  786. {
  787. cameraCount++;
  788. renderKamera(zKamera, defaultRenderTarget, true);
  789. }
  790. void Framework::DirectX12::renderKamera(Cam3D* zKamera, Texture* zTarget)
  791. {
  792. cameraCount++;
  793. renderKamera(zKamera, dynamic_cast<DX12Texture*>(zTarget), false);
  794. }
  795. void DirectX12::presentFrame()
  796. {
  797. if (cameraCount == 0)
  798. {
  799. if (!defaultKamera)
  800. {
  801. defaultKamera = new Cam3D();
  802. defaultKamera->setWorld(new World3D());
  803. defaultKamera->setScreenSize(backBufferSize);
  804. }
  805. renderKamera(defaultKamera);
  806. }
  807. CD3DX12_RESOURCE_BARRIER transition
  808. = CD3DX12_RESOURCE_BARRIER::Transition(defaultRenderTarget->zResource(),
  809. D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
  810. D3D12_RESOURCE_STATE_COPY_SOURCE);
  811. directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
  812. transition
  813. = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
  814. D3D12_RESOURCE_STATE_RENDER_TARGET,
  815. D3D12_RESOURCE_STATE_COPY_DEST);
  816. directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
  817. directCommandQueue->zCommandList()->CopyResource(
  818. backBuffer[backBufferIndex], defaultRenderTarget->zResource());
  819. transition
  820. = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
  821. D3D12_RESOURCE_STATE_COPY_DEST,
  822. D3D12_RESOURCE_STATE_RENDER_TARGET);
  823. directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
  824. // Indicate that the back buffer will now be used to present.
  825. transition
  826. = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
  827. D3D12_RESOURCE_STATE_RENDER_TARGET,
  828. D3D12_RESOURCE_STATE_PRESENT);
  829. directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
  830. directCommandQueue->execute();
  831. swapChain->Present(0, 0);
  832. backBufferIndex = swapChain->GetCurrentBackBufferIndex();
  833. cs.unlock();
  834. }
  835. Texture* DirectX12::createOrGetTexture(
  836. const char* name, Image* b, TextureDirection dir)
  837. {
  838. if (!device)
  839. {
  840. if (b) b->release();
  841. return 0;
  842. }
  843. if (texturRegister->hasTexture(name))
  844. {
  845. Texture* ret = texturRegister->getTexture(name);
  846. if (b) ret->setImageZ(b);
  847. return ret;
  848. }
  849. cs.lock();
  850. Texture* ret = new DX12Texture(device, directCommandQueue, dir);
  851. if (b) ret->setImageZ(b);
  852. texturRegister->addTexture(dynamic_cast<Texture*>(ret->getThis()), name);
  853. ret->updateTextur();
  854. // directCommandQueue->execute();
  855. cs.unlock();
  856. return ret;
  857. }
  858. Image* DirectX12::zUIRenderImage() const
  859. {
  860. return uiTexture ? uiTexture->zImage() : 0;
  861. }
  862. DXBuffer* DirectX12::createStructuredBuffer(int eSize)
  863. {
  864. return new DX12Buffer(eSize,
  865. device,
  866. dynamic_cast<DX12CommandQueue*>(directCommandQueue->getThis()),
  867. D3D12_RESOURCE_FLAG_NONE);
  868. }
  869. Model3DData* Framework::DirectX12::createModel(const char* name)
  870. {
  871. cs.lock();
  872. Model3DData* result = GraphicsApi::createModel(name);
  873. lastModelId = result->getId();
  874. if (result)
  875. {
  876. DX12BLASModel** newBlasModels = new DX12BLASModel*[lastModelId + 1];
  877. if (lastModelId > 0)
  878. {
  879. memcpy(newBlasModels,
  880. blasModels,
  881. sizeof(DX12BLASModel*) * lastModelId);
  882. }
  883. newBlasModels[lastModelId]
  884. = new DX12BLASModel(result, device, directCommandQueue);
  885. delete[] blasModels;
  886. blasModels = newBlasModels;
  887. }
  888. cs.unlock();
  889. return result;
  890. }
  891. void Framework::DirectX12::setPipeline(DX12Pipeline* pipeline)
  892. {
  893. if (this->pipeline)
  894. {
  895. this->pipeline->release();
  896. }
  897. this->pipeline = pipeline;
  898. if (pipeline)
  899. {
  900. initializePipeline();
  901. if (!globalDescriptorHeap
  902. || globalDescriptorHeap->zPipeline() != pipeline)
  903. {
  904. if (globalDescriptorHeap)
  905. {
  906. globalDescriptorHeap->release();
  907. }
  908. globalDescriptorHeap = pipeline->createGlobalDescriptorHeap();
  909. initializeGlobalDescriptorHeap();
  910. }
  911. }
  912. }
  913. bool DirectX12::isAvailable()
  914. {
  915. HINSTANCE dxgiDLL = getDLLRegister()->loadDLL("dxgi.dll", "dxgi.dll");
  916. if (!dxgiDLL) return 0;
  917. HINSTANCE d3d12DLL = getDLLRegister()->loadDLL("d3d12.dll", "d3d12.dll");
  918. if (!d3d12DLL)
  919. {
  920. getDLLRegister()->releaseDLL("dxgi.dll");
  921. return 0;
  922. }
  923. CreateDXGIFactory2Function createFactory
  924. = (CreateDXGIFactory2Function)GetProcAddress(
  925. dxgiDLL, "CreateDXGIFactory2");
  926. if (!createFactory)
  927. {
  928. getDLLRegister()->releaseDLL("dxgi.dll");
  929. getDLLRegister()->releaseDLL("d3d12.dll");
  930. return 0;
  931. }
  932. D3D12CreateDeviceFunction createDevice
  933. = (D3D12CreateDeviceFunction)GetProcAddress(
  934. d3d12DLL, "D3D12CreateDevice");
  935. if (!createDevice)
  936. {
  937. getDLLRegister()->releaseDLL("dxgi.dll");
  938. getDLLRegister()->releaseDLL("d3d12.dll");
  939. return 0;
  940. }
  941. #ifdef _DEBUG
  942. D3D12GetDebugInterfaceFunction getDebugInterface
  943. = (D3D12GetDebugInterfaceFunction)GetProcAddress(
  944. d3d12DLL, "D3D12GetDebugInterface");
  945. ID3D12Debug* debug = 0;
  946. getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug);
  947. debug->EnableDebugLayer();
  948. #endif
  949. IDXGIFactory4* factory;
  950. UINT createFactoryFlags = 0;
  951. #ifdef _DEBUG
  952. createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
  953. #endif
  954. HRESULT res = createFactory(
  955. createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
  956. if (FAILED(res))
  957. {
  958. getDLLRegister()->releaseDLL("dxgi.dll");
  959. getDLLRegister()->releaseDLL("d3d12.dll");
  960. return 0;
  961. }
  962. int index = 0;
  963. do
  964. {
  965. IDXGIAdapter1* current;
  966. res = factory->EnumAdapters1(index++, &current);
  967. if (res == S_OK)
  968. {
  969. DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
  970. current->GetDesc1(&dxgiAdapterDesc1);
  971. ID3D12Device5* device = 0;
  972. if ((dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0
  973. && SUCCEEDED(createDevice(current,
  974. D3D_FEATURE_LEVEL_12_1,
  975. __uuidof(ID3D12Device5),
  976. (void**)&device)))
  977. {
  978. device->Release();
  979. current->Release();
  980. factory->Release();
  981. #ifdef _DEBUG
  982. debug->Release();
  983. #endif
  984. getDLLRegister()->releaseDLL("dxgi.dll");
  985. getDLLRegister()->releaseDLL("d3d12.dll");
  986. return 1;
  987. }
  988. current->Release();
  989. }
  990. } while (res != DXGI_ERROR_NOT_FOUND);
  991. factory->Release();
  992. getDLLRegister()->releaseDLL("dxgi.dll");
  993. getDLLRegister()->releaseDLL("d3d12.dll");
  994. return 0;
  995. }
  996. bool Framework::DirectX12::renderGuiBefore3D() const
  997. {
  998. return true;
  999. }