BitonicSort::BitonicSort(ID3D12Device *pDevice, UINT nodeMask) { auto defaultHeapProperties = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT); auto indirectArgBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(cIndirectArgStride * 22 * 23 / 2, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS); ThrowInternalFailure(pDevice->CreateCommittedResource( &defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &indirectArgBufferDesc, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT, nullptr, IID_PPV_ARGS(&m_pDispatchArgs))); CD3DX12_ROOT_PARAMETER1 parameters[NumParameters]; parameters[ShaderSpecificConstants].InitAsConstants(2, 0); parameters[OutputUAV].InitAsUnorderedAccessView(0); parameters[IndexBufferUAV].InitAsUnorderedAccessView(1); parameters[GenericConstants].InitAsConstants(2, 1); auto rootSignatureDesc = CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(ARRAYSIZE(parameters), parameters); CreateRootSignatureHelper(pDevice, rootSignatureDesc, &m_pRootSignature); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBitonicIndirectArgsCS),&m_pBitonicIndirectArgsCS); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBitonicInnerSortCS), &m_pBitonicInnerSortCS); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBitonicOuterSortCS), &m_pBitonicOuterSortCS); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBitonicPreSortCS), &m_pBitonicPreSortCS); D3D12_INDIRECT_ARGUMENT_DESC indirectArgDesc = {}; indirectArgDesc.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH; D3D12_COMMAND_SIGNATURE_DESC commandSignatureDesc; commandSignatureDesc.NodeMask = nodeMask; commandSignatureDesc.pArgumentDescs = &indirectArgDesc; commandSignatureDesc.ByteStride = sizeof(D3D12_DISPATCH_ARGUMENTS); commandSignatureDesc.NumArgumentDescs = 1; pDevice->CreateCommandSignature(&commandSignatureDesc, nullptr, IID_PPV_ARGS(&m_pCommandSignature)); }
IAccelerationStructureBuilder *AccelerationStructureBuilderFactory::CreateBuilder(BuilderType type) { switch (type) { case GpuBvh2BuilderType: { D3D12_FEATURE_DATA_D3D12_OPTIONS1 waveData; ThrowInternalFailure(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS1, &waveData, sizeof(waveData))); return new GpuBvh2Builder(m_pDevice, waveData.TotalLaneCount, m_nodeMask); } default: return nullptr; } }