| 40 | } // namespace |
| 41 | |
| 42 | PrefixSum::PrefixSum(ref<Device> pDevice) : mpDevice(pDevice) |
| 43 | { |
| 44 | // Create shaders and state. |
| 45 | DefineList defines = {{"GROUP_SIZE", std::to_string(kGroupSize)}}; |
| 46 | mpPrefixSumGroupProgram = Program::createCompute(mpDevice, kShaderFile, "groupScan", defines); |
| 47 | mpPrefixSumGroupVars = ProgramVars::create(mpDevice, mpPrefixSumGroupProgram.get()); |
| 48 | mpPrefixSumFinalizeProgram = Program::createCompute(mpDevice, kShaderFile, "finalizeGroups", defines); |
| 49 | mpPrefixSumFinalizeVars = ProgramVars::create(mpDevice, mpPrefixSumFinalizeProgram.get()); |
| 50 | |
| 51 | mpComputeState = ComputeState::create(mpDevice); |
| 52 | |
| 53 | // Create and bind buffer for per-group sums and total sum. |
| 54 | mpPrefixGroupSums = mpDevice->createBuffer( |
| 55 | kGroupSize * sizeof(uint32_t), |
| 56 | ResourceBindFlags::ShaderResource | ResourceBindFlags::UnorderedAccess, |
| 57 | MemoryType::DeviceLocal, |
| 58 | nullptr |
| 59 | ); |
| 60 | mpTotalSum = mpDevice->createBuffer(sizeof(uint32_t), ResourceBindFlags::UnorderedAccess, MemoryType::DeviceLocal, nullptr); |
| 61 | mpPrevTotalSum = mpDevice->createBuffer(sizeof(uint32_t), ResourceBindFlags::ShaderResource, MemoryType::DeviceLocal, nullptr); |
| 62 | |
| 63 | { |
| 64 | auto var = mpPrefixSumGroupVars->getRootVar(); |
| 65 | var["gPrefixGroupSums"] = mpPrefixGroupSums; |
| 66 | var["gTotalSum"] = mpTotalSum; |
| 67 | var["gPrevTotalSum"] = mpPrevTotalSum; |
| 68 | } |
| 69 | { |
| 70 | auto var = mpPrefixSumFinalizeVars->getRootVar(); |
| 71 | var["gPrefixGroupSums"] = mpPrefixGroupSums; |
| 72 | var["gTotalSum"] = mpTotalSum; |
| 73 | var["gPrevTotalSum"] = mpPrevTotalSum; |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | void PrefixSum::execute( |
| 78 | RenderContext* pRenderContext, |
nothing calls this directly
no test coverage detected