Skip to content

Commit e9cdfdf

Browse files
committed
D3D12MeshletInstancing
1 parent 84b6352 commit e9cdfdf

File tree

2 files changed

+40
-20
lines changed

2 files changed

+40
-20
lines changed

Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/D3D12MeshletInstancing.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,13 @@ void D3D12MeshletInstancing::LoadPipeline()
211211
depthOptimizedClearValue.DepthStencil.Depth = 1.0f;
212212
depthOptimizedClearValue.DepthStencil.Stencil = 0;
213213

214+
const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT);
215+
const CD3DX12_RESOURCE_DESC depthStencilTextureDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL);
216+
214217
ThrowIfFailed(m_device->CreateCommittedResource(
215-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
218+
&depthStencilHeapProps,
216219
D3D12_HEAP_FLAG_NONE,
217-
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
220+
&depthStencilTextureDesc,
218221
D3D12_RESOURCE_STATE_DEPTH_WRITE,
219222
&depthOptimizedClearValue,
220223
IID_PPV_ARGS(&m_depthStencil)
@@ -229,10 +232,13 @@ void D3D12MeshletInstancing::LoadPipeline()
229232
{
230233
const UINT64 constantBufferSize = sizeof(SceneConstantBuffer) * FrameCount;
231234

235+
const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD);
236+
const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize);
237+
232238
ThrowIfFailed(m_device->CreateCommittedResource(
233-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
239+
&constantBufferHeapProps,
234240
D3D12_HEAP_FLAG_NONE,
235-
&CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize),
241+
&constantBufferDesc,
236242
D3D12_RESOURCE_STATE_GENERIC_READ,
237243
nullptr,
238244
IID_PPV_ARGS(&m_constantBuffer)));
@@ -432,9 +438,11 @@ void D3D12MeshletInstancing::PopulateCommandList()
432438
// Only upload instance data if we've had a change
433439
if (m_updateInstances)
434440
{
435-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST));
441+
const auto toCopyBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST);
442+
m_commandList->ResourceBarrier(1, &toCopyBarrier);
436443
m_commandList->CopyResource(m_instanceBuffer.Get(), m_instanceUpload.Get());
437-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
444+
const auto toGenericBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ);
445+
m_commandList->ResourceBarrier(1, &toGenericBarrier);
438446

439447
m_updateInstances = false;
440448
}
@@ -445,7 +453,8 @@ void D3D12MeshletInstancing::PopulateCommandList()
445453
m_commandList->RSSetScissorRects(1, &m_scissorRect);
446454

447455
// Indicate that the back buffer will be used as a render target.
448-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
456+
const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
457+
m_commandList->ResourceBarrier(1, &toRenderTargetBarrier);
449458

450459
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
451460
CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
@@ -494,7 +503,8 @@ void D3D12MeshletInstancing::PopulateCommandList()
494503
}
495504

496505
// Indicate that the back buffer will now be used to present.
497-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
506+
const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
507+
m_commandList->ResourceBarrier(1, &toPresentBarrier);
498508

499509
ThrowIfFailed(m_commandList->Close());
500510
}
@@ -555,21 +565,26 @@ void D3D12MeshletInstancing::RegenerateInstances()
555565
{
556566
WaitForGpu();
557567

568+
const CD3DX12_HEAP_PROPERTIES instanceBufferDefaultHeapProps(D3D12_HEAP_TYPE_DEFAULT);
569+
const CD3DX12_RESOURCE_DESC instanceBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize);
570+
558571
// Create/re-create the instance buffer
559572
ThrowIfFailed(m_device->CreateCommittedResource(
560-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
573+
&instanceBufferDefaultHeapProps,
561574
D3D12_HEAP_FLAG_NONE,
562-
&CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize),
575+
&instanceBufferDesc,
563576
D3D12_RESOURCE_STATE_GENERIC_READ,
564577
nullptr,
565578
IID_PPV_ARGS(&m_instanceBuffer)
566579
));
567580

581+
const CD3DX12_HEAP_PROPERTIES instanceBufferUploadHeapProps(D3D12_HEAP_TYPE_UPLOAD);
582+
568583
// Create/re-create the instance buffer
569584
ThrowIfFailed(m_device->CreateCommittedResource(
570-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
585+
&instanceBufferUploadHeapProps,
571586
D3D12_HEAP_FLAG_NONE,
572-
&CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize),
587+
&instanceBufferDesc,
573588
D3D12_RESOURCE_STATE_GENERIC_READ,
574589
nullptr,
575590
IID_PPV_ARGS(&m_instanceUpload)

Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/Model.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -451,27 +451,32 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ
451451

452452
for (uint32_t j = 0; j < m.Vertices.size(); ++j)
453453
{
454-
cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get());
455-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
454+
cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get());
455+
const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
456+
cmdList->ResourceBarrier(1, &barrier);
456457
}
457458

459+
D3D12_RESOURCE_BARRIER postCopyBarriers[6];
460+
458461
cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get());
459-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
462+
postCopyBarriers[0] = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
460463

461464
cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get());
462-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
465+
postCopyBarriers[1] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
463466

464467
cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get());
465-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
468+
postCopyBarriers[2] = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
466469

467470
cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get());
468-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
471+
postCopyBarriers[3] = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
469472

470473
cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get());
471-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
474+
postCopyBarriers[4] = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
472475

473476
cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get());
474-
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));
477+
postCopyBarriers[5] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
478+
479+
cmdList->ResourceBarrier(ARRAYSIZE(postCopyBarriers), postCopyBarriers);
475480

476481
ThrowIfFailed(cmdList->Close());
477482

0 commit comments

Comments
 (0)