2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2022-01-11 02:55:21 +08:00
|
|
|
* Copyright (C) 2018-2022 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/device/device.h"
|
|
|
|
#include "shared/source/helpers/string.h"
|
|
|
|
#include "shared/source/kernel/grf_config.h"
|
2021-01-21 20:10:13 +08:00
|
|
|
#include "shared/test/common/mocks/mock_graphics_allocation.h"
|
2021-12-21 19:53:21 +08:00
|
|
|
#include "shared/test/common/mocks/mock_kernel_info.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-03-20 18:15:25 +08:00
|
|
|
#include "opencl/source/cl_device/cl_device.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/kernel/kernel.h"
|
2020-12-22 08:03:25 +08:00
|
|
|
#include "opencl/source/kernel/kernel_objects_for_aux_translation.h"
|
2021-03-09 18:30:21 +08:00
|
|
|
#include "opencl/source/kernel/multi_device_kernel.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/platform/platform.h"
|
2020-12-22 08:03:25 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_buffer.h"
|
2020-02-23 22:20:22 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_context.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_program.h"
|
2020-02-22 16:28:27 +08:00
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
#include <cassert>
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2021-04-08 17:05:45 +08:00
|
|
|
using namespace iOpenCL;
|
|
|
|
|
2020-11-19 19:30:44 +08:00
|
|
|
void populateKernelDescriptor(KernelDescriptor &dst, const SPatchExecutionEnvironment &execEnv);
|
2020-12-22 08:03:25 +08:00
|
|
|
|
|
|
|
struct MockKernelObjForAuxTranslation : public KernelObjForAuxTranslation {
|
|
|
|
MockKernelObjForAuxTranslation(Type type) : KernelObjForAuxTranslation(type, nullptr) {
|
|
|
|
if (type == KernelObjForAuxTranslation::Type::MEM_OBJ) {
|
|
|
|
mockBuffer.reset(new MockBuffer);
|
|
|
|
this->object = mockBuffer.get();
|
|
|
|
} else {
|
|
|
|
DEBUG_BREAK_IF(type != KernelObjForAuxTranslation::Type::GFX_ALLOC);
|
|
|
|
mockGraphicsAllocation.reset(new MockGraphicsAllocation(nullptr, 0x100));
|
|
|
|
this->object = mockGraphicsAllocation.get();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
MockKernelObjForAuxTranslation(Type type, size_t size) : MockKernelObjForAuxTranslation(type) {
|
|
|
|
if (type == KernelObjForAuxTranslation::Type::MEM_OBJ) {
|
|
|
|
mockBuffer->getGraphicsAllocation(0)->setSize(size);
|
|
|
|
} else {
|
|
|
|
DEBUG_BREAK_IF(type != KernelObjForAuxTranslation::Type::GFX_ALLOC);
|
|
|
|
mockGraphicsAllocation->setSize(size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::unique_ptr<MockBuffer> mockBuffer = nullptr;
|
|
|
|
std::unique_ptr<MockGraphicsAllocation> mockGraphicsAllocation = nullptr;
|
|
|
|
};
|
|
|
|
|
2021-03-09 18:30:21 +08:00
|
|
|
class MockMultiDeviceKernel : public MultiDeviceKernel {
|
|
|
|
public:
|
2021-03-16 19:32:40 +08:00
|
|
|
static KernelVectorType toKernelVector(Kernel *pKernel) {
|
|
|
|
KernelVectorType kernelVector;
|
|
|
|
kernelVector.resize(pKernel->getProgram()->getMaxRootDeviceIndex() + 1);
|
|
|
|
kernelVector[pKernel->getProgram()->getDevices()[0]->getRootDeviceIndex()] = pKernel;
|
|
|
|
return kernelVector;
|
|
|
|
}
|
2021-03-09 18:30:21 +08:00
|
|
|
using MultiDeviceKernel::MultiDeviceKernel;
|
2021-03-16 19:32:40 +08:00
|
|
|
template <typename kernel_t = Kernel>
|
|
|
|
static MockMultiDeviceKernel *create(Program *programArg, const KernelInfoContainer &kernelInfoArg) {
|
|
|
|
KernelVectorType kernelVector;
|
|
|
|
kernelVector.resize(programArg->getMaxRootDeviceIndex() + 1);
|
|
|
|
for (auto &pDevice : programArg->getDevices()) {
|
|
|
|
auto rootDeviceIndex = pDevice->getRootDeviceIndex();
|
|
|
|
if (kernelVector[rootDeviceIndex]) {
|
|
|
|
continue;
|
|
|
|
}
|
2021-03-22 23:26:03 +08:00
|
|
|
kernelVector[rootDeviceIndex] = new kernel_t(programArg, *kernelInfoArg[rootDeviceIndex], *pDevice);
|
2021-03-16 19:32:40 +08:00
|
|
|
}
|
2021-03-22 23:26:03 +08:00
|
|
|
return new MockMultiDeviceKernel(std::move(kernelVector), kernelInfoArg);
|
2021-03-16 19:32:40 +08:00
|
|
|
}
|
2021-03-09 18:30:21 +08:00
|
|
|
void takeOwnership() const override {
|
|
|
|
MultiDeviceKernel::takeOwnership();
|
|
|
|
takeOwnershipCalls++;
|
|
|
|
}
|
|
|
|
|
|
|
|
void releaseOwnership() const override {
|
|
|
|
releaseOwnershipCalls++;
|
|
|
|
MultiDeviceKernel::releaseOwnership();
|
|
|
|
}
|
|
|
|
|
|
|
|
mutable uint32_t takeOwnershipCalls = 0;
|
|
|
|
mutable uint32_t releaseOwnershipCalls = 0;
|
|
|
|
};
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Kernel - Core implementation
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class MockKernel : public Kernel {
|
|
|
|
public:
|
2018-12-06 22:33:02 +08:00
|
|
|
using Kernel::addAllocationToCacheFlushVector;
|
2019-03-21 19:51:20 +08:00
|
|
|
using Kernel::allBufferArgsStateful;
|
2022-07-02 02:03:54 +08:00
|
|
|
using Kernel::anyKernelArgumentUsingSystemMemory;
|
2018-08-03 14:14:43 +08:00
|
|
|
using Kernel::auxTranslationRequired;
|
2019-08-26 23:03:13 +08:00
|
|
|
using Kernel::containsStatelessWrites;
|
2021-03-22 19:06:23 +08:00
|
|
|
using Kernel::dataParameterSimdSize;
|
2020-01-22 02:02:36 +08:00
|
|
|
using Kernel::executionType;
|
2021-03-22 17:49:27 +08:00
|
|
|
using Kernel::getDevice;
|
2021-05-27 00:30:42 +08:00
|
|
|
using Kernel::getHardwareInfo;
|
2022-07-02 02:03:54 +08:00
|
|
|
using Kernel::graphicsAllocationTypeUseSystemMemory;
|
2020-12-16 01:13:28 +08:00
|
|
|
using Kernel::hasDirectStatelessAccessToHostMemory;
|
2021-09-17 07:23:37 +08:00
|
|
|
using Kernel::hasDirectStatelessAccessToSharedBuffer;
|
2021-01-08 21:09:32 +08:00
|
|
|
using Kernel::hasIndirectStatelessAccessToHostMemory;
|
2022-05-19 18:06:08 +08:00
|
|
|
using Kernel::isUnifiedMemorySyncRequired;
|
2019-08-30 17:46:12 +08:00
|
|
|
using Kernel::kernelArgHandlers;
|
2021-01-26 19:44:10 +08:00
|
|
|
using Kernel::kernelArgRequiresCacheFlush;
|
2018-08-07 21:09:16 +08:00
|
|
|
using Kernel::kernelArguments;
|
2020-12-04 17:42:34 +08:00
|
|
|
using Kernel::KernelConfig;
|
2021-02-23 18:33:22 +08:00
|
|
|
using Kernel::kernelHasIndirectAccess;
|
2020-12-04 17:42:34 +08:00
|
|
|
using Kernel::kernelSubmissionMap;
|
2019-01-31 21:47:55 +08:00
|
|
|
using Kernel::kernelSvmGfxAllocations;
|
2019-06-14 18:48:40 +08:00
|
|
|
using Kernel::kernelUnifiedMemoryGfxAllocations;
|
2022-10-21 22:16:43 +08:00
|
|
|
using Kernel::localIdsCache;
|
2021-03-22 19:06:23 +08:00
|
|
|
using Kernel::maxKernelWorkGroupSize;
|
|
|
|
using Kernel::maxWorkGroupSizeForCrossThreadData;
|
|
|
|
using Kernel::numberOfBindingTableStates;
|
|
|
|
using Kernel::parentEventOffset;
|
2020-11-19 02:39:32 +08:00
|
|
|
using Kernel::patchBufferOffset;
|
2022-10-28 19:58:31 +08:00
|
|
|
using Kernel::patchPrivateSurface;
|
2020-11-19 02:39:32 +08:00
|
|
|
using Kernel::patchWithImplicitSurface;
|
2021-09-22 21:16:09 +08:00
|
|
|
using Kernel::pImplicitArgs;
|
2021-03-22 19:06:23 +08:00
|
|
|
using Kernel::preferredWkgMultipleOffset;
|
|
|
|
using Kernel::privateSurface;
|
2022-10-06 17:50:38 +08:00
|
|
|
using Kernel::setInlineSamplers;
|
2021-08-04 02:10:53 +08:00
|
|
|
using Kernel::singleSubdevicePreferredInCurrentEnqueue;
|
2018-12-06 22:33:02 +08:00
|
|
|
using Kernel::svmAllocationsRequireCacheFlush;
|
2019-06-14 18:48:40 +08:00
|
|
|
using Kernel::unifiedMemoryControls;
|
2021-03-22 19:06:23 +08:00
|
|
|
|
|
|
|
using Kernel::slmSizes;
|
|
|
|
using Kernel::slmTotalSize;
|
2018-08-03 14:14:43 +08:00
|
|
|
|
2022-01-11 02:55:21 +08:00
|
|
|
MockKernel(Program *programArg, const KernelInfo &kernelInfoArg, ClDevice &clDeviceArg)
|
|
|
|
: Kernel(programArg, kernelInfoArg, clDeviceArg) {
|
2022-10-21 22:16:43 +08:00
|
|
|
initializeLocalIdsCache();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2020-03-13 16:17:01 +08:00
|
|
|
~MockKernel() override {
|
2017-12-21 07:45:38 +08:00
|
|
|
// prevent double deletion
|
2021-03-22 19:06:23 +08:00
|
|
|
if (crossThreadData == mockCrossThreadData.data()) {
|
|
|
|
crossThreadData = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2018-03-19 17:11:30 +08:00
|
|
|
if (kernelInfoAllocated) {
|
|
|
|
delete kernelInfoAllocated;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename KernelType = MockKernel>
|
|
|
|
static KernelType *create(Device &device, Program *program) {
|
2019-02-14 23:20:14 +08:00
|
|
|
return create<KernelType>(device, program, GrfConfig::DefaultGrfNumber);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename KernelType = MockKernel>
|
|
|
|
static KernelType *create(Device &device, Program *program, uint32_t grfNumber) {
|
2021-04-08 17:05:45 +08:00
|
|
|
auto info = new MockKernelInfo();
|
2018-03-19 17:11:30 +08:00
|
|
|
const size_t crossThreadSize = 160;
|
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
info->setLocalIds({0, 0, 0});
|
2020-11-19 19:30:44 +08:00
|
|
|
info->kernelDescriptor.kernelAttributes.numGrfRequired = grfNumber;
|
|
|
|
info->kernelDescriptor.kernelAttributes.simdSize = 32;
|
2018-03-19 17:11:30 +08:00
|
|
|
|
|
|
|
info->crossThreadData = new char[crossThreadSize];
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
auto kernel = new KernelType(program, *info, *device.getSpecializedDevice<ClDevice>());
|
2021-03-22 19:06:23 +08:00
|
|
|
kernel->crossThreadData = new char[crossThreadSize];
|
|
|
|
memset(kernel->crossThreadData, 0, crossThreadSize);
|
|
|
|
kernel->crossThreadDataSize = crossThreadSize;
|
2018-03-19 17:11:30 +08:00
|
|
|
|
|
|
|
kernel->kernelInfoAllocated = info;
|
|
|
|
|
|
|
|
return kernel;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2020-12-03 02:19:05 +08:00
|
|
|
static const KernelInfoContainer toKernelInfoContainer(const KernelInfo &kernelInfo, uint32_t rootDeviceIndex);
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
uint32_t getPatchedArgumentsNum() const { return patchedArgumentsNum; }
|
|
|
|
|
|
|
|
bool isPatched() const override;
|
|
|
|
|
2018-03-27 20:30:05 +08:00
|
|
|
bool canTransformImages() const override;
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2021-03-22 17:49:27 +08:00
|
|
|
void setCrossThreadData(const void *crossThreadDataPattern, uint32_t newCrossThreadDataSize) {
|
2021-03-22 19:06:23 +08:00
|
|
|
if ((crossThreadData != nullptr) && (crossThreadData != mockCrossThreadData.data())) {
|
|
|
|
delete[] crossThreadData;
|
|
|
|
crossThreadData = nullptr;
|
|
|
|
crossThreadDataSize = 0;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
if (crossThreadDataPattern && (newCrossThreadDataSize > 0)) {
|
2021-03-22 17:49:27 +08:00
|
|
|
mockCrossThreadData.clear();
|
|
|
|
mockCrossThreadData.insert(mockCrossThreadData.begin(), (char *)crossThreadDataPattern, ((char *)crossThreadDataPattern) + newCrossThreadDataSize);
|
2017-12-21 07:45:38 +08:00
|
|
|
} else {
|
2021-03-22 17:49:27 +08:00
|
|
|
mockCrossThreadData.resize(newCrossThreadDataSize, 0);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (newCrossThreadDataSize == 0) {
|
2021-03-22 19:06:23 +08:00
|
|
|
crossThreadData = nullptr;
|
|
|
|
crossThreadDataSize = 0;
|
2017-12-21 07:45:38 +08:00
|
|
|
return;
|
|
|
|
}
|
2021-03-22 19:06:23 +08:00
|
|
|
crossThreadData = mockCrossThreadData.data();
|
|
|
|
crossThreadDataSize = static_cast<uint32_t>(mockCrossThreadData.size());
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2021-03-22 19:06:23 +08:00
|
|
|
void setSshLocal(const void *sshPattern, uint32_t newSshSize) {
|
|
|
|
sshLocalSize = newSshSize;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
if (newSshSize == 0) {
|
2021-03-22 19:06:23 +08:00
|
|
|
pSshLocal.reset(nullptr);
|
2018-08-03 14:14:43 +08:00
|
|
|
} else {
|
2021-03-22 19:06:23 +08:00
|
|
|
pSshLocal = std::make_unique<char[]>(newSshSize);
|
2018-08-03 14:14:43 +08:00
|
|
|
if (sshPattern) {
|
2021-03-22 19:06:23 +08:00
|
|
|
memcpy_s(pSshLocal.get(), newSshSize, sshPattern, newSshSize);
|
2018-08-03 14:14:43 +08:00
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void setPrivateSurface(GraphicsAllocation *gfxAllocation, uint32_t size) {
|
2021-03-22 19:06:23 +08:00
|
|
|
privateSurface = gfxAllocation;
|
|
|
|
privateSurfaceSize = size;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2021-03-22 19:06:23 +08:00
|
|
|
void setTotalSLMSize(uint32_t size) {
|
|
|
|
slmTotalSize = size;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void setKernelArguments(std::vector<SimpleKernelArgInfo> kernelArguments) {
|
|
|
|
this->kernelArguments = kernelArguments;
|
|
|
|
}
|
|
|
|
|
2018-03-21 19:58:30 +08:00
|
|
|
KernelInfo *getAllocatedKernelInfo() {
|
|
|
|
return kernelInfoAllocated;
|
|
|
|
}
|
|
|
|
|
2021-03-22 17:49:27 +08:00
|
|
|
std::vector<char> mockCrossThreadData;
|
2017-12-21 07:45:38 +08:00
|
|
|
std::vector<char> mockSshLocal;
|
|
|
|
|
2018-02-12 17:06:21 +08:00
|
|
|
void setUsingSharedArgs(bool usingSharedArgValue) { this->usingSharedObjArgs = usingSharedArgValue; }
|
2018-02-16 16:15:36 +08:00
|
|
|
|
|
|
|
void makeResident(CommandStreamReceiver &commandStreamReceiver) override;
|
2021-03-22 19:06:23 +08:00
|
|
|
void getResidency(std::vector<Surface *> &dst) override;
|
2018-02-16 16:15:36 +08:00
|
|
|
|
2022-08-31 21:26:29 +08:00
|
|
|
void setSystolicPipelineSelectMode(bool value) { systolicPipelineSelectMode = value; }
|
2018-11-14 15:40:37 +08:00
|
|
|
|
2019-02-21 23:59:10 +08:00
|
|
|
bool requiresCacheFlushCommand(const CommandQueue &commandQueue) const override;
|
|
|
|
|
2022-02-25 22:28:18 +08:00
|
|
|
cl_int setArgSvmAlloc(uint32_t argIndex, void *svmPtr, GraphicsAllocation *svmAlloc, uint32_t allocId) override;
|
|
|
|
|
2018-02-16 16:15:36 +08:00
|
|
|
uint32_t makeResidentCalls = 0;
|
|
|
|
uint32_t getResidencyCalls = 0;
|
2022-02-25 22:28:18 +08:00
|
|
|
uint32_t setArgSvmAllocCalls = 0;
|
2022-05-19 18:06:08 +08:00
|
|
|
uint32_t moveArgsToGpuDomainCalls = 0;
|
2018-03-19 17:11:30 +08:00
|
|
|
|
2018-03-27 20:30:05 +08:00
|
|
|
bool canKernelTransformImages = true;
|
2019-11-08 01:49:46 +08:00
|
|
|
bool isPatchedOverride = true;
|
2018-03-27 20:30:05 +08:00
|
|
|
|
2018-03-19 17:11:30 +08:00
|
|
|
protected:
|
|
|
|
KernelInfo *kernelInfoAllocated = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
};
|
|
|
|
|
2022-10-06 17:50:38 +08:00
|
|
|
// class below have enough internals to service Enqueue operation.
|
2017-12-21 07:45:38 +08:00
|
|
|
class MockKernelWithInternals {
|
|
|
|
public:
|
2020-12-17 17:54:45 +08:00
|
|
|
MockKernelWithInternals(const ClDeviceVector &deviceVector, Context *context = nullptr, bool addDefaultArg = false, SPatchExecutionEnvironment execEnv = {}) {
|
2017-12-21 07:45:38 +08:00
|
|
|
memset(&kernelHeader, 0, sizeof(SKernelBinaryHeaderCommon));
|
Remove PatchTokens from KernelInfo
Use KernelDescriptor instead of patchTokens stored in KernelInfo's
patchInfo.
Removed: SPatchMediaInterfaceDescriptorLoad, SPatchAllocateLocalSurface,
SPatchMediaVFEState(slot 0), SPatchMediaVFEState(slot 1),
SPatchInterfaceDescriptorData, SPatchSamplerStateArray,
SPatchBindingTableState, SPatchDataParameterBuffer,
SPatchDataParameterStream, SPatchThreadPayload,
SPatchKernelAttributesInfo, SPatchAllocateStatelessPrivateSurface,
SPatchAllocateSyncBuffer,
SPatchAllocateStatelessConstantMemorySurfaceWithInitialization,
SPatchAllocateStatelessGlobalMemorySurfaceWithInitialization,
SPatchAllocateSystemThreadSurface.
Related-To: NEO-4729
Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
2021-03-04 17:14:23 +08:00
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
kernelInfo.heapInfo.pKernelHeap = kernelIsa;
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.heapInfo.KernelHeapSize = sizeof(kernelIsa);
|
2017-12-21 07:45:38 +08:00
|
|
|
kernelInfo.heapInfo.pSsh = sshLocal;
|
2020-05-26 15:36:04 +08:00
|
|
|
kernelInfo.heapInfo.SurfaceStateHeapSize = sizeof(sshLocal);
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.heapInfo.pDsh = dshLocal;
|
|
|
|
kernelInfo.heapInfo.DynamicStateHeapSize = sizeof(dshLocal);
|
2020-11-19 19:30:44 +08:00
|
|
|
|
|
|
|
populateKernelDescriptor(kernelInfo.kernelDescriptor, execEnv);
|
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.numGrfRequired = GrfConfig::DefaultGrfNumber;
|
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.simdSize = 32;
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.setCrossThreadDataSize(sizeof(crossThreadData));
|
|
|
|
kernelInfo.setLocalIds({1, 1, 1});
|
2022-10-21 22:16:43 +08:00
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.numLocalIdChannels = 3;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
if (context == nullptr) {
|
2021-03-30 01:06:29 +08:00
|
|
|
mockContext = new MockContext(deviceVector);
|
2018-01-05 18:33:30 +08:00
|
|
|
context = mockContext;
|
|
|
|
} else {
|
|
|
|
context->incRefInternal();
|
|
|
|
mockContext = context;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-12-17 17:54:45 +08:00
|
|
|
auto maxRootDeviceIndex = 0u;
|
|
|
|
|
|
|
|
for (const auto &pClDevice : deviceVector) {
|
|
|
|
if (pClDevice->getRootDeviceIndex() > maxRootDeviceIndex) {
|
|
|
|
maxRootDeviceIndex = pClDevice->getRootDeviceIndex();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
kernelInfos.resize(maxRootDeviceIndex + 1);
|
|
|
|
|
|
|
|
for (const auto &pClDevice : deviceVector) {
|
|
|
|
kernelInfos[pClDevice->getRootDeviceIndex()] = &kernelInfo;
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2020-10-16 21:00:28 +08:00
|
|
|
mockProgram = new MockProgram(context, false, deviceVector);
|
2021-03-22 23:26:03 +08:00
|
|
|
mockKernel = new MockKernel(mockProgram, kernelInfo, *deviceVector[0]);
|
2017-12-21 07:45:38 +08:00
|
|
|
mockKernel->setCrossThreadData(&crossThreadData, sizeof(crossThreadData));
|
2021-03-16 19:32:40 +08:00
|
|
|
KernelVectorType mockKernels;
|
|
|
|
mockKernels.resize(mockProgram->getMaxRootDeviceIndex() + 1);
|
|
|
|
for (const auto &pClDevice : deviceVector) {
|
|
|
|
auto rootDeviceIndex = pClDevice->getRootDeviceIndex();
|
|
|
|
if (mockKernels[rootDeviceIndex] == nullptr) {
|
|
|
|
mockKernels[rootDeviceIndex] = mockKernel;
|
|
|
|
}
|
|
|
|
}
|
2021-03-22 23:26:03 +08:00
|
|
|
mockMultiDeviceKernel = new MockMultiDeviceKernel(std::move(mockKernels), kernelInfos);
|
2020-12-17 17:54:45 +08:00
|
|
|
|
2021-03-22 19:06:23 +08:00
|
|
|
mockKernel->setSshLocal(&sshLocal, sizeof(sshLocal));
|
2019-01-31 21:47:55 +08:00
|
|
|
|
|
|
|
if (addDefaultArg) {
|
2019-08-30 15:55:44 +08:00
|
|
|
defaultKernelArguments.resize(2);
|
2019-01-31 21:47:55 +08:00
|
|
|
defaultKernelArguments[0] = {};
|
2019-08-30 15:55:44 +08:00
|
|
|
defaultKernelArguments[1] = {};
|
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.addArgBuffer(0, 0, sizeof(uintptr_t), 64);
|
|
|
|
kernelInfo.setAddressQualifier(0, KernelArgMetadata::AddrGlobal);
|
|
|
|
kernelInfo.setAccessQualifier(0, KernelArgMetadata::AccessReadWrite);
|
2019-08-30 15:55:44 +08:00
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.addArgBuffer(1, 8, sizeof(uintptr_t), 72);
|
|
|
|
kernelInfo.setAddressQualifier(1, KernelArgMetadata::AddrGlobal);
|
|
|
|
kernelInfo.setAccessQualifier(1, KernelArgMetadata::AccessReadWrite);
|
2019-08-30 15:55:44 +08:00
|
|
|
|
2019-01-31 21:47:55 +08:00
|
|
|
mockKernel->setKernelArguments(defaultKernelArguments);
|
2021-01-26 19:44:10 +08:00
|
|
|
mockKernel->kernelArgRequiresCacheFlush.resize(2);
|
2019-08-30 15:55:44 +08:00
|
|
|
mockKernel->kernelArgHandlers.resize(2);
|
|
|
|
mockKernel->kernelArgHandlers[0] = &Kernel::setArgBuffer;
|
|
|
|
mockKernel->kernelArgHandlers[1] = &Kernel::setArgBuffer;
|
2019-01-31 21:47:55 +08:00
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-12-17 17:54:45 +08:00
|
|
|
|
|
|
|
MockKernelWithInternals(ClDevice &deviceArg, Context *context = nullptr, bool addDefaultArg = false, SPatchExecutionEnvironment execEnv = {}) : MockKernelWithInternals(toClDeviceVector(deviceArg), context, addDefaultArg, execEnv) {
|
|
|
|
}
|
2020-11-19 19:30:44 +08:00
|
|
|
MockKernelWithInternals(ClDevice &deviceArg, SPatchExecutionEnvironment execEnv) : MockKernelWithInternals(deviceArg, nullptr, false, execEnv) {
|
2019-11-12 20:59:37 +08:00
|
|
|
mockKernel->initialize();
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
~MockKernelWithInternals() {
|
2021-03-09 18:30:21 +08:00
|
|
|
mockMultiDeviceKernel->decRefInternal();
|
2018-01-04 23:34:25 +08:00
|
|
|
mockProgram->decRefInternal();
|
2018-01-05 18:33:30 +08:00
|
|
|
mockContext->decRefInternal();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
operator MockKernel *() {
|
|
|
|
return mockKernel;
|
|
|
|
}
|
|
|
|
|
2021-03-09 18:30:21 +08:00
|
|
|
MockMultiDeviceKernel *mockMultiDeviceKernel = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
MockKernel *mockKernel;
|
|
|
|
MockProgram *mockProgram;
|
2018-01-05 18:33:30 +08:00
|
|
|
Context *mockContext;
|
2020-12-03 02:19:05 +08:00
|
|
|
KernelInfoContainer kernelInfos;
|
2021-04-08 17:05:45 +08:00
|
|
|
MockKernelInfo kernelInfo;
|
2018-11-22 22:16:20 +08:00
|
|
|
SKernelBinaryHeaderCommon kernelHeader = {};
|
2017-12-21 07:45:38 +08:00
|
|
|
uint32_t kernelIsa[32];
|
|
|
|
char crossThreadData[256];
|
|
|
|
char sshLocal[128];
|
2018-12-06 22:33:02 +08:00
|
|
|
char dshLocal[128];
|
2019-01-31 21:47:55 +08:00
|
|
|
std::vector<Kernel::SimpleKernelArgInfo> defaultKernelArguments;
|
2017-12-21 07:45:38 +08:00
|
|
|
};
|
2018-03-21 19:58:30 +08:00
|
|
|
class MockDebugKernel : public MockKernel {
|
|
|
|
public:
|
2021-03-22 23:26:03 +08:00
|
|
|
MockDebugKernel(Program *program, const KernelInfo &kernelInfo, ClDevice &clDeviceArg) : MockKernel(program, kernelInfo, clDeviceArg) {
|
|
|
|
if (!isValidOffset(kernelInfo.kernelDescriptor.payloadMappings.implicitArgs.systemThreadSurfaceAddress.bindful)) {
|
2021-04-08 17:05:45 +08:00
|
|
|
auto &kd = const_cast<KernelDescriptor &>(kernelInfo.kernelDescriptor);
|
|
|
|
kd.payloadMappings.implicitArgs.systemThreadSurfaceAddress.bindful = 0;
|
|
|
|
kd.kernelAttributes.perThreadSystemThreadSurfaceSize = MockDebugKernel::perThreadSystemThreadSurfaceSize;
|
2018-03-21 19:58:30 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Remove PatchTokens from KernelInfo
Use KernelDescriptor instead of patchTokens stored in KernelInfo's
patchInfo.
Removed: SPatchMediaInterfaceDescriptorLoad, SPatchAllocateLocalSurface,
SPatchMediaVFEState(slot 0), SPatchMediaVFEState(slot 1),
SPatchInterfaceDescriptorData, SPatchSamplerStateArray,
SPatchBindingTableState, SPatchDataParameterBuffer,
SPatchDataParameterStream, SPatchThreadPayload,
SPatchKernelAttributesInfo, SPatchAllocateStatelessPrivateSurface,
SPatchAllocateSyncBuffer,
SPatchAllocateStatelessConstantMemorySurfaceWithInitialization,
SPatchAllocateStatelessGlobalMemorySurfaceWithInitialization,
SPatchAllocateSystemThreadSurface.
Related-To: NEO-4729
Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
2021-03-04 17:14:23 +08:00
|
|
|
~MockDebugKernel() override {}
|
2018-03-21 19:58:30 +08:00
|
|
|
static const uint32_t perThreadSystemThreadSurfaceSize;
|
|
|
|
};
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|