/* * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/command_stream/preemption.h" #include "shared/source/helpers/hw_helper.h" #include "shared/source/memory_manager/graphics_allocation.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" #include "shared/test/common/mocks/mock_csr.h" #include "shared/test/common/mocks/mock_execution_environment.h" #include "shared/test/common/mocks/mock_graphics_allocation.h" #include "shared/test/common/mocks/mock_memory_manager.h" #include "shared/test/common/test_macros/test.h" #include "shared/test/unit_test/page_fault_manager/mock_cpu_page_fault_manager.h" #include "gtest/gtest.h" #include using namespace NEO; typedef ::testing::Types SurfaceTypes; namespace createSurface { template Surface *create(char *data, GraphicsAllocation *gfxAllocation); template <> Surface *create(char *data, GraphicsAllocation *gfxAllocation) { return new NullSurface; } template <> Surface *create(char *data, GraphicsAllocation *gfxAllocation) { return new HostPtrSurface(data, 10, gfxAllocation); } template <> Surface *create(char *data, GraphicsAllocation *gfxAllocation) { return new GeneralSurface(gfxAllocation); } } // namespace createSurface template class SurfaceTest : public ::testing::Test { public: char data[10]; MockGraphicsAllocation gfxAllocation; }; TYPED_TEST_CASE(SurfaceTest, SurfaceTypes); HWTEST_TYPED_TEST(SurfaceTest, GivenSurfaceWhenInterfaceIsUsedThenSurfaceBehavesCorrectly) { int32_t execStamp; auto executionEnvironment = std::make_unique(); auto memoryManager = std::make_unique(); executionEnvironment->memoryManager.reset(memoryManager.release()); DeviceBitfield deviceBitfield(1); auto csr = std::make_unique>(execStamp, *executionEnvironment, 0, deviceBitfield); auto hwInfo = *defaultHwInfo; auto engine = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo)[0]; auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(csr.get(), EngineDescriptorHelper::getDefaultDescriptor(engine, PreemptionHelper::getDefaultPreemptionMode(hwInfo))); csr->setupContext(*osContext); Surface *surface = createSurface::create(this->data, &this->gfxAllocation); ASSERT_NE(nullptr, surface); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks) Surface *duplicatedSurface = surface->duplicate(); ASSERT_NE(nullptr, duplicatedSurface); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks) surface->makeResident(*csr); if (std::is_same::value || std::is_same::value) { EXPECT_EQ(1u, csr->madeResidentGfxAllocations.size()); } delete duplicatedSurface; delete surface; } TEST(HostPtrSurfaceTest, givenHostPtrSurfaceWhenCreatedWithoutSpecifyingPtrCopyAllowanceThenPtrCopyIsNotAllowed) { char memory[2] = {}; HostPtrSurface surface(memory, sizeof(memory)); EXPECT_FALSE(surface.peekIsPtrCopyAllowed()); } TEST(HostPtrSurfaceTest, givenHostPtrSurfaceWhenCreatedWithPtrCopyAllowedThenQueryReturnsTrue) { char memory[2] = {}; HostPtrSurface surface(memory, sizeof(memory), true); EXPECT_TRUE(surface.peekIsPtrCopyAllowed()); } TEST(HostPtrSurfaceTest, givenHostPtrSurfaceWhenCreatedWithPtrCopyNotAllowedThenQueryReturnsFalse) { char memory[2] = {}; HostPtrSurface surface(memory, sizeof(memory), false); EXPECT_FALSE(surface.peekIsPtrCopyAllowed()); } using GeneralSurfaceTest = ::testing::Test; HWTEST_F(GeneralSurfaceTest, givenGeneralSurfaceWhenMigrationNeededThenMoveToGpuDomainCalled) { int32_t execStamp; MockGraphicsAllocation allocation; auto executionEnvironment = std::make_unique(); auto memoryManager = std::make_unique(); executionEnvironment->memoryManager.reset(memoryManager.release()); auto pageFaultManager = std::make_unique(); auto pageFaultManagerPtr = pageFaultManager.get(); static_cast(executionEnvironment->memoryManager.get())->pageFaultManager.reset(pageFaultManager.release()); DeviceBitfield deviceBitfield(1); auto csr = std::make_unique>(execStamp, *executionEnvironment, 0, deviceBitfield); auto hwInfo = *defaultHwInfo; auto engine = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo)[0]; auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(csr.get(), EngineDescriptorHelper::getDefaultDescriptor(engine, PreemptionHelper::getDefaultPreemptionMode(hwInfo))); csr->setupContext(*osContext); auto surface = std::make_unique(&allocation, true); surface->makeResident(*csr); EXPECT_EQ(pageFaultManagerPtr->moveAllocationToGpuDomainCalled, 1); } HWTEST_F(GeneralSurfaceTest, givenGeneralSurfaceWhenMigrationNotNeededThenMoveToGpuDomainNotCalled) { int32_t execStamp; MockGraphicsAllocation allocation; auto executionEnvironment = std::make_unique(); auto memoryManager = std::make_unique(); executionEnvironment->memoryManager.reset(memoryManager.release()); auto pageFaultManager = std::make_unique(); auto pageFaultManagerPtr = pageFaultManager.get(); static_cast(executionEnvironment->memoryManager.get())->pageFaultManager.reset(pageFaultManager.release()); DeviceBitfield deviceBitfield(1); auto csr = std::make_unique>(execStamp, *executionEnvironment, 0, deviceBitfield); auto hwInfo = *defaultHwInfo; auto engine = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo)[0]; auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(csr.get(), EngineDescriptorHelper::getDefaultDescriptor(engine, PreemptionHelper::getDefaultPreemptionMode(hwInfo))); csr->setupContext(*osContext); auto surface = std::make_unique(&allocation, false); surface->makeResident(*csr); EXPECT_EQ(pageFaultManagerPtr->moveAllocationToGpuDomainCalled, 0); }