/* * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/test/unit_test/cmd_parse/hw_parse.h" namespace NEO { template void HardwareParse::findHardwareCommands(IndirectHeap *dsh) { using GPGPU_WALKER = typename FamilyType::GPGPU_WALKER; using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT; using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; using MEDIA_INTERFACE_DESCRIPTOR_LOAD = typename FamilyType::MEDIA_INTERFACE_DESCRIPTOR_LOAD; using MEDIA_VFE_STATE = typename FamilyType::MEDIA_VFE_STATE; using INTERFACE_DESCRIPTOR_DATA = typename FamilyType::INTERFACE_DESCRIPTOR_DATA; using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START; using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; itorWalker = find(cmdList.begin(), cmdList.end()); if (itorWalker != cmdList.end()) { cmdWalker = *itorWalker; } itorBBStartAfterWalker = find(itorWalker, cmdList.end()); if (itorBBStartAfterWalker != cmdList.end()) { cmdBBStartAfterWalker = *itorBBStartAfterWalker; } for (auto it = cmdList.begin(); it != cmdList.end(); it++) { auto lri = genCmdCast(*it); if (lri) { lriList.push_back(*it); } } if (parsePipeControl) { for (auto it = cmdList.begin(); it != cmdList.end(); it++) { auto pipeControl = genCmdCast(*it); if (pipeControl) { pipeControlList.push_back(*it); } } } MEDIA_INTERFACE_DESCRIPTOR_LOAD *cmdMIDL = nullptr; itorMediaInterfaceDescriptorLoad = find(cmdList.begin(), itorWalker); if (itorMediaInterfaceDescriptorLoad != itorWalker) { cmdMIDL = (MEDIA_INTERFACE_DESCRIPTOR_LOAD *)*itorMediaInterfaceDescriptorLoad; cmdMediaInterfaceDescriptorLoad = *itorMediaInterfaceDescriptorLoad; } itorPipelineSelect = find(cmdList.begin(), itorWalker); if (itorPipelineSelect != itorWalker) { cmdPipelineSelect = *itorPipelineSelect; } itorMediaVfeState = find(itorPipelineSelect, itorWalker); if (itorMediaVfeState != itorWalker) { cmdMediaVfeState = *itorMediaVfeState; } STATE_BASE_ADDRESS *cmdSBA = nullptr; uint64_t dynamicStateHeap = 0; itorStateBaseAddress = find(cmdList.begin(), itorWalker); if (itorStateBaseAddress != itorWalker) { cmdSBA = (STATE_BASE_ADDRESS *)*itorStateBaseAddress; cmdStateBaseAddress = *itorStateBaseAddress; // Extract the dynamicStateHeap dynamicStateHeap = cmdSBA->getDynamicStateBaseAddress(); if (dsh && (dsh->getHeapGpuBase() == dynamicStateHeap)) { dynamicStateHeap = reinterpret_cast(dsh->getCpuBase()); } ASSERT_NE(0u, dynamicStateHeap); } // interfaceDescriptorData should be located within dynamicStateHeap if (cmdMIDL && cmdSBA) { auto iddStart = cmdMIDL->getInterfaceDescriptorDataStartAddress(); auto iddEnd = iddStart + cmdMIDL->getInterfaceDescriptorTotalLength(); ASSERT_LE(iddEnd, cmdSBA->getDynamicStateBufferSize() * MemoryConstants::pageSize); // Extract the interfaceDescriptorData cmdInterfaceDescriptorData = (INTERFACE_DESCRIPTOR_DATA *)(dynamicStateHeap + iddStart); } } template void HardwareParse::findHardwareCommands() { findHardwareCommands(nullptr); } template const void *HardwareParse::getStatelessArgumentPointer(const Kernel &kernel, uint32_t indexArg, IndirectHeap &ioh, uint32_t rootDeviceIndex) { typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER; typedef typename FamilyType::STATE_BASE_ADDRESS STATE_BASE_ADDRESS; auto cmdWalker = (GPGPU_WALKER *)this->cmdWalker; EXPECT_NE(nullptr, cmdWalker); auto cmdSBA = (STATE_BASE_ADDRESS *)cmdStateBaseAddress; EXPECT_NE(nullptr, cmdSBA); auto offsetCrossThreadData = cmdWalker->getIndirectDataStartAddress(); EXPECT_LT(offsetCrossThreadData, cmdSBA->getIndirectObjectBufferSize() * MemoryConstants::pageSize); offsetCrossThreadData -= static_cast(ioh.getGraphicsAllocation()->getGpuAddressToPatch()); // Get the base of cross thread auto pCrossThreadData = ptrOffset( reinterpret_cast(ioh.getCpuBase()), offsetCrossThreadData); // Determine where the argument is auto &patchInfo = kernel.getKernelInfo(rootDeviceIndex).patchInfo; for (auto &arg : patchInfo.statelessGlobalMemObjKernelArgs) { if (arg->ArgumentNumber == indexArg) { return ptrOffset(pCrossThreadData, arg->DataParamOffset); } } return nullptr; } } // namespace NEO