DX12GraphicsApi.cpp 42 KB

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