|
@@ -10,6 +10,9 @@
|
|
|
#include "DLLRegister.h"
|
|
#include "DLLRegister.h"
|
|
|
#include "DX12BLASModel.h"
|
|
#include "DX12BLASModel.h"
|
|
|
#include "DX12CommandQueue.h"
|
|
#include "DX12CommandQueue.h"
|
|
|
|
|
+#include "DX12HitShader.h"
|
|
|
|
|
+#include "DX12MissShader.h"
|
|
|
|
|
+#include "DX12RayGenShader.h"
|
|
|
#include "DX12Shader.h"
|
|
#include "DX12Shader.h"
|
|
|
#include "DX12Texture.h"
|
|
#include "DX12Texture.h"
|
|
|
#include "DX12TLAS.h"
|
|
#include "DX12TLAS.h"
|
|
@@ -31,18 +34,12 @@ DirectX12::DirectX12()
|
|
|
device(0),
|
|
device(0),
|
|
|
infoQueue(0),
|
|
infoQueue(0),
|
|
|
directCommandQueue(0),
|
|
directCommandQueue(0),
|
|
|
- copyCommandQueue(0),
|
|
|
|
|
- computeCommandQueue(0),
|
|
|
|
|
swapChain(0),
|
|
swapChain(0),
|
|
|
rtvHeap(0),
|
|
rtvHeap(0),
|
|
|
- dsvHeap(0),
|
|
|
|
|
- depthBuffer(0),
|
|
|
|
|
backBufferIndex(0),
|
|
backBufferIndex(0),
|
|
|
tearing(0),
|
|
tearing(0),
|
|
|
viewPort(0),
|
|
viewPort(0),
|
|
|
allowedRenderArea(0),
|
|
allowedRenderArea(0),
|
|
|
- vertexBufferView(0),
|
|
|
|
|
- indexBufferView(0),
|
|
|
|
|
signature(0),
|
|
signature(0),
|
|
|
uiTexture(0),
|
|
uiTexture(0),
|
|
|
texturRegister(new TextureList()),
|
|
texturRegister(new TextureList()),
|
|
@@ -51,7 +48,10 @@ DirectX12::DirectX12()
|
|
|
worldShaderBindingTables(0),
|
|
worldShaderBindingTables(0),
|
|
|
lastTLASId(-1),
|
|
lastTLASId(-1),
|
|
|
lastModelId(-1),
|
|
lastModelId(-1),
|
|
|
- defaultRenderTarget(0)
|
|
|
|
|
|
|
+ defaultRenderTarget(0),
|
|
|
|
|
+ globalDescriptorHeap(0),
|
|
|
|
|
+ defaultHitGroup(0),
|
|
|
|
|
+ defaultRayGenerationShaderFunction(0)
|
|
|
{
|
|
{
|
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
|
backBuffer[i] = 0;
|
|
backBuffer[i] = 0;
|
|
@@ -84,29 +84,23 @@ DirectX12::~DirectX12()
|
|
|
}
|
|
}
|
|
|
delete[] worldShaderBindingTables;
|
|
delete[] worldShaderBindingTables;
|
|
|
}
|
|
}
|
|
|
- if (directCommandQueue)
|
|
|
|
|
|
|
+ if (globalDescriptorHeap)
|
|
|
{
|
|
{
|
|
|
- directCommandQueue->flush();
|
|
|
|
|
- directCommandQueue->release();
|
|
|
|
|
|
|
+ globalDescriptorHeap->release();
|
|
|
}
|
|
}
|
|
|
- if (copyCommandQueue)
|
|
|
|
|
|
|
+ if (pipeline)
|
|
|
{
|
|
{
|
|
|
- copyCommandQueue->flush();
|
|
|
|
|
- copyCommandQueue->release();
|
|
|
|
|
|
|
+ pipeline->release();
|
|
|
}
|
|
}
|
|
|
- if (computeCommandQueue)
|
|
|
|
|
|
|
+ if (directCommandQueue)
|
|
|
{
|
|
{
|
|
|
- computeCommandQueue->flush();
|
|
|
|
|
- computeCommandQueue->release();
|
|
|
|
|
|
|
+ directCommandQueue->flush();
|
|
|
|
|
+ directCommandQueue->release();
|
|
|
}
|
|
}
|
|
|
- if (depthBuffer) depthBuffer->Release();
|
|
|
|
|
- if (dsvHeap) dsvHeap->Release();
|
|
|
|
|
texturRegister->release();
|
|
texturRegister->release();
|
|
|
if (uiTexture) uiTexture->release();
|
|
if (uiTexture) uiTexture->release();
|
|
|
if (defaultRenderTarget) defaultRenderTarget->release();
|
|
if (defaultRenderTarget) defaultRenderTarget->release();
|
|
|
if (signature) signature->Release();
|
|
if (signature) signature->Release();
|
|
|
- delete indexBufferView;
|
|
|
|
|
- delete vertexBufferView;
|
|
|
|
|
delete allowedRenderArea;
|
|
delete allowedRenderArea;
|
|
|
delete viewPort;
|
|
delete viewPort;
|
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
@@ -155,6 +149,10 @@ void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
void Framework::DirectX12::renderKamera(
|
|
void Framework::DirectX12::renderKamera(
|
|
|
Cam3D* zKamera, DX12Texture* zTarget, bool guiVisible)
|
|
Cam3D* zKamera, DX12Texture* zTarget, bool guiVisible)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (!pipeline)
|
|
|
|
|
+ {
|
|
|
|
|
+ setPipeline(new DX12Pipeline());
|
|
|
|
|
+ }
|
|
|
// TODO
|
|
// TODO
|
|
|
// directCommandQueue->getCommandList()->RSSetViewports(
|
|
// directCommandQueue->getCommandList()->RSSetViewports(
|
|
|
// 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
|
|
// 1, (D3D12_VIEWPORT*)zKamera->zViewPort());
|
|
@@ -197,36 +195,110 @@ void Framework::DirectX12::renderKamera(
|
|
|
sbt->startUpdate();
|
|
sbt->startUpdate();
|
|
|
int objectIndex = 0;
|
|
int objectIndex = 0;
|
|
|
int instanceIndex = 0;
|
|
int instanceIndex = 0;
|
|
|
- w->render(
|
|
|
|
|
- [this, &tlas, &objectIndex, &instanceIndex, &identity](Model3D* obj) {
|
|
|
|
|
- obj->calculateMatrices(identity, matrixBuffer);
|
|
|
|
|
- int modelId = obj->zModelData()->getId();
|
|
|
|
|
- DX12BLASModel* blasModel = blasModels[modelId];
|
|
|
|
|
- ArrayIterator<int> boneIds = blasModel->zBoneIds()->begin();
|
|
|
|
|
- for (const DX12BLAS* blas : *blasModel->zBLAS())
|
|
|
|
|
- {
|
|
|
|
|
- D3D12_RAYTRACING_INSTANCE_DESC* desc = tlas->nextInstanceDesc();
|
|
|
|
|
- desc->InstanceID = objectIndex;
|
|
|
|
|
- desc->InstanceContributionToHitGroupIndex = objectIndex;
|
|
|
|
|
- desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
|
|
|
|
|
- desc->InstanceMask = 0xFF;
|
|
|
|
|
- desc->AccelerationStructure
|
|
|
|
|
- = blas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
- memcpy(desc->Transform,
|
|
|
|
|
- &matrixBuffer[boneIds.val()],
|
|
|
|
|
- sizeof(float) * 12);
|
|
|
|
|
- // TODO: sbt->setHitGroupShaderInputs(instanceIndex, ...)
|
|
|
|
|
- boneIds++;
|
|
|
|
|
- instanceIndex++;
|
|
|
|
|
- }
|
|
|
|
|
- objectIndex++;
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ w->render([this, &tlas, &objectIndex, &instanceIndex, &identity, &sbt](
|
|
|
|
|
+ Model3D* obj) {
|
|
|
|
|
+ obj->calculateMatrices(identity, matrixBuffer);
|
|
|
|
|
+ int modelId = obj->zModelData()->getId();
|
|
|
|
|
+ DX12BLASModel* blasModel = blasModels[modelId];
|
|
|
|
|
+ ArrayIterator<int> boneIds = blasModel->zBoneIds()->begin();
|
|
|
|
|
+ for (const DX12BLAS* blas : *blasModel->zBLAS())
|
|
|
|
|
+ {
|
|
|
|
|
+ D3D12_RAYTRACING_INSTANCE_DESC* desc = tlas->nextInstanceDesc();
|
|
|
|
|
+ desc->InstanceID = objectIndex;
|
|
|
|
|
+ desc->InstanceContributionToHitGroupIndex = objectIndex;
|
|
|
|
|
+ desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
|
|
|
|
|
+ desc->InstanceMask = 0xFF;
|
|
|
|
|
+ desc->AccelerationStructure
|
|
|
|
|
+ = blas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ memcpy(desc->Transform,
|
|
|
|
|
+ &matrixBuffer[boneIds.val()],
|
|
|
|
|
+ sizeof(float) * 12);
|
|
|
|
|
+ boneIds++;
|
|
|
|
|
+ instanceIndex++;
|
|
|
|
|
+ }
|
|
|
|
|
+ fillShaderBindingTable(sbt, obj, objectIndex);
|
|
|
|
|
+ objectIndex++;
|
|
|
|
|
+ });
|
|
|
tlas->endUpdate();
|
|
tlas->endUpdate();
|
|
|
- // TODO: setup ray gen and miss params
|
|
|
|
|
|
|
+ if (defaultRayGenerationShaderFunction)
|
|
|
|
|
+ {
|
|
|
|
|
+ sbt->setShaderInputs(defaultRayGenerationShaderFunction,
|
|
|
|
|
+ {zTarget->zResource()->GetGPUVirtualAddress(),
|
|
|
|
|
+ tlas->zResultBuffer()->zBuffer()->GetGPUVirtualAddress()});
|
|
|
|
|
+ }
|
|
|
|
|
+ sbt->setGlobalDescriptorHeap(dynamic_cast<DX12GlobalDescriptorHeap*>(
|
|
|
|
|
+ globalDescriptorHeap->getThis()));
|
|
|
sbt->endUpdate(device);
|
|
sbt->endUpdate(device);
|
|
|
|
|
+ ID3D12DescriptorHeap* heaps[] = {globalDescriptorHeap->zDescriptorHeap()};
|
|
|
|
|
+ directCommandQueue->zCommandList()->SetDescriptorHeaps(1, heaps);
|
|
|
|
|
+
|
|
|
|
|
+ D3D12_DISPATCH_RAYS_DESC desc;
|
|
|
|
|
+ sbt->fillDispatchRaysDesc(&desc);
|
|
|
|
|
+ directCommandQueue->zCommandList()->SetPipelineState1(
|
|
|
|
|
+ pipeline->zPipelineState());
|
|
|
|
|
+ directCommandQueue->zCommandList()->DispatchRays(&desc);
|
|
|
// TODO: call ray tracing
|
|
// TODO: call ray tracing
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void Framework::DirectX12::initializePipeline()
|
|
|
|
|
+{
|
|
|
|
|
+ if (pipeline->getShaders().getEntryCount() == 0)
|
|
|
|
|
+ { // add default shaders
|
|
|
|
|
+ DX12Shader* rayGenShader
|
|
|
|
|
+ = new DX12Shader(DX12DefaultRayGenerationShaderBytes,
|
|
|
|
|
+ sizeof(DX12DefaultRayGenerationShaderBytes));
|
|
|
|
|
+ // RayGen from RayGen.hlsl
|
|
|
|
|
+ DX12ShaderSignature* rayGenSignature = new DX12ShaderSignature();
|
|
|
|
|
+ rayGenSignature->addRegisterUsageLinkedToShaderBindingTable(
|
|
|
|
|
+ DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
|
|
|
|
|
+ rayGenSignature->addRegisterUsageLinkedToDescriptorHeap(
|
|
|
|
|
+ 0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
|
|
|
|
|
+ rayGenSignature->addRegisterUsageLinkedToShaderBindingTable(
|
|
|
|
|
+ DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
|
|
|
|
|
+ defaultRayGenerationShaderFunction
|
|
|
|
|
+ = new DX12ShaderFunction("RayGen", rayGenSignature);
|
|
|
|
|
+ rayGenShader->addFunction(defaultRayGenerationShaderFunction);
|
|
|
|
|
+ pipeline->addShader(rayGenShader);
|
|
|
|
|
+
|
|
|
|
|
+ DX12Shader* missShader = new DX12Shader(
|
|
|
|
|
+ DX12DefaultMissShaderBytes, sizeof(DX12DefaultMissShaderBytes));
|
|
|
|
|
+ // Miss from Miss.hlsl
|
|
|
|
|
+ missShader->addFunction(
|
|
|
|
|
+ new DX12ShaderFunction("Miss", new DX12ShaderSignature()));
|
|
|
|
|
+ pipeline->addShader(missShader);
|
|
|
|
|
+
|
|
|
|
|
+ DX12Shader* hitShader = new DX12Shader(
|
|
|
|
|
+ DX12DefaultMissShaderBytes, sizeof(DX12DefaultMissShaderBytes));
|
|
|
|
|
+ // ClosestHit from Hit.hlsl
|
|
|
|
|
+ DX12ShaderFunction* closestHitFunction
|
|
|
|
|
+ = new DX12ShaderFunction("ClosestHit", new DX12ShaderSignature());
|
|
|
|
|
+ missShader->addFunction(closestHitFunction);
|
|
|
|
|
+ pipeline->addShader(hitShader);
|
|
|
|
|
+
|
|
|
|
|
+ defaultHitGroup = new DX12ShaderHitGroup("HitGroup");
|
|
|
|
|
+ defaultHitGroup->setClosestHitShaderFunction(closestHitFunction);
|
|
|
|
|
+ pipeline->addHitGroup(defaultHitGroup);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void Framework::DirectX12::initializeGlobalDescriptorHeap()
|
|
|
|
|
+{
|
|
|
|
|
+ globalDescriptorHeap->addTextureInput(
|
|
|
|
|
+ DX12_SHADER_REGISTER_T_SHADER_RESOURCE, uiTexture);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void Framework::DirectX12::fillShaderBindingTable(
|
|
|
|
|
+ DX12ShaderBindingTable* zShaderBindingTable,
|
|
|
|
|
+ Model3D* zModel,
|
|
|
|
|
+ int instanceIndex)
|
|
|
|
|
+{
|
|
|
|
|
+ if (defaultHitGroup)
|
|
|
|
|
+ {
|
|
|
|
|
+ zShaderBindingTable->setHitGroupShaderInputs(
|
|
|
|
|
+ instanceIndex, defaultHitGroup, {});
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
|
|
typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
|
|
|
|
|
|
|
|
typedef HRESULT(__stdcall* D3D12CreateDeviceFunction)(
|
|
typedef HRESULT(__stdcall* D3D12CreateDeviceFunction)(
|
|
@@ -464,8 +536,6 @@ void DirectX12::initialize(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
directCommandQueue = new DX12DirectCommandQueue(device);
|
|
directCommandQueue = new DX12DirectCommandQueue(device);
|
|
|
- copyCommandQueue = new DX12CopyCommandQueue(device);
|
|
|
|
|
- computeCommandQueue = new DX12ComputeCommandQueue(device);
|
|
|
|
|
|
|
|
|
|
IDXGIFactory5* fac5 = 0;
|
|
IDXGIFactory5* fac5 = 0;
|
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
@@ -593,72 +663,6 @@ void DirectX12::initialize(
|
|
|
renderB->newImage(this->backBufferSize.x, this->backBufferSize.y, 0);
|
|
renderB->newImage(this->backBufferSize.x, this->backBufferSize.y, 0);
|
|
|
uiTexture = createOrGetTexture("_f_Render_Image", renderB, RAM_TO_GPU);
|
|
uiTexture = createOrGetTexture("_f_Render_Image", renderB, RAM_TO_GPU);
|
|
|
|
|
|
|
|
- vertexBufferView = new D3D12_VERTEX_BUFFER_VIEW();
|
|
|
|
|
- vertexBufferView->StrideInBytes = sizeof(Vertex3D);
|
|
|
|
|
-
|
|
|
|
|
- indexBufferView = new D3D12_INDEX_BUFFER_VIEW();
|
|
|
|
|
- indexBufferView->Format = DXGI_FORMAT_R32_UINT;
|
|
|
|
|
-
|
|
|
|
|
- D3D12_CLEAR_VALUE optimizedClearValue = {};
|
|
|
|
|
- optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
|
|
|
|
|
- optimizedClearValue.DepthStencil = {1.0f, 0};
|
|
|
|
|
- CD3DX12_HEAP_PROPERTIES heapProp
|
|
|
|
|
- = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
|
|
|
|
|
- CD3DX12_RESOURCE_DESC heapDesc
|
|
|
|
|
- = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT,
|
|
|
|
|
- this->backBufferSize.x,
|
|
|
|
|
- this->backBufferSize.y,
|
|
|
|
|
- 1,
|
|
|
|
|
- 0,
|
|
|
|
|
- 1,
|
|
|
|
|
- 0,
|
|
|
|
|
- D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL);
|
|
|
|
|
- res = device->CreateCommittedResource(&heapProp,
|
|
|
|
|
- D3D12_HEAP_FLAG_NONE,
|
|
|
|
|
- &heapDesc,
|
|
|
|
|
- D3D12_RESOURCE_STATE_DEPTH_WRITE,
|
|
|
|
|
- &optimizedClearValue,
|
|
|
|
|
- __uuidof(ID3D12Resource),
|
|
|
|
|
- (void**)&depthBuffer);
|
|
|
|
|
- if (FAILED(res))
|
|
|
|
|
- {
|
|
|
|
|
- factory->Release();
|
|
|
|
|
- Logging::error() << "ERROR: CreateCommittedResource returned " << res
|
|
|
|
|
- << "\n";
|
|
|
|
|
- WMessageBox(fenster->getWindowHandle(),
|
|
|
|
|
- new Text("Fehler"),
|
|
|
|
|
- new Text("CreateCommittedResource ist Fehlgeschlagen."),
|
|
|
|
|
- MB_ICONERROR);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
|
|
|
|
|
- dsvHeapDesc.NumDescriptors = 1;
|
|
|
|
|
- dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
|
|
|
|
|
- dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
|
|
|
|
|
- res = device->CreateDescriptorHeap(
|
|
|
|
|
- &dsvHeapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&dsvHeap);
|
|
|
|
|
- if (FAILED(res))
|
|
|
|
|
- {
|
|
|
|
|
- factory->Release();
|
|
|
|
|
- Logging::error() << "ERROR: CreateDescriptorHeap returned " << res
|
|
|
|
|
- << "\n";
|
|
|
|
|
- WMessageBox(fenster->getWindowHandle(),
|
|
|
|
|
- new Text("Fehler"),
|
|
|
|
|
- new Text("CreateDescriptorHeap ist Fehlgeschlagen."),
|
|
|
|
|
- MB_ICONERROR);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
|
|
|
|
|
- dsv.Format = DXGI_FORMAT_D32_FLOAT;
|
|
|
|
|
- dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
|
|
|
|
|
- dsv.Texture2D.MipSlice = 0;
|
|
|
|
|
- dsv.Flags = D3D12_DSV_FLAG_NONE;
|
|
|
|
|
-
|
|
|
|
|
- device->CreateDepthStencilView(
|
|
|
|
|
- depthBuffer, &dsv, dsvHeap->GetCPUDescriptorHandleForHeapStart());
|
|
|
|
|
-
|
|
|
|
|
D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
|
|
D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
|
|
|
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
|
|
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
|
|
|
if (FAILED(device->CheckFeatureSupport(
|
|
if (FAILED(device->CheckFeatureSupport(
|
|
@@ -816,6 +820,12 @@ void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uiTexture->updateTextur();
|
|
uiTexture->updateTextur();
|
|
|
|
|
+
|
|
|
|
|
+ CD3DX12_RESOURCE_BARRIER transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(defaultRenderTarget->zResource(),
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COPY_SOURCE,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
|
|
|
|
|
+ directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void DirectX12::renderKamera(Cam3D* zKamera)
|
|
void DirectX12::renderKamera(Cam3D* zKamera)
|
|
@@ -830,24 +840,33 @@ void Framework::DirectX12::renderKamera(Cam3D* zKamera, Texture* zTarget)
|
|
|
|
|
|
|
|
void DirectX12::presentFrame()
|
|
void DirectX12::presentFrame()
|
|
|
{
|
|
{
|
|
|
- // TODO
|
|
|
|
|
- // directCommandQueue->getCommandList()->RSSetViewports(1, viewPort);
|
|
|
|
|
-
|
|
|
|
|
- viewAndProj[0] = Mat4<float>::identity();
|
|
|
|
|
- viewAndProj[1] = Mat4<float>::identity();
|
|
|
|
|
-
|
|
|
|
|
- D3D12_RESOURCE_BARRIER barrier;
|
|
|
|
|
- ZeroMemory(&barrier, sizeof(barrier));
|
|
|
|
|
- barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
|
|
|
|
- barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
|
|
|
|
|
- barrier.Transition.pResource = this->backBuffer[backBufferIndex];
|
|
|
|
|
- barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
|
|
|
|
|
- barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
|
|
|
|
|
- barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
|
|
|
|
|
|
|
+ CD3DX12_RESOURCE_BARRIER transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(defaultRenderTarget->zResource(),
|
|
|
|
|
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COPY_SOURCE);
|
|
|
|
|
+ directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
|
|
+ transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
|
|
|
|
|
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COPY_DEST);
|
|
|
|
|
+ directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
|
|
+
|
|
|
|
|
+ directCommandQueue->zCommandList()->CopyResource(
|
|
|
|
|
+ backBuffer[backBufferIndex], defaultRenderTarget->zResource());
|
|
|
|
|
+
|
|
|
|
|
+ transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COPY_DEST,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_RENDER_TARGET);
|
|
|
|
|
+ directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
|
|
+
|
|
|
|
|
+ // Indicate that the back buffer will now be used to present.
|
|
|
|
|
+ transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(backBuffer[backBufferIndex],
|
|
|
|
|
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_PRESENT);
|
|
|
|
|
+ directCommandQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
|
|
|
|
|
- // TODO
|
|
|
|
|
- // directCommandQueue->getCommandList()->ResourceBarrier(1, &barrier);
|
|
|
|
|
- copyCommandQueue->execute();
|
|
|
|
|
directCommandQueue->execute();
|
|
directCommandQueue->execute();
|
|
|
|
|
|
|
|
swapChain->Present(0, 0);
|
|
swapChain->Present(0, 0);
|
|
@@ -869,12 +888,10 @@ Texture* DirectX12::createOrGetTexture(
|
|
|
if (b) ret->setImageZ(b);
|
|
if (b) ret->setImageZ(b);
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
- Texture* ret
|
|
|
|
|
- = new DX12Texture(device, copyCommandQueue, directCommandQueue, dir);
|
|
|
|
|
|
|
+ Texture* ret = new DX12Texture(device, directCommandQueue, dir);
|
|
|
if (b) ret->setImageZ(b);
|
|
if (b) ret->setImageZ(b);
|
|
|
texturRegister->addTexture(dynamic_cast<Texture*>(ret->getThis()), name);
|
|
texturRegister->addTexture(dynamic_cast<Texture*>(ret->getThis()), name);
|
|
|
ret->updateTextur();
|
|
ret->updateTextur();
|
|
|
- copyCommandQueue->execute();
|
|
|
|
|
directCommandQueue->execute();
|
|
directCommandQueue->execute();
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
@@ -896,6 +913,20 @@ void Framework::DirectX12::setPipeline(DX12Pipeline* pipeline)
|
|
|
this->pipeline->release();
|
|
this->pipeline->release();
|
|
|
}
|
|
}
|
|
|
this->pipeline = pipeline;
|
|
this->pipeline = pipeline;
|
|
|
|
|
+ if (pipeline)
|
|
|
|
|
+ {
|
|
|
|
|
+ initializePipeline();
|
|
|
|
|
+ if (!globalDescriptorHeap
|
|
|
|
|
+ || globalDescriptorHeap->zPipeline() != pipeline)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (globalDescriptorHeap)
|
|
|
|
|
+ {
|
|
|
|
|
+ globalDescriptorHeap->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ globalDescriptorHeap = pipeline->createGlobalDescriptorHeap();
|
|
|
|
|
+ initializeGlobalDescriptorHeap();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool DirectX12::isAvailable()
|
|
bool DirectX12::isAvailable()
|