DX12GraphicsApi.cpp 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123
  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 "DX12PixelShader.h"
  12. #include "DX12Shader.h"
  13. #include "DX12Texture.h"
  14. #include "DX12VertexShader.h"
  15. #include "Globals.h"
  16. #include "Image.h"
  17. #include "Model3D.h"
  18. #include "Model3DList.h"
  19. #include "Screen.h"
  20. #include "Shader.h"
  21. #include "TextureList.h"
  22. #include "TextureModel.h"
  23. #include "Window.h"
  24. #include "World3D.h"
  25. using namespace Framework;
  26. DirectX12::DirectX12()
  27. : GraphicsApi(DIRECTX12),
  28. debug(0),
  29. device(0),
  30. infoQueue(0),
  31. directCommandQueue(0),
  32. copyCommandQueue(0),
  33. computeCommandQueue(0),
  34. swapChain(0),
  35. rtvHeap(0),
  36. dsvHeap(0),
  37. shaderBufferHeap(0),
  38. depthBuffer(0),
  39. backBufferIndex(0),
  40. tearing(0),
  41. viewPort(0),
  42. allowedRenderArea(0),
  43. vertexBufferView(0),
  44. indexBufferView(0),
  45. signature(0),
  46. pipeline(0),
  47. texturModel(0),
  48. uiTexture(0),
  49. texturRegister(new TextureList()),
  50. vertexShader(0),
  51. pixelShader(0),
  52. blasModels(0),
  53. blasScratchBuffer(0),
  54. blasResultBuffer(0),
  55. lastModelId(-1)
  56. {
  57. for (int i = 0; i < 2; i++)
  58. backBuffer[i] = 0;
  59. }
  60. DirectX12::~DirectX12()
  61. {
  62. if (blasModels)
  63. {
  64. for (int i = 0; i <= lastModelId; i++)
  65. {
  66. if (blasModels[i]) blasModels[i]->release();
  67. }
  68. delete[] blasModels;
  69. }
  70. if (blasScratchBuffer)
  71. {
  72. blasScratchBuffer->release();
  73. }
  74. if (blasResultBuffer)
  75. {
  76. blasResultBuffer->release();
  77. }
  78. if (directCommandQueue)
  79. {
  80. directCommandQueue->flush();
  81. directCommandQueue->release();
  82. }
  83. if (copyCommandQueue)
  84. {
  85. copyCommandQueue->flush();
  86. copyCommandQueue->release();
  87. }
  88. if (computeCommandQueue)
  89. {
  90. computeCommandQueue->flush();
  91. computeCommandQueue->release();
  92. }
  93. if (depthBuffer) depthBuffer->Release();
  94. if (dsvHeap) dsvHeap->Release();
  95. if (shaderBufferHeap) shaderBufferHeap->Release();
  96. if (vertexShader) vertexShader->release();
  97. if (pixelShader) pixelShader->release();
  98. texturRegister->release();
  99. if (uiTexture) uiTexture->release();
  100. if (texturModel) texturModel->release();
  101. if (pipeline) pipeline->Release();
  102. if (signature) signature->Release();
  103. delete indexBufferView;
  104. delete vertexBufferView;
  105. delete allowedRenderArea;
  106. delete viewPort;
  107. for (int i = 0; i < 2; i++)
  108. {
  109. if (backBuffer[i]) backBuffer[i]->Release();
  110. }
  111. if (rtvHeap) rtvHeap->Release();
  112. if (swapChain) swapChain->Release();
  113. if (infoQueue) infoQueue->Release();
  114. if (device)
  115. {
  116. device->Release();
  117. getDLLRegister()->releaseDLL("dxgi.dll");
  118. getDLLRegister()->releaseDLL("d3d12.dll");
  119. }
  120. if (debug) debug->Release();
  121. }
  122. void DirectX12::updateBottomLevelAccelerationStructure()
  123. {
  124. bool updateRequired = 0;
  125. for (const Model3DData* model : *modelList->zModels())
  126. {
  127. if (model->wasIndexBufferChanged() || model->wasVertexBufferChanged())
  128. {
  129. updateRequired = true;
  130. break;
  131. }
  132. }
  133. int bufferCount = 0;
  134. if (updateRequired)
  135. {
  136. for (const Model3DData* model : *modelList->zModels())
  137. {
  138. int id = model->getId();
  139. blasModels[id]->calculateBuffers();
  140. bufferCount += blasModels[id]->getBufferCount();
  141. }
  142. D3D12_RAYTRACING_GEOMETRY_DESC* geometryDescs
  143. = new D3D12_RAYTRACING_GEOMETRY_DESC[bufferCount];
  144. memset(geometryDescs,
  145. 0,
  146. sizeof(D3D12_RAYTRACING_GEOMETRY_DESC) * bufferCount);
  147. int bufferIndex = 0;
  148. for (const Model3DData* model : *modelList->zModels())
  149. {
  150. int id = model->getId();
  151. for (int i = 0; i < blasModels[id]->getBufferCount()
  152. && bufferIndex < bufferCount;
  153. i++)
  154. {
  155. DX12Buffer* vertexBuffer
  156. = blasModels[id]->zVertexBuffers()->z(i);
  157. DX12Buffer* indexBuffer = blasModels[id]->zIndexBuffers()->z(i);
  158. geometryDescs[bufferIndex].Type
  159. = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
  160. geometryDescs[bufferIndex].Flags
  161. = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
  162. geometryDescs[bufferIndex].Triangles.VertexBuffer.StartAddress
  163. = vertexBuffer->zBuffer()->GetGPUVirtualAddress();
  164. geometryDescs[bufferIndex].Triangles.VertexBuffer.StrideInBytes
  165. = vertexBuffer->getElementLength();
  166. geometryDescs[bufferIndex].Triangles.VertexCount
  167. = (unsigned)vertexBuffer->getElementCount();
  168. geometryDescs[bufferIndex].Triangles.VertexFormat
  169. = DXGI_FORMAT_R32G32B32_FLOAT;
  170. geometryDescs[bufferIndex].Triangles.IndexBuffer
  171. = indexBuffer->zBuffer()->GetGPUVirtualAddress();
  172. geometryDescs[bufferIndex].Triangles.IndexCount
  173. = (unsigned)indexBuffer->getElementCount();
  174. geometryDescs[bufferIndex].Triangles.IndexFormat
  175. = DXGI_FORMAT_R32_UINT;
  176. bufferIndex++;
  177. }
  178. }
  179. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
  180. prebuildDesc.Type
  181. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  182. prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  183. prebuildDesc.NumDescs = bufferCount;
  184. prebuildDesc.pGeometryDescs = geometryDescs;
  185. prebuildDesc.Flags
  186. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  187. D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
  188. device->GetRaytracingAccelerationStructurePrebuildInfo(
  189. &prebuildDesc, &info);
  190. blasScratchBuffer->setLength((int)info.ScratchDataSizeInBytes);
  191. blasScratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
  192. blasResultBuffer->setLength((int)info.ResultDataMaxSizeInBytes);
  193. blasResultBuffer->createBufferWithoutData(
  194. D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
  195. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
  196. buildDesc.Inputs.Type
  197. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  198. buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  199. buildDesc.Inputs.NumDescs = bufferCount;
  200. buildDesc.Inputs.pGeometryDescs = geometryDescs;
  201. buildDesc.DestAccelerationStructureData
  202. = {blasResultBuffer->zBuffer()->GetGPUVirtualAddress()};
  203. buildDesc.ScratchAccelerationStructureData
  204. = {blasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
  205. buildDesc.SourceAccelerationStructureData = 0;
  206. buildDesc.Inputs.Flags
  207. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  208. // Build the AS
  209. directCommandQueue->getCommandList()
  210. ->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
  211. directCommandQueue
  212. ->execute(); // TODO: check if this is realy necessary
  213. // here, because maybe the command list is
  214. // executed in the render function anyway
  215. delete[] geometryDescs;
  216. }
  217. }
  218. typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
  219. typedef HRESULT(__stdcall* D3D12CreateDeviceFunction)(
  220. IDXGIAdapter*, D3D_FEATURE_LEVEL, REFIID, void**);
  221. typedef HRESULT(__stdcall* D3D12GetDebugInterfaceFunction)(REFIID, void**);
  222. typedef HRESULT(__stdcall* DXGIGetDebugInterface1Function)(
  223. UINT Flags, REFIID riid, _COM_Outptr_ void** pDebug);
  224. void DirectX12::initialize(
  225. NativeWindow* fenster, Vec2<int> backBufferSize, bool fullScreen)
  226. {
  227. GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
  228. HINSTANCE dxgiDLL = getDLLRegister()->loadDLL("dxgi.dll", "dxgi.dll");
  229. if (!dxgiDLL)
  230. {
  231. WMessageBox(fenster->getWindowHandle(),
  232. new Text("Fehler"),
  233. new Text("dxgi.dll konnte nicht gefunden werden."),
  234. MB_ICONERROR);
  235. return;
  236. }
  237. HINSTANCE d3d12DLL = getDLLRegister()->loadDLL("d3d12.dll", "d3d12.dll");
  238. if (!d3d12DLL)
  239. {
  240. getDLLRegister()->releaseDLL("dxgi.dll");
  241. WMessageBox(fenster->getWindowHandle(),
  242. new Text("Fehler"),
  243. new Text("DirectX 12 konnte nicht gefunden werden."),
  244. MB_ICONERROR);
  245. return;
  246. }
  247. // CreateDXGIFactory2
  248. CreateDXGIFactory2Function createFactory
  249. = (CreateDXGIFactory2Function)GetProcAddress(
  250. dxgiDLL, "CreateDXGIFactory2");
  251. if (!createFactory)
  252. {
  253. getDLLRegister()->releaseDLL("dxgi.dll");
  254. getDLLRegister()->releaseDLL("d3d12.dll");
  255. WMessageBox(fenster->getWindowHandle(),
  256. new Text("Fehler"),
  257. new Text(
  258. "Der Einstiegspunkt CreateDXGIFactory2 fon dxgi.dll konnte "
  259. "nicht gefunden werden."),
  260. MB_ICONERROR);
  261. return;
  262. }
  263. // D3D12CreateDevice
  264. D3D12CreateDeviceFunction createDevice
  265. = (D3D12CreateDeviceFunction)GetProcAddress(
  266. d3d12DLL, "D3D12CreateDevice");
  267. if (!createDevice)
  268. {
  269. getDLLRegister()->releaseDLL("dxgi.dll");
  270. getDLLRegister()->releaseDLL("d3d12.dll");
  271. WMessageBox(fenster->getWindowHandle(),
  272. new Text("Fehler"),
  273. new Text("Der Einstiegspunkt D3D12CreateDevice fon DirectX 12 "
  274. "konnte nicht gefunden werden."),
  275. MB_ICONERROR);
  276. return;
  277. }
  278. // D3D12SerializeVersionedRootSignature
  279. PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE d3d12svrsf
  280. = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress(
  281. d3d12DLL, "D3D12SerializeVersionedRootSignature");
  282. // D3D12SerializeRootSignature
  283. PFN_D3D12_SERIALIZE_ROOT_SIGNATURE d3d12srsf
  284. = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(
  285. d3d12DLL, "D3D12SerializeRootSignature");
  286. bool debugDXGI = 0;
  287. #ifdef _DEBUG
  288. IDXGIInfoQueue* dxgiInfoQueue;
  289. if (debugDX)
  290. {
  291. // D3D12GetDebugInterface
  292. D3D12GetDebugInterfaceFunction getDebugInterface
  293. = (D3D12GetDebugInterfaceFunction)GetProcAddress(
  294. d3d12DLL, "D3D12GetDebugInterface");
  295. if (SUCCEEDED(getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug)))
  296. debug->EnableDebugLayer();
  297. // DXGIGetDebugInterface1
  298. DXGIGetDebugInterface1Function dxgiDebugInterface
  299. = (DXGIGetDebugInterface1Function)GetProcAddress(
  300. dxgiDLL, "DXGIGetDebugInterface1");
  301. if (SUCCEEDED(dxgiDebugInterface(
  302. 0, __uuidof(IDXGIInfoQueue), (void**)&dxgiInfoQueue)))
  303. debugDXGI = 1;
  304. }
  305. #endif
  306. IDXGIFactory6* factory;
  307. UINT createFactoryFlags = 0;
  308. #if defined(_DEBUG)
  309. if (debugDX && debugDXGI) createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
  310. #endif
  311. HRESULT res = createFactory(
  312. createFactoryFlags, __uuidof(IDXGIFactory6), (void**)&factory);
  313. if (FAILED(res))
  314. {
  315. getDLLRegister()->releaseDLL("dxgi.dll");
  316. getDLLRegister()->releaseDLL("d3d12.dll");
  317. Logging::error() << "ERROR DXGI: createFactory returned " << res
  318. << "\n";
  319. WMessageBox(fenster->getWindowHandle(),
  320. new Text("Fehler"),
  321. new Text("createFactory ist Fehlgeschlagen."),
  322. MB_ICONERROR);
  323. return;
  324. }
  325. IDXGIAdapter1* adapter = 0;
  326. for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND
  327. != factory->EnumAdapterByGpuPreference(adapterID,
  328. DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
  329. __uuidof(IDXGIAdapter1),
  330. (void**)&adapter);
  331. ++adapterID)
  332. {
  333. DXGI_ADAPTER_DESC1 desc;
  334. adapter->GetDesc1(&desc);
  335. if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
  336. {
  337. adapter->Release();
  338. // Don't select the Basic Render Driver adapter.
  339. continue;
  340. }
  341. // Check to see if the adapter supports Direct3D 12, but don't create
  342. // the actual device yet.
  343. if (SUCCEEDED(createDevice(adapter,
  344. D3D_FEATURE_LEVEL_12_1,
  345. _uuidof(ID3D12Device),
  346. nullptr)))
  347. {
  348. char buff[256] = {};
  349. printf_s(buff,
  350. L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n",
  351. adapterID,
  352. desc.VendorId,
  353. desc.DeviceId,
  354. desc.Description);
  355. Logging::info() << buff;
  356. break;
  357. }
  358. adapter->Release();
  359. }
  360. if (!adapter)
  361. {
  362. if (FAILED(factory->EnumWarpAdapter(
  363. _uuidof(IDXGIAdapter1), (void**)&adapter)))
  364. Logging::error()
  365. << "ERROR: WARP12 not available. Enable the 'Graphics "
  366. "Tools' optional feature";
  367. }
  368. if (!adapter)
  369. {
  370. factory->Release();
  371. getDLLRegister()->releaseDLL("dxgi.dll");
  372. getDLLRegister()->releaseDLL("d3d12.dll");
  373. WMessageBox(fenster->getWindowHandle(),
  374. new Text("Fehler"),
  375. new Text("Es wurde keine passende Grafigkarte gefunden."),
  376. MB_ICONERROR);
  377. return;
  378. }
  379. res = createDevice(adapter,
  380. D3D_FEATURE_LEVEL_12_1,
  381. __uuidof(ID3D12Device5),
  382. (void**)&device);
  383. adapter->Release();
  384. if (FAILED(res))
  385. {
  386. factory->Release();
  387. getDLLRegister()->releaseDLL("dxgi.dll");
  388. getDLLRegister()->releaseDLL("d3d12.dll");
  389. Logging::error() << "ERROR: createDevice returned " << res << "\n";
  390. WMessageBox(fenster->getWindowHandle(),
  391. new Text("Fehler"),
  392. new Text("createDevice ist Fehlgeschlagen."),
  393. MB_ICONERROR);
  394. return;
  395. }
  396. D3D12_FEATURE_DATA_D3D12_OPTIONS5 featureSupportData = {};
  397. device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5,
  398. &featureSupportData,
  399. sizeof(featureSupportData));
  400. if (featureSupportData.RaytracingTier < D3D12_RAYTRACING_TIER_1_0)
  401. {
  402. device->Release();
  403. factory->Release();
  404. getDLLRegister()->releaseDLL("dxgi.dll");
  405. getDLLRegister()->releaseDLL("d3d12.dll");
  406. Logging::error() << "ERROR: Raytracing is not available\n";
  407. WMessageBox(fenster->getWindowHandle(),
  408. new Text("Fehler"),
  409. new Text("Raytracing ist nicht verfügbar. DirectX12 kann nicht "
  410. "verwendet werden."),
  411. MB_ICONERROR);
  412. return;
  413. }
  414. res = device->QueryInterface(__uuidof(ID3D12InfoQueue), (void**)&infoQueue);
  415. if (SUCCEEDED(res))
  416. {
  417. if (debugDX)
  418. {
  419. infoQueue->SetBreakOnSeverity(
  420. D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
  421. infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
  422. infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, TRUE);
  423. }
  424. // Suppress individual messages by their ID
  425. D3D12_MESSAGE_ID DenyIds[] = {
  426. // D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE, //
  427. // I'm really not sure how to avoid this message.
  428. D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE, // This warning occurs when
  429. // using capture frame while
  430. // graphics debugging.
  431. D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE, // This warning occurs
  432. // when using capture
  433. // frame while graphics
  434. // debugging.
  435. };
  436. D3D12_INFO_QUEUE_FILTER NewFilter = {};
  437. NewFilter.DenyList.NumSeverities = 0; //_countof( Severities );
  438. NewFilter.DenyList.pSeverityList = 0; // Severities;
  439. NewFilter.DenyList.NumIDs = _countof(DenyIds);
  440. NewFilter.DenyList.pIDList = DenyIds;
  441. infoQueue->PushStorageFilter(&NewFilter);
  442. }
  443. directCommandQueue = new DX12DirectCommandQueue(device);
  444. copyCommandQueue = new DX12CopyCommandQueue(device);
  445. computeCommandQueue = new DX12ComputeCommandQueue(device);
  446. blasScratchBuffer
  447. = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
  448. blasResultBuffer
  449. = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
  450. IDXGIFactory5* fac5 = 0;
  451. factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
  452. if (fac5)
  453. {
  454. res = fac5->CheckFeatureSupport(
  455. DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, sizeof(tearing));
  456. if (FAILED(res)) tearing = 0;
  457. fac5->Release();
  458. }
  459. DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
  460. swapChainDesc.Width = backBufferSize.x;
  461. swapChainDesc.Height = backBufferSize.y;
  462. swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  463. swapChainDesc.Stereo = FALSE;
  464. swapChainDesc.SampleDesc = {1, 0};
  465. swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  466. swapChainDesc.BufferCount = 2;
  467. swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
  468. swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
  469. swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
  470. swapChainDesc.Flags = tearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
  471. IDXGISwapChain1* tmpSwapChain;
  472. res = factory->CreateSwapChainForHwnd(directCommandQueue->getQueue(),
  473. fenster->getWindowHandle(),
  474. &swapChainDesc,
  475. 0,
  476. 0,
  477. &tmpSwapChain);
  478. if (FAILED(res))
  479. {
  480. factory->Release();
  481. Logging::error() << "ERROR: CreateSwapChainForHwnd returned " << res
  482. << "\n";
  483. WMessageBox(fenster->getWindowHandle(),
  484. new Text("Fehler"),
  485. new Text("CreateSwapChainForHwnd ist Fehlgeschlagen."),
  486. MB_ICONERROR);
  487. return;
  488. }
  489. res = tmpSwapChain->QueryInterface(
  490. __uuidof(IDXGISwapChain4), (void**)&swapChain);
  491. tmpSwapChain->Release();
  492. if (FAILED(res))
  493. {
  494. factory->Release();
  495. Logging::error() << "ERROR: QueryInterface returned " << res << "\n";
  496. WMessageBox(fenster->getWindowHandle(),
  497. new Text("Fehler"),
  498. new Text("QueryInterface ist Fehlgeschlagen."),
  499. MB_ICONERROR);
  500. return;
  501. }
  502. factory->MakeWindowAssociation(
  503. fenster->getWindowHandle(), DXGI_MWA_NO_ALT_ENTER);
  504. D3D12_DESCRIPTOR_HEAP_DESC rtvhdesc = {};
  505. rtvhdesc.NumDescriptors = 2; // back buffer count
  506. rtvhdesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
  507. rtvhdesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
  508. res = device->CreateDescriptorHeap(
  509. &rtvhdesc, __uuidof(ID3D12DescriptorHeap), (void**)&rtvHeap);
  510. if (FAILED(res))
  511. {
  512. factory->Release();
  513. Logging::error() << "ERROR: CreateDescriptorHeap returned " << res
  514. << "\n";
  515. WMessageBox(fenster->getWindowHandle(),
  516. new Text("Fehler"),
  517. new Text("CreateDescriptorHeap ist Fehlgeschlagen."),
  518. MB_ICONERROR);
  519. return;
  520. }
  521. auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(
  522. D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
  523. D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle(
  524. rtvHeap->GetCPUDescriptorHandleForHeapStart());
  525. for (int i = 0; i < 2; i++)
  526. {
  527. ID3D12Resource* backBuffer;
  528. res = swapChain->GetBuffer(
  529. i, __uuidof(ID3D12Resource), (void**)&backBuffer);
  530. if (FAILED(res))
  531. {
  532. factory->Release();
  533. Logging::error() << "ERROR: GetBuffer returned " << res << "\n";
  534. WMessageBox(fenster->getWindowHandle(),
  535. new Text("Fehler"),
  536. new Text("GetBuffer ist Fehlgeschlagen."),
  537. MB_ICONERROR);
  538. return;
  539. }
  540. device->CreateRenderTargetView(backBuffer, nullptr, rtvHandle);
  541. this->backBuffer[i] = backBuffer;
  542. rtvHandle.ptr += rtvDescriptorSize;
  543. }
  544. viewPort = new D3D12_VIEWPORT();
  545. viewPort->Width = (float)this->backBufferSize.x;
  546. viewPort->Height = (float)this->backBufferSize.y;
  547. viewPort->MinDepth = 0.0f;
  548. viewPort->MaxDepth = 1.0f;
  549. viewPort->TopLeftX = 0.0f;
  550. viewPort->TopLeftY = 0.0f;
  551. allowedRenderArea = new D3D12_RECT();
  552. allowedRenderArea->left = 0;
  553. allowedRenderArea->top = 0;
  554. allowedRenderArea->right = LONG_MAX;
  555. allowedRenderArea->bottom = LONG_MAX;
  556. texturModel = new TextureModel(this, "_framework_gui_");
  557. Image* renderB = new Image(1);
  558. renderB->setAlpha3D(1);
  559. renderB->newImage(this->backBufferSize.x, this->backBufferSize.y, 0);
  560. uiTexture = createOrGetTexture("_f_Render_Image", renderB);
  561. texturModel->setSize(Vec2<float>(2.f, 2.f));
  562. texturModel->setTexture(dynamic_cast<Texture*>(uiTexture->getThis()));
  563. vertexBufferView = new D3D12_VERTEX_BUFFER_VIEW();
  564. vertexBufferView->StrideInBytes = sizeof(Vertex3D);
  565. indexBufferView = new D3D12_INDEX_BUFFER_VIEW();
  566. indexBufferView->Format = DXGI_FORMAT_R32_UINT;
  567. D3D12_CLEAR_VALUE optimizedClearValue = {};
  568. optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
  569. optimizedClearValue.DepthStencil = {1.0f, 0};
  570. CD3DX12_HEAP_PROPERTIES heapProp
  571. = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
  572. CD3DX12_RESOURCE_DESC heapDesc
  573. = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT,
  574. this->backBufferSize.x,
  575. this->backBufferSize.y,
  576. 1,
  577. 0,
  578. 1,
  579. 0,
  580. D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL);
  581. res = device->CreateCommittedResource(&heapProp,
  582. D3D12_HEAP_FLAG_NONE,
  583. &heapDesc,
  584. D3D12_RESOURCE_STATE_DEPTH_WRITE,
  585. &optimizedClearValue,
  586. __uuidof(ID3D12Resource),
  587. (void**)&depthBuffer);
  588. if (FAILED(res))
  589. {
  590. factory->Release();
  591. Logging::error() << "ERROR: CreateCommittedResource returned " << res
  592. << "\n";
  593. WMessageBox(fenster->getWindowHandle(),
  594. new Text("Fehler"),
  595. new Text("CreateCommittedResource ist Fehlgeschlagen."),
  596. MB_ICONERROR);
  597. return;
  598. }
  599. D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
  600. dsvHeapDesc.NumDescriptors = 1;
  601. dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
  602. dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
  603. res = device->CreateDescriptorHeap(
  604. &dsvHeapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&dsvHeap);
  605. if (FAILED(res))
  606. {
  607. factory->Release();
  608. Logging::error() << "ERROR: CreateDescriptorHeap returned " << res
  609. << "\n";
  610. WMessageBox(fenster->getWindowHandle(),
  611. new Text("Fehler"),
  612. new Text("CreateDescriptorHeap ist Fehlgeschlagen."),
  613. MB_ICONERROR);
  614. return;
  615. }
  616. D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
  617. dsv.Format = DXGI_FORMAT_D32_FLOAT;
  618. dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
  619. dsv.Texture2D.MipSlice = 0;
  620. dsv.Flags = D3D12_DSV_FLAG_NONE;
  621. device->CreateDepthStencilView(
  622. depthBuffer, &dsv, dsvHeap->GetCPUDescriptorHandleForHeapStart());
  623. D3D12_DESCRIPTOR_HEAP_DESC sbheapDesc = {};
  624. sbheapDesc.NumDescriptors = 6;
  625. sbheapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
  626. sbheapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
  627. res = device->CreateDescriptorHeap(
  628. &sbheapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&shaderBufferHeap);
  629. if (FAILED(res))
  630. {
  631. factory->Release();
  632. Logging::error() << "ERROR: CreateDescriptorHeap returned " << res
  633. << "\n";
  634. WMessageBox(fenster->getWindowHandle(),
  635. new Text("Fehler"),
  636. new Text("CreateDescriptorHeap ist Fehlgeschlagen."),
  637. MB_ICONERROR);
  638. return;
  639. }
  640. vertexShader
  641. = new DX12VertexShader(device, copyCommandQueue, directCommandQueue);
  642. vertexShader->setCompiledByteArray(
  643. (unsigned char*)DX12VertexShaderBytes, sizeof(DX12VertexShaderBytes));
  644. vertexShader->createConstBuffer(sizeof(Mat4<float>) * 2, 0);
  645. vertexShader->createConstBuffer(sizeof(Mat4<float>) * 128, 1);
  646. pixelShader
  647. = new DX12PixelShader(device, copyCommandQueue, directCommandQueue);
  648. pixelShader->setCompiledByteArray(
  649. (unsigned char*)DX12PixelShaderBytes, sizeof(DX12PixelShaderBytes));
  650. pixelShader->createConstBuffer(sizeof(float) * 4, 2);
  651. pixelShader->createConstBuffer(sizeof(float) * 3, 3);
  652. pixelShader->createConstBuffer(sizeof(int) * 2, 4);
  653. D3D12_INPUT_ELEMENT_DESC inputLayout[] = {
  654. {"POSITION",
  655. 0, DXGI_FORMAT_R32G32B32_FLOAT,
  656. 0, D3D12_APPEND_ALIGNED_ELEMENT,
  657. D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  658. {"TEXCOORD",
  659. 0, DXGI_FORMAT_R32G32_FLOAT,
  660. 0, D3D12_APPEND_ALIGNED_ELEMENT,
  661. D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  662. {"NORMAL",
  663. 0, DXGI_FORMAT_R32G32B32_FLOAT,
  664. 0, D3D12_APPEND_ALIGNED_ELEMENT,
  665. D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  666. {"KNOCHEN_ID",
  667. 0, DXGI_FORMAT_R32_UINT,
  668. 0, D3D12_APPEND_ALIGNED_ELEMENT,
  669. D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  670. {"VERTEX_ID",
  671. 0, DXGI_FORMAT_R32_UINT,
  672. 0, D3D12_APPEND_ALIGNED_ELEMENT,
  673. D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
  674. };
  675. vertexShader->createInputLayout(inputLayout, 5);
  676. D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
  677. featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
  678. if (FAILED(device->CheckFeatureSupport(
  679. D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof(featureData))))
  680. featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
  681. D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags
  682. = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
  683. | D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS
  684. | D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS
  685. | D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
  686. D3D12_DESCRIPTOR_RANGE1 range[2];
  687. range[0].NumDescriptors = 5;
  688. range[0].BaseShaderRegister = 0;
  689. range[0].RegisterSpace = 0;
  690. range[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
  691. range[0].OffsetInDescriptorsFromTableStart
  692. = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
  693. range[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
  694. range[1].NumDescriptors = 1;
  695. range[1].BaseShaderRegister = 0;
  696. range[1].RegisterSpace = 0;
  697. range[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
  698. range[1].OffsetInDescriptorsFromTableStart
  699. = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
  700. range[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
  701. D3D12_ROOT_PARAMETER1 rootParameters[1];
  702. rootParameters[0].ParameterType
  703. = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
  704. rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
  705. rootParameters[0].DescriptorTable.NumDescriptorRanges = 2;
  706. rootParameters[0].DescriptorTable.pDescriptorRanges = range;
  707. D3D12_STATIC_SAMPLER_DESC sampler = {};
  708. sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
  709. sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  710. sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  711. sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
  712. sampler.MipLODBias = 0;
  713. sampler.MaxAnisotropy = 0;
  714. sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
  715. sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
  716. sampler.MinLOD = 0.0f;
  717. sampler.MaxLOD = D3D12_FLOAT32_MAX;
  718. sampler.ShaderRegister = 0;
  719. sampler.RegisterSpace = 0;
  720. sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
  721. D3D12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDescription;
  722. rootSignatureDescription.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
  723. rootSignatureDescription.Desc_1_1.NumParameters = 1;
  724. rootSignatureDescription.Desc_1_1.pParameters = rootParameters;
  725. rootSignatureDescription.Desc_1_1.NumStaticSamplers = 1;
  726. rootSignatureDescription.Desc_1_1.pStaticSamplers = &sampler;
  727. rootSignatureDescription.Desc_1_1.Flags = rootSignatureFlags;
  728. ID3DBlob* rootSignature;
  729. ID3DBlob* error;
  730. res = D3DX12SerializeVersionedRootSignature(&rootSignatureDescription,
  731. featureData.HighestVersion,
  732. &rootSignature,
  733. &error,
  734. d3d12svrsf,
  735. d3d12srsf);
  736. if (FAILED(res))
  737. {
  738. factory->Release();
  739. Logging::error()
  740. << "ERROR: D3DX12SerializeVersionedRootSignature returned " << res
  741. << "\n";
  742. WMessageBox(fenster->getWindowHandle(),
  743. new Text("Fehler"),
  744. new Text(
  745. "D3DX12SerializeVersionedRootSignature ist Fehlgeschlagen."),
  746. MB_ICONERROR);
  747. if (error) error->Release();
  748. return;
  749. }
  750. res = device->CreateRootSignature(0,
  751. rootSignature->GetBufferPointer(),
  752. rootSignature->GetBufferSize(),
  753. __uuidof(ID3D12RootSignature),
  754. (void**)&signature);
  755. if (FAILED(res))
  756. {
  757. factory->Release();
  758. Logging::error() << "ERROR: CreateRootSignature returned " << res
  759. << "\n";
  760. WMessageBox(fenster->getWindowHandle(),
  761. new Text("Fehler"),
  762. new Text("CreateRootSignature ist Fehlgeschlagen."),
  763. MB_ICONERROR);
  764. return;
  765. }
  766. rootSignature->Release();
  767. D3D12_RASTERIZER_DESC rdesc;
  768. rdesc.FillMode = D3D12_FILL_MODE_SOLID;
  769. rdesc.CullMode = D3D12_CULL_MODE_BACK;
  770. rdesc.FrontCounterClockwise = 0;
  771. rdesc.DepthBias = 0;
  772. rdesc.DepthBiasClamp = 0.f;
  773. rdesc.SlopeScaledDepthBias = 0.f;
  774. rdesc.DepthClipEnable = 1;
  775. rdesc.MultisampleEnable = 0;
  776. rdesc.AntialiasedLineEnable = 0;
  777. rdesc.ForcedSampleCount = 0;
  778. rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
  779. D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
  780. psoDesc.InputLayout = {vertexShader->zInputLayout(),
  781. (unsigned)vertexShader->getInputLayoutSize()};
  782. psoDesc.pRootSignature = signature;
  783. psoDesc.VS = {vertexShader->getCompiledShader(),
  784. (unsigned __int64)vertexShader->getCompiledLength()};
  785. psoDesc.PS = {pixelShader->getCompiledShader(),
  786. (unsigned __int64)pixelShader->getCompiledLength()};
  787. psoDesc.RasterizerState = rdesc;
  788. psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
  789. psoDesc.DepthStencilState.DepthEnable = FALSE;
  790. psoDesc.DepthStencilState.StencilEnable = FALSE;
  791. psoDesc.SampleMask = UINT_MAX;
  792. psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
  793. psoDesc.NumRenderTargets = 1;
  794. psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
  795. psoDesc.SampleDesc.Count = 1;
  796. D3D12_CPU_DESCRIPTOR_HANDLE sbHeapHandle
  797. = shaderBufferHeap->GetCPUDescriptorHandleForHeapStart();
  798. unsigned int incr = device->GetDescriptorHandleIncrementSize(
  799. D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
  800. D3D12_CONSTANT_BUFFER_VIEW_DESC desc;
  801. vertexShader->getViewDesc(0, desc);
  802. device->CreateConstantBufferView(&desc, sbHeapHandle);
  803. res = device->GetDeviceRemovedReason();
  804. sbHeapHandle.ptr += incr;
  805. vertexShader->getViewDesc(1, desc);
  806. device->CreateConstantBufferView(&desc, sbHeapHandle);
  807. sbHeapHandle.ptr += incr;
  808. pixelShader->getViewDesc(2, desc);
  809. device->CreateConstantBufferView(&desc, sbHeapHandle);
  810. sbHeapHandle.ptr += incr;
  811. pixelShader->getViewDesc(3, desc);
  812. device->CreateConstantBufferView(&desc, sbHeapHandle);
  813. sbHeapHandle.ptr += incr;
  814. pixelShader->getViewDesc(4, desc);
  815. device->CreateConstantBufferView(&desc, sbHeapHandle);
  816. sbHeapHandle.ptr += incr;
  817. uiTexture->updateTextur();
  818. D3D12_SHADER_RESOURCE_VIEW_DESC vd;
  819. vd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
  820. vd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
  821. vd.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
  822. vd.Texture2D.MipLevels = 1;
  823. vd.Texture2D.MostDetailedMip = 0;
  824. vd.Texture2D.PlaneSlice = 0;
  825. vd.Texture2D.ResourceMinLODClamp = 0;
  826. device->CreateShaderResourceView(
  827. ((DX12Texture*)uiTexture)->getResource(), &vd, sbHeapHandle);
  828. directCommandQueue->execute();
  829. res = device->CreateGraphicsPipelineState(
  830. &psoDesc, __uuidof(ID3D12PipelineState), (void**)&pipeline);
  831. if (FAILED(res))
  832. {
  833. factory->Release();
  834. Logging::error() << "ERROR: CreatePipelineState returned " << res
  835. << "\n";
  836. WMessageBox(fenster->getWindowHandle(),
  837. new Text("Fehler"),
  838. new Text("CreatePipelineState ist Fehlgeschlagen."),
  839. MB_ICONERROR);
  840. return;
  841. }
  842. factory->Release();
  843. }
  844. void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
  845. {
  846. D3D12_RESOURCE_BARRIER barrier;
  847. ZeroMemory(&barrier, sizeof(barrier));
  848. barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
  849. barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
  850. barrier.Transition.pResource = this->backBuffer[backBufferIndex];
  851. barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
  852. barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
  853. barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
  854. // TODO
  855. // directCommandQueue->getCommandList()->ResourceBarrier(1, &barrier);
  856. if (fill2D) uiTexture->zImage()->setColor(fillColor);
  857. if (fill3D)
  858. {
  859. float color[4];
  860. // Setup the color to clear the buffer.
  861. color[0] = ((fillColor >> 16) & 0xFF) / 255.f; // R
  862. color[1] = ((fillColor >> 8) & 0xFF) / 255.f; // G
  863. color[2] = (fillColor & 0xFF) / 255.f; // B
  864. color[3] = ((fillColor >> 24) & 0xFF) / 255.f; // A
  865. auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(
  866. D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
  867. D3D12_CPU_DESCRIPTOR_HANDLE rtv
  868. = rtvHeap->GetCPUDescriptorHandleForHeapStart();
  869. rtv.ptr += rtvDescriptorSize * backBufferIndex;
  870. // TODO
  871. // directCommandQueue->getCommandList()->OMSetRenderTargets(1, &rtv, 0,
  872. // 0);
  873. // directCommandQueue->getCommandList()->ClearRenderTargetView(
  874. // rtv, color, 0, 0);
  875. }
  876. int lc[] = {0, 0};
  877. pixelShader->fillConstBuffer((char*)lc, 4, sizeof(int) * 2);
  878. uiTexture->updateTextur();
  879. }
  880. void DirectX12::renderKamera(Cam3D* zKamera)
  881. {
  882. // TODO
  883. // directCommandQueue->getCommandList()->RSSetViewports(
  884. // 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
  885. Mat4<float> tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
  886. viewAndProj[0] = zKamera->getViewMatrix();
  887. viewAndProj[1] = zKamera->getProjectionMatrix();
  888. kamPos = zKamera->getWorldPosition();
  889. if (vertexShader)
  890. vertexShader->fillConstBuffer(
  891. (char*)viewAndProj, 0, sizeof(Mat4<float>) * 2);
  892. if (pixelShader)
  893. pixelShader->fillConstBuffer((char*)&kamPos, 2, sizeof(float) * 3);
  894. World3D* w = zKamera->zWorld();
  895. w->render([this](Model3D* obj) {
  896. // TODO: create or update top level aceleration structure if a model was
  897. // changed
  898. });
  899. // TODO: call ray tracing
  900. }
  901. void DirectX12::presentFrame()
  902. {
  903. // TODO
  904. // directCommandQueue->getCommandList()->RSSetViewports(1, viewPort);
  905. viewAndProj[0] = Mat4<float>::identity();
  906. viewAndProj[1] = Mat4<float>::identity();
  907. if (vertexShader)
  908. vertexShader->fillConstBuffer(
  909. (char*)viewAndProj, 0, sizeof(Mat4<float>) * 2);
  910. D3D12_RESOURCE_BARRIER barrier;
  911. ZeroMemory(&barrier, sizeof(barrier));
  912. barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
  913. barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
  914. barrier.Transition.pResource = this->backBuffer[backBufferIndex];
  915. barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
  916. barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
  917. barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
  918. // TODO
  919. // directCommandQueue->getCommandList()->ResourceBarrier(1, &barrier);
  920. copyCommandQueue->execute();
  921. directCommandQueue->execute();
  922. swapChain->Present(0, 0);
  923. backBufferIndex = swapChain->GetCurrentBackBufferIndex();
  924. }
  925. Texture* DirectX12::createOrGetTexture(const char* name, Image* b)
  926. {
  927. if (!device)
  928. {
  929. if (b) b->release();
  930. return 0;
  931. }
  932. if (texturRegister->hasTexture(name))
  933. {
  934. Texture* ret = texturRegister->getTexture(name);
  935. if (b) ret->setImageZ(b);
  936. return ret;
  937. }
  938. Texture* ret
  939. = new DX12Texture(device, copyCommandQueue, directCommandQueue);
  940. if (b) ret->setImageZ(b);
  941. texturRegister->addTexture(dynamic_cast<Texture*>(ret->getThis()), name);
  942. ret->updateTextur();
  943. copyCommandQueue->execute();
  944. directCommandQueue->execute();
  945. return ret;
  946. }
  947. Image* DirectX12::zUIRenderImage() const
  948. {
  949. return uiTexture ? uiTexture->zImage() : 0;
  950. }
  951. bool DirectX12::isAvailable()
  952. {
  953. HINSTANCE dxgiDLL = getDLLRegister()->loadDLL("dxgi.dll", "dxgi.dll");
  954. if (!dxgiDLL) return 0;
  955. HINSTANCE d3d12DLL = getDLLRegister()->loadDLL("d3d12.dll", "d3d12.dll");
  956. if (!d3d12DLL)
  957. {
  958. getDLLRegister()->releaseDLL("dxgi.dll");
  959. return 0;
  960. }
  961. CreateDXGIFactory2Function createFactory
  962. = (CreateDXGIFactory2Function)GetProcAddress(
  963. dxgiDLL, "CreateDXGIFactory2");
  964. if (!createFactory)
  965. {
  966. getDLLRegister()->releaseDLL("dxgi.dll");
  967. getDLLRegister()->releaseDLL("d3d12.dll");
  968. return 0;
  969. }
  970. D3D12CreateDeviceFunction createDevice
  971. = (D3D12CreateDeviceFunction)GetProcAddress(
  972. d3d12DLL, "D3D12CreateDevice");
  973. if (!createDevice)
  974. {
  975. getDLLRegister()->releaseDLL("dxgi.dll");
  976. getDLLRegister()->releaseDLL("d3d12.dll");
  977. return 0;
  978. }
  979. #ifdef _DEBUG
  980. D3D12GetDebugInterfaceFunction getDebugInterface
  981. = (D3D12GetDebugInterfaceFunction)GetProcAddress(
  982. d3d12DLL, "D3D12GetDebugInterface");
  983. ID3D12Debug* debug = 0;
  984. getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug);
  985. debug->EnableDebugLayer();
  986. #endif
  987. IDXGIFactory4* factory;
  988. UINT createFactoryFlags = 0;
  989. #ifdef _DEBUG
  990. createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
  991. #endif
  992. HRESULT res = createFactory(
  993. createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
  994. if (FAILED(res))
  995. {
  996. getDLLRegister()->releaseDLL("dxgi.dll");
  997. getDLLRegister()->releaseDLL("d3d12.dll");
  998. return 0;
  999. }
  1000. int index = 0;
  1001. do
  1002. {
  1003. IDXGIAdapter1* current;
  1004. res = factory->EnumAdapters1(index++, &current);
  1005. if (res == S_OK)
  1006. {
  1007. DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
  1008. current->GetDesc1(&dxgiAdapterDesc1);
  1009. ID3D12Device5* device = 0;
  1010. if ((dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0
  1011. && SUCCEEDED(createDevice(current,
  1012. D3D_FEATURE_LEVEL_12_1,
  1013. __uuidof(ID3D12Device5),
  1014. (void**)&device)))
  1015. {
  1016. device->Release();
  1017. current->Release();
  1018. factory->Release();
  1019. #ifdef _DEBUG
  1020. debug->Release();
  1021. #endif
  1022. getDLLRegister()->releaseDLL("dxgi.dll");
  1023. getDLLRegister()->releaseDLL("d3d12.dll");
  1024. return 1;
  1025. }
  1026. current->Release();
  1027. }
  1028. } while (res != DXGI_ERROR_NOT_FOUND);
  1029. factory->Release();
  1030. getDLLRegister()->releaseDLL("dxgi.dll");
  1031. getDLLRegister()->releaseDLL("d3d12.dll");
  1032. return 0;
  1033. }
  1034. DXBuffer* DirectX12::createStructuredBuffer(int eSize)
  1035. {
  1036. throw "Sorry, support for structured buffers will come eventualy"; // TODO:
  1037. // support
  1038. // structured
  1039. // buffers
  1040. }