/* * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/test/common/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 const auto &arg = kernel.getKernelInfo().getArgDescriptorAt(indexArg); if (arg.is() && isValidOffset(arg.as().stateless)) { return ptrOffset(pCrossThreadData, arg.as().stateless); } return nullptr; } } // namespace NEO