/* * Copyright (C) 2017-2019 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "core/command_stream/preemption.h" #include "core/execution_environment/root_device_environment.h" #include "core/helpers/hw_info.h" #include "runtime/command_stream/aub_command_stream_receiver_hw.h" #include "runtime/execution_environment/execution_environment.h" #include "runtime/platform/platform.h" #include "unit_tests/mocks/mock_allocation_properties.h" #include "gmock/gmock.h" #include #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Winconsistent-missing-override" #endif namespace NEO { struct MockAubFileStreamMockMmioWrite : public AubMemDump::AubFileStream { void writeMMIOImpl(uint32_t offset, uint32_t value) override { mmioList.push_back(std::make_pair(offset, value)); } bool isOnMmioList(const MMIOPair &mmio) { bool mmioFound = false; for (auto &mmioPair : mmioList) { if (mmioPair.first == mmio.first && mmioPair.second == mmio.second) { mmioFound = true; break; } } return mmioFound; } std::vector> mmioList; }; template struct MockAubCsrToTestDumpContext : public AUBCommandStreamReceiverHw { using AUBCommandStreamReceiverHw::AUBCommandStreamReceiverHw; void addContextToken(uint32_t dumpHandle) override { handle = dumpHandle; } uint32_t handle = 0; }; template struct MockAubCsr : public AUBCommandStreamReceiverHw { using CommandStreamReceiverHw::defaultSshSize; using AUBCommandStreamReceiverHw::taskCount; using AUBCommandStreamReceiverHw::latestSentTaskCount; using AUBCommandStreamReceiverHw::pollForCompletionTaskCount; using AUBCommandStreamReceiverHw::writeMemory; using AUBCommandStreamReceiverHw::AUBCommandStreamReceiverHw; DispatchMode peekDispatchMode() const { return this->dispatchMode; } GraphicsAllocation *getTagAllocation() const { return this->tagAllocation; } void setLatestSentTaskCount(uint32_t latestSentTaskCount) { this->latestSentTaskCount = latestSentTaskCount; } bool flushBatchedSubmissions() override { flushBatchedSubmissionsCalled = true; return true; } void initProgrammingFlags() override { initProgrammingFlagsCalled = true; } void initializeEngine() { AUBCommandStreamReceiverHw::initializeEngine(); initializeEngineCalled = true; } void writeMemory(uint64_t gpuAddress, void *cpuAddress, size_t size, uint32_t memoryBank, uint64_t entryBits) override { AUBCommandStreamReceiverHw::writeMemory(gpuAddress, cpuAddress, size, memoryBank, entryBits); writeMemoryCalled = true; } void submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits) override { AUBCommandStreamReceiverHw::submitBatchBuffer(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, entryBits); submitBatchBufferCalled = true; } void writeMemoryWithAubManager(GraphicsAllocation &graphicsAllocation) override { CommandStreamReceiverSimulatedHw::writeMemoryWithAubManager(graphicsAllocation); writeMemoryWithAubManagerCalled = true; } void pollForCompletion() override { AUBCommandStreamReceiverHw::pollForCompletion(); pollForCompletionCalled = true; } void expectMemoryEqual(void *gfxAddress, const void *srcAddress, size_t length) { AUBCommandStreamReceiverHw::expectMemoryEqual(gfxAddress, srcAddress, length); expectMemoryEqualCalled = true; } void expectMemoryNotEqual(void *gfxAddress, const void *srcAddress, size_t length) { AUBCommandStreamReceiverHw::expectMemoryNotEqual(gfxAddress, srcAddress, length); expectMemoryNotEqualCalled = true; } bool waitForCompletionWithTimeout(bool enableTimeout, int64_t timeoutMicroseconds, uint32_t taskCountToWait) { return true; } void addAubComment(const char *message) { AUBCommandStreamReceiverHw::addAubComment(message); addAubCommentCalled = true; } void dumpAllocation(GraphicsAllocation &gfxAllocation) override { AUBCommandStreamReceiverHw::dumpAllocation(gfxAllocation); dumpAllocationCalled = true; } bool isMultiOsContextCapable() const override { return multiOsContextCapable; } bool multiOsContextCapable = false; bool flushBatchedSubmissionsCalled = false; bool initProgrammingFlagsCalled = false; bool initializeEngineCalled = false; bool writeMemoryCalled = false; bool writeMemoryWithAubManagerCalled = false; bool submitBatchBufferCalled = false; bool pollForCompletionCalled = false; bool expectMemoryEqualCalled = false; bool expectMemoryNotEqualCalled = false; bool addAubCommentCalled = false; bool dumpAllocationCalled = false; void initFile(const std::string &fileName) override { fileIsOpen = true; openFileName = fileName; } void closeFile() override { fileIsOpen = false; openFileName = ""; } bool isFileOpen() const override { return fileIsOpen; } const std::string getFileName() override { return openFileName; } bool fileIsOpen = false; std::string openFileName = ""; MOCK_METHOD0(addPatchInfoComments, bool(void)); using CommandStreamReceiverHw::localMemoryEnabled; }; struct AubExecutionEnvironment { std::unique_ptr executionEnvironment; GraphicsAllocation *commandBuffer = nullptr; std::unique_ptr commandStreamReceiver; template CsrType *getCsr() { return static_cast(commandStreamReceiver.get()); } ~AubExecutionEnvironment() { if (commandBuffer) { executionEnvironment->memoryManager->freeGraphicsMemory(commandBuffer); } } }; template std::unique_ptr getEnvironment(bool createTagAllocation, bool allocateCommandBuffer, bool standalone) { std::unique_ptr executionEnvironment(new ExecutionEnvironment); executionEnvironment->prepareRootDeviceEnvironments(1); executionEnvironment->setHwInfo(*platformDevices); executionEnvironment->rootDeviceEnvironments[0]->aubCenter.reset(new AubCenter()); executionEnvironment->initializeMemoryManager(); auto commandStreamReceiver = std::make_unique("", standalone, *executionEnvironment, 0); if (createTagAllocation) { commandStreamReceiver->initializeTagAllocation(); } auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(commandStreamReceiver.get(), getChosenEngineType(*platformDevices[0]), 1, PreemptionHelper::getDefaultPreemptionMode(*platformDevices[0]), false); commandStreamReceiver->setupContext(*osContext); std::unique_ptr aubExecutionEnvironment(new AubExecutionEnvironment); if (allocateCommandBuffer) { aubExecutionEnvironment->commandBuffer = executionEnvironment->memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); } aubExecutionEnvironment->executionEnvironment = std::move(executionEnvironment); aubExecutionEnvironment->commandStreamReceiver = std::move(commandStreamReceiver); return aubExecutionEnvironment; } } // namespace NEO #if defined(__clang__) #pragma clang diagnostic pop #endif