Skip to content

Commit 84b6352

Browse files
committed
D3D12MeshletCull
1 parent 8972962 commit 84b6352

File tree

4 files changed

+42
-20
lines changed

4 files changed

+42
-20
lines changed

Samples/Desktop/D3D12MeshShaders/src/MeshletCull/CullDataVisualizer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,14 @@ void CullDataVisualizer::CreateDeviceResources(ID3D12Device2* device, DXGI_FORMA
114114
ThrowIfFailed(device->CreatePipelineState(&streamDesc, IID_PPV_ARGS(&m_boundingSpherePso)));
115115
}
116116

117+
const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD);
118+
const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2);
119+
117120
// Create shared constant buffer
118121
ThrowIfFailed(device->CreateCommittedResource(
119-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
122+
&constantBufferHeapProps,
120123
D3D12_HEAP_FLAG_NONE,
121-
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2),
124+
&constantBufferDesc,
122125
D3D12_RESOURCE_STATE_GENERIC_READ,
123126
nullptr,
124127
IID_PPV_ARGS(&m_constantResource)

Samples/Desktop/D3D12MeshShaders/src/MeshletCull/D3D12MeshletCull.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,13 @@ void D3D12MeshletCull::LoadPipeline()
311311
depthOptimizedClearValue.DepthStencil.Depth = 1.0f;
312312
depthOptimizedClearValue.DepthStencil.Stencil = 0;
313313

314+
const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT);
315+
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);
316+
314317
ThrowIfFailed(m_device->CreateCommittedResource(
315-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
318+
&depthStencilHeapProps,
316319
D3D12_HEAP_FLAG_NONE,
317-
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
320+
&depthStencilTextureDesc,
318321
D3D12_RESOURCE_STATE_DEPTH_WRITE,
319322
&depthOptimizedClearValue,
320323
IID_PPV_ARGS(&m_depthStencil)
@@ -329,10 +332,13 @@ void D3D12MeshletCull::LoadPipeline()
329332
{
330333
const UINT64 constantBufferSize = sizeof(Constants) * FrameCount;
331334

335+
const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD);
336+
const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize);
337+
332338
ThrowIfFailed(m_device->CreateCommittedResource(
333-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
339+
&constantBufferHeapProps,
334340
D3D12_HEAP_FLAG_NONE,
335-
&CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize),
341+
&constantBufferDesc,
336342
D3D12_RESOURCE_STATE_GENERIC_READ,
337343
nullptr,
338344
IID_PPV_ARGS(&m_constantBuffer)));
@@ -426,12 +432,15 @@ void D3D12MeshletCull::LoadAssets()
426432
// For per-frame uploads consider using the D3D12_COMMAND_LIST_TYPE_COPY command queue.
427433
obj.Model.LoadFromFile(c_modelFilenames[def.ModelIndex]);
428434
obj.Model.UploadGpuResources(m_device.Get(), m_commandQueue.Get(), m_commandAllocators[m_frameIndex].Get(), m_commandList.Get());
429-
435+
436+
const CD3DX12_HEAP_PROPERTIES instanceBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD);
437+
const CD3DX12_RESOURCE_DESC instanceBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Instance) * 2);
438+
430439
// Create the per-object instance data buffer
431440
ThrowIfFailed(m_device->CreateCommittedResource(
432-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
441+
&instanceBufferHeapProps,
433442
D3D12_HEAP_FLAG_NONE,
434-
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(Instance) * 2),
443+
&instanceBufferDesc,
435444
D3D12_RESOURCE_STATE_GENERIC_READ,
436445
nullptr,
437446
IID_PPV_ARGS(&obj.InstanceResource)
@@ -657,7 +666,8 @@ void D3D12MeshletCull::PopulateCommandList()
657666
m_commandList->RSSetScissorRects(1, &m_scissorRect);
658667

659668
// Indicate that the back buffer will be used as a render target.
660-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
669+
const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
670+
m_commandList->ResourceBarrier(1, &toRenderTargetBarrier);
661671

662672
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
663673
CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
@@ -712,7 +722,8 @@ void D3D12MeshletCull::PopulateCommandList()
712722
}
713723

714724
// Indicate that the back buffer will now be used to present.
715-
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
725+
const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
726+
m_commandList->ResourceBarrier(1, &toPresentBarrier);
716727

717728
ThrowIfFailed(m_commandList->Close());
718729
}

Samples/Desktop/D3D12MeshShaders/src/MeshletCull/FrustumVisualizer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,14 @@ void FrustumVisualizer::CreateDeviceResources(ID3D12Device2* device, DXGI_FORMAT
7272
// Create the MS PSO
7373
ThrowIfFailed(device->CreatePipelineState(&streamDesc, IID_PPV_ARGS(&m_pso)));
7474

75+
const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD);
76+
const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2);
77+
7578
// Create the constant buffer
7679
ThrowIfFailed(device->CreateCommittedResource(
77-
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
80+
&constantBufferHeapProps,
7881
D3D12_HEAP_FLAG_NONE,
79-
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2),
82+
&constantBufferDesc,
8083
D3D12_RESOURCE_STATE_GENERIC_READ,
8184
nullptr,
8285
IID_PPV_ARGS(&m_constantResource)

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,26 +452,31 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ
452452
for (uint32_t j = 0; j < m.Vertices.size(); ++j)
453453
{
454454
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));
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)