示例#1
0
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;
     }
 }