DX12GraphicsApi.cpp 36 KB

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