|
|
@@ -36,8 +36,6 @@ DirectX12::DirectX12()
|
|
|
swapChain(0),
|
|
|
backBufferIndex(0),
|
|
|
tearing(0),
|
|
|
- viewPort(0),
|
|
|
- allowedRenderArea(0),
|
|
|
signature(0),
|
|
|
uiTexture(0),
|
|
|
texturRegister(new TextureList()),
|
|
|
@@ -49,13 +47,13 @@ DirectX12::DirectX12()
|
|
|
defaultRenderTarget(0),
|
|
|
defaultKamera(0),
|
|
|
cameraCount(0),
|
|
|
+ rayGenSettingsBuffer(0),
|
|
|
device(0),
|
|
|
pfnD3D12SerializeRootSignature(0),
|
|
|
pipeline(0),
|
|
|
globalDescriptorHeap(0),
|
|
|
defaultHitGroup(0),
|
|
|
- defaultRayGenerationShaderFunction(0),
|
|
|
- tlasInputOffset(0)
|
|
|
+ defaultRayGenerationShaderFunction(0)
|
|
|
{
|
|
|
for (int i = 0; i < 2; i++)
|
|
|
backBuffer[i] = 0;
|
|
|
@@ -101,13 +99,15 @@ DirectX12::~DirectX12()
|
|
|
directCommandQueue->flush();
|
|
|
directCommandQueue->release();
|
|
|
}
|
|
|
+ if (rayGenSettingsBuffer)
|
|
|
+ {
|
|
|
+ rayGenSettingsBuffer->release();
|
|
|
+ }
|
|
|
texturRegister->release();
|
|
|
if (uiTexture) uiTexture->release();
|
|
|
if (defaultKamera) defaultKamera->release();
|
|
|
if (defaultRenderTarget) defaultRenderTarget->release();
|
|
|
if (signature) signature->Release();
|
|
|
- delete allowedRenderArea;
|
|
|
- delete viewPort;
|
|
|
for (int i = 0; i < 2; i++)
|
|
|
{
|
|
|
if (backBuffer[i]) backBuffer[i]->Release();
|
|
|
@@ -125,6 +125,7 @@ DirectX12::~DirectX12()
|
|
|
|
|
|
void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
{
|
|
|
+ cs.lock();
|
|
|
bool updateRequired = 0;
|
|
|
for (const Model3DData* model : *modelList->zModels())
|
|
|
{
|
|
|
@@ -143,16 +144,14 @@ void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
blasModels[id]->calculateBuffers();
|
|
|
bufferCount += blasModels[id]->getBufferCount();
|
|
|
}
|
|
|
- directCommandQueue
|
|
|
- ->execute(); // TODO: check if this is realy necessary
|
|
|
- // here, because maybe the command list is
|
|
|
- // executed in the render function anyway
|
|
|
}
|
|
|
+ cs.unlock();
|
|
|
}
|
|
|
|
|
|
void Framework::DirectX12::renderKamera(
|
|
|
Cam3D* zKamera, DX12Texture* zTarget, bool guiVisible)
|
|
|
{
|
|
|
+ updateBottomLevelAccelerationStructure();
|
|
|
if (guiVisible)
|
|
|
{
|
|
|
uiTexture->updateTextur();
|
|
|
@@ -166,7 +165,6 @@ void Framework::DirectX12::renderKamera(
|
|
|
Mat4<float> identity = Mat4<float>::identity();
|
|
|
|
|
|
World3D* w = zKamera->zWorld();
|
|
|
-
|
|
|
if (w->getId() < 0)
|
|
|
{
|
|
|
w->setId(++lastTLASId);
|
|
|
@@ -207,6 +205,7 @@ void Framework::DirectX12::renderKamera(
|
|
|
obj->calculateMatrices(identity, matrixBuffer);
|
|
|
int modelId = obj->zModelData()->getId();
|
|
|
DX12BLASModel* blasModel = blasModels[modelId];
|
|
|
+ blasModel->calculateBuffers();
|
|
|
ArrayIterator<int> boneIds = blasModel->zBoneIds()->begin();
|
|
|
for (const DX12BLAS* blas : *blasModel->zBLAS())
|
|
|
{
|
|
|
@@ -227,13 +226,20 @@ void Framework::DirectX12::renderKamera(
|
|
|
objectIndex++;
|
|
|
});
|
|
|
tlas->endUpdate();
|
|
|
+ settings.inverseProjection = zKamera->getInverseProjectionMatrix();
|
|
|
+ settings.inverseView = zKamera->getInverseViewMatrix();
|
|
|
+ settings.minDistance = zKamera->zViewPort()->front;
|
|
|
+ settings.maxDistance = zKamera->zViewPort()->back;
|
|
|
+ settings.useRays = 1;
|
|
|
+ settings.renderGui = (int)guiVisible;
|
|
|
+ rayGenSettingsBuffer->setData(&settings, 1);
|
|
|
+ rayGenSettingsBuffer->copyToGPU(sizeof(settings));
|
|
|
if (defaultRayGenerationShaderFunction)
|
|
|
{
|
|
|
globalDescriptorHeap->updateTextureInput(
|
|
|
0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, zTarget);
|
|
|
- sbt->setShaderInput(defaultRayGenerationShaderFunction,
|
|
|
- tlasInputOffset,
|
|
|
- tlas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress());
|
|
|
+ globalDescriptorHeap->updateTLASInput(
|
|
|
+ 3, DX12_SHADER_REGISTER_T_SHADER_RESOURCE, tlas);
|
|
|
}
|
|
|
sbt->setGlobalDescriptorHeap(dynamic_cast<DX12GlobalDescriptorHeap*>(
|
|
|
globalDescriptorHeap->getThis()));
|
|
|
@@ -264,9 +270,10 @@ void Framework::DirectX12::initializePipeline()
|
|
|
0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
|
|
|
rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
|
|
|
1, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
|
|
|
- tlasInputOffset
|
|
|
- = rayGenSignature->addRegisterUsageLinkedToShaderBindingTable(
|
|
|
- DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
|
|
|
+ rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
|
|
|
+ 2, DX12_SHADER_REGISTER_B_CONST_BUFFER, 0);
|
|
|
+ rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
|
|
|
+ 3, DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
|
|
|
defaultRayGenerationShaderFunction = new DX12ShaderFunction(
|
|
|
"RayGen", rayGenSignature, DX12_SHADER_FUNCTION_TYPE_RAY_GEN);
|
|
|
rayGenShader->addFunction(defaultRayGenerationShaderFunction);
|
|
|
@@ -294,6 +301,8 @@ void Framework::DirectX12::initializePipeline()
|
|
|
defaultHitGroup->setPayloadSize(16);
|
|
|
defaultHitGroup->setClosestHitShaderFunction(closestHitFunction);
|
|
|
pipeline->addHitGroup(defaultHitGroup);
|
|
|
+
|
|
|
+ pipeline->setMaxRecursionDepth(10);
|
|
|
}
|
|
|
pipeline->createPipelineState(device, pfnD3D12SerializeRootSignature);
|
|
|
}
|
|
|
@@ -304,6 +313,10 @@ void Framework::DirectX12::initializeGlobalDescriptorHeap()
|
|
|
DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, defaultRenderTarget);
|
|
|
globalDescriptorHeap->addTextureInput(
|
|
|
DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, uiTexture);
|
|
|
+ globalDescriptorHeap->addBufferInput(
|
|
|
+ DX12_SHADER_REGISTER_B_CONST_BUFFER, rayGenSettingsBuffer);
|
|
|
+ globalDescriptorHeap->addTLASInput(
|
|
|
+ DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
|
|
|
|
|
|
globalDescriptorHeap->updateDescriptorHeap(device);
|
|
|
}
|
|
|
@@ -334,6 +347,15 @@ void DirectX12::initialize(
|
|
|
{
|
|
|
GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
|
|
|
|
|
|
+#ifdef _DEBUG
|
|
|
+ if (debugDX)
|
|
|
+ {
|
|
|
+ HINSTANCE pixDebugger = getDLLRegister()->loadDLL(
|
|
|
+ "WinPixGpuCapturer.dll",
|
|
|
+ "C:\\Program Files\\Microsoft PIX\\2603.25\\WinPixGpuCapturer.dll");
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
HINSTANCE dxgiDLL = getDLLRegister()->loadDLL("dxgi.dll", "dxgi.dll");
|
|
|
if (!dxgiDLL)
|
|
|
{
|
|
|
@@ -572,6 +594,19 @@ void DirectX12::initialize(
|
|
|
|
|
|
directCommandQueue = new DX12DirectCommandQueue(device);
|
|
|
|
|
|
+ settings.minDistance = 0.0f;
|
|
|
+ settings.maxDistance = 100000.f;
|
|
|
+ settings.renderGui = 0;
|
|
|
+ settings.useRays = 0;
|
|
|
+ rayGenSettingsBuffer = new DX12Buffer(1,
|
|
|
+ device,
|
|
|
+ dynamic_cast<DX12CommandQueue*>(directCommandQueue->getThis()),
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
+ rayGenSettingsBuffer->setLength(
|
|
|
+ ROUND_UP_POWER_OF_2(sizeof(RayGenerationSettings), 256));
|
|
|
+ rayGenSettingsBuffer->setData(&settings, 1);
|
|
|
+ rayGenSettingsBuffer->copyToGPU(sizeof(RayGenerationSettings));
|
|
|
+
|
|
|
IDXGIFactory5* fac5 = 0;
|
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
|
if (fac5)
|
|
|
@@ -653,20 +688,6 @@ void DirectX12::initialize(
|
|
|
createOrGetTexture("_f_RenderTarget", renderTargetImage, GPU_TO_RAM));
|
|
|
defaultRenderTarget->updateTextur();
|
|
|
|
|
|
- viewPort = new D3D12_VIEWPORT();
|
|
|
- viewPort->Width = (float)this->backBufferSize.x;
|
|
|
- viewPort->Height = (float)this->backBufferSize.y;
|
|
|
- viewPort->MinDepth = 0.0f;
|
|
|
- viewPort->MaxDepth = 1.0f;
|
|
|
- viewPort->TopLeftX = 0.0f;
|
|
|
- viewPort->TopLeftY = 0.0f;
|
|
|
-
|
|
|
- allowedRenderArea = new D3D12_RECT();
|
|
|
- allowedRenderArea->left = 0;
|
|
|
- allowedRenderArea->top = 0;
|
|
|
- allowedRenderArea->right = LONG_MAX;
|
|
|
- allowedRenderArea->bottom = LONG_MAX;
|
|
|
-
|
|
|
Image* renderB = new Image(1);
|
|
|
renderB->setAlpha3D(1);
|
|
|
renderB->newImage(this->backBufferSize.x, this->backBufferSize.y, 0);
|
|
|
@@ -793,6 +814,7 @@ void DirectX12::initialize(
|
|
|
|
|
|
void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
|
|
|
{
|
|
|
+ cs.lock();
|
|
|
cameraCount = 0;
|
|
|
D3D12_RESOURCE_BARRIER barrier;
|
|
|
ZeroMemory(&barrier, sizeof(barrier));
|
|
|
@@ -869,6 +891,8 @@ void DirectX12::presentFrame()
|
|
|
swapChain->Present(0, 0);
|
|
|
|
|
|
backBufferIndex = swapChain->GetCurrentBackBufferIndex();
|
|
|
+
|
|
|
+ cs.unlock();
|
|
|
}
|
|
|
|
|
|
Texture* DirectX12::createOrGetTexture(
|
|
|
@@ -885,11 +909,13 @@ Texture* DirectX12::createOrGetTexture(
|
|
|
if (b) ret->setImageZ(b);
|
|
|
return ret;
|
|
|
}
|
|
|
+ cs.lock();
|
|
|
Texture* ret = new DX12Texture(device, directCommandQueue, dir);
|
|
|
if (b) ret->setImageZ(b);
|
|
|
texturRegister->addTexture(dynamic_cast<Texture*>(ret->getThis()), name);
|
|
|
ret->updateTextur();
|
|
|
- directCommandQueue->execute();
|
|
|
+ // directCommandQueue->execute();
|
|
|
+ cs.unlock();
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
@@ -906,6 +932,29 @@ DXBuffer* DirectX12::createStructuredBuffer(int eSize)
|
|
|
D3D12_RESOURCE_FLAG_NONE);
|
|
|
}
|
|
|
|
|
|
+Model3DData* Framework::DirectX12::createModel(const char* name)
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ Model3DData* result = GraphicsApi::createModel(name);
|
|
|
+ lastModelId = result->getId();
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ DX12BLASModel** newBlasModels = new DX12BLASModel*[lastModelId + 1];
|
|
|
+ if (lastModelId > 0)
|
|
|
+ {
|
|
|
+ memcpy(newBlasModels,
|
|
|
+ blasModels,
|
|
|
+ sizeof(DX12BLASModel*) * lastModelId);
|
|
|
+ }
|
|
|
+ newBlasModels[lastModelId]
|
|
|
+ = new DX12BLASModel(result, device, directCommandQueue);
|
|
|
+ delete[] blasModels;
|
|
|
+ blasModels = newBlasModels;
|
|
|
+ }
|
|
|
+ cs.unlock();
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
void Framework::DirectX12::setPipeline(DX12Pipeline* pipeline)
|
|
|
{
|
|
|
if (this->pipeline)
|