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)); }
RearrangeElementsPass::RearrangeElementsPass(ID3D12Device *pDevice, UINT nodeMask) { CD3DX12_ROOT_PARAMETER1 parameters[NumParameters]; parameters[InputElements].InitAsUnorderedAccessView(InputElementBufferRegister); parameters[InputMetadata].InitAsUnorderedAccessView(InputMetadataBufferRegister); parameters[IndexBuffer].InitAsUnorderedAccessView(IndexBufferRegister); parameters[OutputElements].InitAsUnorderedAccessView(OutputElementBufferRegister); parameters[OutputMetadata].InitAsUnorderedAccessView(OutputMetadataBufferRegister); parameters[OutputIndexBuffer].InitAsUnorderedAccessView(OutputIndexBufferRegister); parameters[InputRootConstants].InitAsConstants(SizeOfInUint32(InputConstants), InputConstantsRegister); auto rootSignatureDesc = CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(ARRAYSIZE(parameters), parameters); CreateRootSignatureHelper(pDevice, rootSignatureDesc, &m_pRootSignature); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pRearrangeTriangles), &m_pRearrangeTrianglesPSO); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pRearrangeBVHs), &m_pRearrangeBVHsPSO); }
LoadInstancesPass::LoadInstancesPass(ID3D12Device *pDevice, UINT nodeMask) { D3D12_DESCRIPTOR_RANGE1 globalDescriptorHeapRange[2]; globalDescriptorHeapRange[0] = CD3DX12_DESCRIPTOR_RANGE1(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, (UINT)-1, DescriptorHeapBufferRegister, DescriptorHeapBufferRegisterSpace, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE | D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE, 0); globalDescriptorHeapRange[1] = CD3DX12_DESCRIPTOR_RANGE1(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, (UINT)-1, DescriptorHeapSRVBufferRegister, DescriptorHeapSRVBufferRegisterSpace, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE | D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE, 0); CD3DX12_ROOT_PARAMETER1 parameters[RootParameterSlot::NumRootParameters]; parameters[OutputBVHRootUAV].InitAsUnorderedAccessView(OutputBVHRegister); parameters[InstanceDescsSRV].InitAsShaderResourceView(InstanceDescsRegister); parameters[GlobalDescriptorHeap].InitAsDescriptorTable(ARRAYSIZE(globalDescriptorHeapRange), globalDescriptorHeapRange); parameters[CachedSortBuffer].InitAsUnorderedAccessView(CachedSortBufferRegister); parameters[Constants].InitAsConstants(SizeOfInUint32(LoadInstancesConstants), LoadInstancesConstantsRegister); auto rootSignatureDesc = CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(ARRAYSIZE(parameters), parameters); CreateRootSignatureHelper(pDevice, rootSignatureDesc, &m_pRootSignature); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pTopLevelLoadAABBsFromArrayOfPointers), &m_pLoadAABBsFromArrayOfPointersPSO); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pTopLevelLoadAABBsFromArrayOfInstances), &m_pLoadAABBsFromArrayOfInstancesPSO); }
ConstructAABBPass::ConstructAABBPass(ID3D12Device *pDevice, UINT nodeMask) { D3D12_DESCRIPTOR_RANGE1 globalDescriptorHeapRange = CD3DX12_DESCRIPTOR_RANGE1(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, (UINT)-1, GlobalDescriptorHeapRegister, GlobalDescriptorHeapRegisterSpace, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE | D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE, 0); CD3DX12_ROOT_PARAMETER1 rootParameters[NumRootParameters]; rootParameters[OutputBVHRootUAVParam].InitAsUnorderedAccessView(OutputBVHRegister); rootParameters[ScratchUAVParam].InitAsUnorderedAccessView(ScratchBufferRegister); rootParameters[HierarchyUAVParam].InitAsUnorderedAccessView(HierarchyBufferRegister); rootParameters[AABBParentBufferParam].InitAsUnorderedAccessView(AABBParentBufferRegister); rootParameters[ChildNodesProcessedCountBufferParam].InitAsUnorderedAccessView(ChildNodesProcessedBufferRegister); rootParameters[InputRootConstants].InitAsConstants(SizeOfInUint32(InputConstants), InputConstantsRegister); rootParameters[GlobalDescriptorHeap].InitAsDescriptorTable(1, &globalDescriptorHeapRange); auto rootSignatureDesc = CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(ARRAYSIZE(rootParameters), rootParameters); CreateRootSignatureHelper(pDevice, rootSignatureDesc, &m_pRootSignature); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pTopLevelComputeAABBs), &m_pComputeAABBs[Level::Top]); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pTopLevelPrepareForComputeAABBs), &m_pPrepareForComputeAABBs[Level::Top]); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBottomLevelComputeAABBs), &m_pComputeAABBs[Level::Bottom]); CreatePSOHelper(pDevice, nodeMask, m_pRootSignature, COMPILED_SHADER(g_pBottomLevelPrepareForComputeAABBs), &m_pPrepareForComputeAABBs[Level::Bottom]); }