/* * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/command_stream/command_stream_receiver_hw.h" #include "shared/source/helpers/hw_helper.h" #include "shared/test/unit_test/cmd_parse/hw_parse.h" #include "opencl/test/unit_test/libult/ult_command_stream_receiver.h" #include "opencl/test/unit_test/mocks/mock_device.h" #include "test.h" using namespace NEO; struct ComputeModeRequirements : public ::testing::Test { template struct myCsr : public UltCommandStreamReceiver { using CommandStreamReceiver::commandStream; using CommandStreamReceiverHw::lastSentThreadArbitrationPolicy; using CommandStreamReceiverHw::requiredThreadArbitrationPolicy; myCsr(ExecutionEnvironment &executionEnvironment) : UltCommandStreamReceiver(executionEnvironment, 0){}; CsrSizeRequestFlags *getCsrRequestFlags() { return &this->csrSizeRequestFlags; } }; void makeResidentSharedAlloc() { csr->getResidencyAllocations().push_back(alloc); } template void overrideComputeModeRequest(bool reqestChanged, bool requireCoherency, bool hasSharedHandles, bool modifyThreadArbitrationPolicy = false) { overrideComputeModeRequest(reqestChanged, requireCoherency, hasSharedHandles, false, 128u); if (modifyThreadArbitrationPolicy) { getCsrHw()->lastSentThreadArbitrationPolicy = getCsrHw()->requiredThreadArbitrationPolicy; } } template void overrideComputeModeRequest(bool coherencyRequestChanged, bool requireCoherency, bool hasSharedHandles, bool numGrfRequiredChanged, uint32_t numGrfRequired) { auto csrHw = getCsrHw(); csrHw->getCsrRequestFlags()->coherencyRequestChanged = coherencyRequestChanged; csrHw->getCsrRequestFlags()->hasSharedHandles = hasSharedHandles; csrHw->getCsrRequestFlags()->numGrfRequiredChanged = numGrfRequiredChanged; flags.requiresCoherency = requireCoherency; flags.numGrfRequired = numGrfRequired; if (hasSharedHandles) { makeResidentSharedAlloc(); } } template myCsr *getCsrHw() { return static_cast *>(csr); } template void SetUpImpl() { device.reset(MockDevice::createWithNewExecutionEnvironment(defaultHwInfo.get())); csr = new myCsr(*device->executionEnvironment); device->resetCommandStreamReceiver(csr); AllocationProperties properties(device->getRootDeviceIndex(), false, MemoryConstants::pageSize, GraphicsAllocation::AllocationType::SHARED_BUFFER, false); alloc = device->getMemoryManager()->createGraphicsAllocationFromSharedHandle((osHandle)123, properties, false); } void TearDown() override { device->getMemoryManager()->freeGraphicsMemory(alloc); } CommandStreamReceiver *csr = nullptr; std::unique_ptr device; DispatchFlags flags{{}, nullptr, {}, nullptr, QueueThrottle::MEDIUM, PreemptionMode::Disabled, GrfConfig::DefaultGrfNumber, L3CachingSettings::l3CacheOn, ThreadArbitrationPolicy::NotPresent, QueueSliceCount::defaultSliceCount, false, false, false, false, false, false, false, false, false, false, false}; GraphicsAllocation *alloc = nullptr; };