2020-10-19 16:02:28 +08:00
|
|
|
/*
|
2024-01-12 18:41:27 +08:00
|
|
|
* Copyright (C) 2020-2024 Intel Corporation
|
2020-10-19 16:02:28 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "shared/source/helpers/bindless_heaps_helper.h"
|
2022-12-22 19:31:28 +08:00
|
|
|
#include "shared/source/indirect_heap/indirect_heap.h"
|
2023-01-13 23:18:40 +08:00
|
|
|
#include "shared/source/memory_manager/gfx_partition.h"
|
2021-01-21 20:10:13 +08:00
|
|
|
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
|
|
|
#include "shared/test/common/mocks/mock_bindless_heaps_helper.h"
|
|
|
|
#include "shared/test/common/mocks/mock_device.h"
|
|
|
|
#include "shared/test/common/mocks/mock_graphics_allocation.h"
|
|
|
|
#include "shared/test/common/mocks/ult_device_factory.h"
|
2021-12-15 01:40:08 +08:00
|
|
|
#include "shared/test/common/test_macros/test.h"
|
2022-08-09 22:26:49 +08:00
|
|
|
#include "shared/test/unit_test/fixtures/front_window_fixture.h"
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
using namespace NEO;
|
|
|
|
|
2023-10-19 02:37:50 +08:00
|
|
|
TEST(BindlessHeapsHelper, givenExternalAllocatorFlagAndBindlessModeEnabledWhenCreatingRootDevicesThenBindlessHeapsHelperCreated) {
|
2020-10-19 16:02:28 +08:00
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseExternalAllocatorForSshAndDsh.set(1);
|
|
|
|
debugManager.flags.UseBindlessMode.set(1);
|
2020-10-19 16:02:28 +08:00
|
|
|
std::unique_ptr<UltDeviceFactory> deviceFactory(new UltDeviceFactory(1, 1));
|
|
|
|
EXPECT_NE(deviceFactory->rootDevices[0]->getBindlessHeapsHelper(), nullptr);
|
|
|
|
}
|
|
|
|
|
2023-10-19 02:37:50 +08:00
|
|
|
TEST(BindlessHeapsHelper, givenExternalAllocatorFlagEnabledAndBindlessModeDisabledWhenCreatingRootDevicesThenBindlessHeapsHelperIsNotCreated) {
|
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseExternalAllocatorForSshAndDsh.set(1);
|
|
|
|
debugManager.flags.UseBindlessMode.set(0);
|
2023-10-19 02:37:50 +08:00
|
|
|
std::unique_ptr<UltDeviceFactory> deviceFactory(new UltDeviceFactory(1, 1));
|
|
|
|
EXPECT_EQ(deviceFactory->rootDevices[0]->getBindlessHeapsHelper(), nullptr);
|
|
|
|
}
|
|
|
|
|
2023-06-06 00:53:29 +08:00
|
|
|
TEST(BindlessHeapsHelper, givenExternalAllocatorFlagDisabledWhenCreatingRootDevicesThenBindlesHeapHelperIsNotCreated) {
|
2020-10-19 16:02:28 +08:00
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseExternalAllocatorForSshAndDsh.set(0);
|
2020-10-19 16:02:28 +08:00
|
|
|
std::unique_ptr<UltDeviceFactory> deviceFactory(new UltDeviceFactory(1, 1));
|
|
|
|
EXPECT_EQ(deviceFactory->rootDevices[0]->getBindlessHeapsHelper(), nullptr);
|
|
|
|
}
|
|
|
|
|
2023-06-03 01:25:46 +08:00
|
|
|
class BindlessHeapsHelperFixture {
|
|
|
|
public:
|
|
|
|
void setUp() {
|
|
|
|
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseExternalAllocatorForSshAndDsh.set(true);
|
2024-03-20 19:45:31 +08:00
|
|
|
rootDevice = std::unique_ptr<NEO::MockDevice>(NEO::MockDevice::createWithNewExecutionEnvironment<NEO::MockDevice>(NEO::defaultHwInfo.get(), rootDeviceIndex));
|
|
|
|
memManager = static_cast<MockMemoryManager *>(rootDevice->getMemoryManager());
|
|
|
|
rootDevice->getRootDeviceEnvironmentRef().memoryOperationsInterface = std::make_unique<MockMemoryOperations>();
|
2023-06-03 01:25:46 +08:00
|
|
|
}
|
|
|
|
void tearDown() {}
|
|
|
|
|
2024-03-20 19:45:31 +08:00
|
|
|
Device *getDevice() {
|
|
|
|
return rootDevice.get();
|
|
|
|
}
|
|
|
|
|
2023-06-03 01:25:46 +08:00
|
|
|
MemoryManager *getMemoryManager() {
|
2024-03-20 19:45:31 +08:00
|
|
|
return memManager;
|
2023-06-03 01:25:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2024-03-20 19:45:31 +08:00
|
|
|
std::unique_ptr<MockDevice> rootDevice;
|
|
|
|
MockMemoryManager *memManager = nullptr;
|
2023-06-03 01:25:46 +08:00
|
|
|
uint32_t rootDeviceIndex = 0;
|
|
|
|
DeviceBitfield devBitfield = 1;
|
|
|
|
int genericSubDevices = 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
using BindlessHeapsHelperTests = Test<BindlessHeapsHelperFixture>;
|
2020-10-19 16:02:28 +08:00
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenItsCreatedThenSpecialSshAllocatedAtHeapBegining) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
auto specialSshAllocation = bindlessHeapHelper->specialSsh->getGraphicsAllocation();
|
|
|
|
EXPECT_EQ(specialSshAllocation->getGpuAddress(), specialSshAllocation->getGpuBaseAddress());
|
|
|
|
}
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInHeapThenHeapUsedSpaceGrow) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
auto usedBefore = bindlessHeapHelper->globalSsh->getUsed();
|
|
|
|
|
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
2023-12-14 00:09:52 +08:00
|
|
|
bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2020-10-19 16:02:28 +08:00
|
|
|
auto usedAfter = bindlessHeapHelper->globalSsh->getUsed();
|
|
|
|
EXPECT_GT(usedAfter, usedBefore);
|
|
|
|
}
|
|
|
|
|
2023-07-21 19:55:22 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenNoMemoryAvailableWhenAllocateSsInHeapThenNullptrIsReturned) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-07-21 19:55:22 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
|
|
|
|
|
|
|
bindlessHeapHelper->globalSsh->getSpace(bindlessHeapHelper->globalSsh->getAvailableSpace());
|
|
|
|
memManager->failAllocateSystemMemory = true;
|
|
|
|
memManager->failAllocate32Bit = true;
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
auto info = bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-07-21 19:55:22 +08:00
|
|
|
EXPECT_EQ(nullptr, info.ssPtr);
|
|
|
|
EXPECT_EQ(nullptr, info.heapAllocation);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenNoMemoryAvailableWhenAllocatingBindlessSlotThenFalseIsReturned) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-07-21 19:55:22 +08:00
|
|
|
auto bindlessHeapHelperPtr = bindlessHeapHelper.get();
|
2024-03-20 19:45:31 +08:00
|
|
|
memManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->bindlessHeapsHelper.reset(bindlessHeapHelper.release());
|
2023-07-21 19:55:22 +08:00
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
|
|
|
|
bindlessHeapHelperPtr->globalSsh->getSpace(bindlessHeapHelperPtr->globalSsh->getAvailableSpace());
|
|
|
|
memManager->failAllocateSystemMemory = true;
|
|
|
|
memManager->failAllocate32Bit = true;
|
|
|
|
|
|
|
|
EXPECT_FALSE(memManager->allocateBindlessSlot(&alloc));
|
|
|
|
EXPECT_EQ(nullptr, alloc.getBindlessInfo().ssPtr);
|
|
|
|
}
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInHeapThenMemoryAtReturnedOffsetIsCorrect) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
2023-12-14 00:09:52 +08:00
|
|
|
auto ssInHeapInfo = bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
auto allocInHeapPtr = bindlessHeapHelper->globalSsh->getGraphicsAllocation()->getUnderlyingBuffer();
|
2020-11-03 18:42:35 +08:00
|
|
|
EXPECT_EQ(ssInHeapInfo.ssPtr, allocInHeapPtr);
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInHeapForImageThenThreeBindlessSlotsAreAllocated) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-17 16:17:57 +08:00
|
|
|
auto surfaceStateSize = bindlessHeapHelper->surfaceStateSize;
|
2024-03-20 19:45:31 +08:00
|
|
|
memManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->bindlessHeapsHelper.reset(bindlessHeapHelper.release());
|
2023-08-17 16:17:57 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc;
|
2023-12-11 22:24:36 +08:00
|
|
|
alloc.allocationType = AllocationType::image;
|
2023-08-17 16:17:57 +08:00
|
|
|
EXPECT_TRUE(getMemoryManager()->allocateBindlessSlot(&alloc));
|
|
|
|
auto ssInHeapInfo1 = alloc.getBindlessInfo();
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
EXPECT_EQ(surfaceStateSize * 3, ssInHeapInfo1.ssSize);
|
2023-08-17 16:17:57 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc2;
|
2023-12-11 22:24:36 +08:00
|
|
|
alloc2.allocationType = AllocationType::sharedImage;
|
2023-08-17 16:17:57 +08:00
|
|
|
EXPECT_TRUE(getMemoryManager()->allocateBindlessSlot(&alloc2));
|
|
|
|
auto ssInHeapInfo2 = alloc2.getBindlessInfo();
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
EXPECT_EQ(surfaceStateSize * 3, ssInHeapInfo2.ssSize);
|
2023-08-17 16:17:57 +08:00
|
|
|
}
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInHeapTwiceForTheSameAllocationThenTheSameOffsetReturned) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
|
2023-07-21 19:55:22 +08:00
|
|
|
EXPECT_TRUE(getMemoryManager()->allocateBindlessSlot(&alloc));
|
|
|
|
auto ssInHeapInfo1 = alloc.getBindlessInfo();
|
|
|
|
|
|
|
|
EXPECT_TRUE(getMemoryManager()->allocateBindlessSlot(&alloc));
|
|
|
|
auto ssInHeapInfo2 = alloc.getBindlessInfo();
|
2020-11-03 18:42:35 +08:00
|
|
|
EXPECT_EQ(ssInHeapInfo1.surfaceStateOffset, ssInHeapInfo2.surfaceStateOffset);
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
|
2023-07-21 19:55:22 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInHeapTwiceForDifferentAllocationsThenDifferentOffsetsReturned) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation alloc1;
|
|
|
|
MockGraphicsAllocation alloc2;
|
|
|
|
size_t size = 0x40;
|
|
|
|
auto ss = std::make_unique<uint8_t[]>(size);
|
|
|
|
memset(ss.get(), 35, size);
|
2023-12-14 00:09:52 +08:00
|
|
|
auto ssInHeapInfo1 = bindlessHeapHelper->allocateSSInHeap(size, &alloc1, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
auto ssInHeapInfo2 = bindlessHeapHelper->allocateSSInHeap(size, &alloc2, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
2020-11-03 18:42:35 +08:00
|
|
|
EXPECT_NE(ssInHeapInfo1.surfaceStateOffset, ssInHeapInfo2.surfaceStateOffset);
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
|
2021-01-18 17:54:06 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocatingMoreSsThenNewHeapAllocationCreated) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
size_t ssSize = 0x40;
|
|
|
|
auto ssCount = bindlessHeapHelper->globalSsh->getAvailableSpace() / ssSize;
|
|
|
|
auto graphicsAllocations = std::make_unique<MockGraphicsAllocation[]>(ssCount);
|
|
|
|
auto ssAllocationBefore = bindlessHeapHelper->globalSsh->getGraphicsAllocation();
|
|
|
|
for (uint32_t i = 0; i < ssCount; i++) {
|
2023-12-14 00:09:52 +08:00
|
|
|
bindlessHeapHelper->allocateSSInHeap(ssSize, &graphicsAllocations[i], BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
MockGraphicsAllocation alloc;
|
2023-12-14 00:09:52 +08:00
|
|
|
bindlessHeapHelper->allocateSSInHeap(ssSize, &alloc, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2020-10-19 16:02:28 +08:00
|
|
|
|
|
|
|
auto ssAllocationAfter = bindlessHeapHelper->globalSsh->getGraphicsAllocation();
|
|
|
|
|
|
|
|
EXPECT_NE(ssAllocationBefore, ssAllocationAfter);
|
|
|
|
}
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenCreatedThenAllocationsHaveTheSameBaseAddress) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-10-19 16:02:28 +08:00
|
|
|
for (auto allocation : bindlessHeapHelper->ssHeapsAllocations) {
|
2020-11-03 18:42:35 +08:00
|
|
|
EXPECT_EQ(allocation->getGpuBaseAddress(), bindlessHeapHelper->getGlobalHeapsBase());
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-17 18:08:54 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenGetDefaultBorderColorOffsetCalledThenCorrectOffsetReturned) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2021-05-17 18:08:54 +08:00
|
|
|
auto expectedOffset = bindlessHeapHelper->borderColorStates->getGpuAddress() - bindlessHeapHelper->borderColorStates->getGpuBaseAddress();
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->getDefaultBorderColorOffset(), expectedOffset);
|
2020-10-19 16:02:28 +08:00
|
|
|
}
|
|
|
|
|
2021-05-17 18:08:54 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenGetAlphaBorderColorOffsetCalledThenCorrectOffsetReturned) {
|
|
|
|
auto borderColorSize = 0x40;
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2021-05-17 18:08:54 +08:00
|
|
|
auto expectedOffset = bindlessHeapHelper->borderColorStates->getGpuAddress() - bindlessHeapHelper->borderColorStates->getGpuBaseAddress() + borderColorSize;
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->getAlphaBorderColorOffset(), expectedOffset);
|
2020-11-03 18:42:35 +08:00
|
|
|
}
|
|
|
|
|
2023-10-05 21:08:27 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInSpecialHeapThenFirstSlotIsAtOffsetZero) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-11-03 18:42:35 +08:00
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
2023-12-14 00:09:52 +08:00
|
|
|
auto ssInHeapInfo = bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::specialSsh);
|
2023-10-05 21:08:27 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(0u, ssInHeapInfo.surfaceStateOffset);
|
|
|
|
EXPECT_EQ(ssInHeapInfo.heapAllocation->getGpuAddress(), ssInHeapInfo.heapAllocation->getGpuBaseAddress());
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->getGlobalHeapsBase(), ssInHeapInfo.heapAllocation->getGpuBaseAddress());
|
2020-11-03 18:42:35 +08:00
|
|
|
}
|
2023-10-05 21:08:27 +08:00
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInGlobalHeapThenOffsetLessThanHeapSize) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-11-03 18:42:35 +08:00
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
2023-12-14 00:09:52 +08:00
|
|
|
auto ssInHeapInfo = bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-10-05 21:08:27 +08:00
|
|
|
EXPECT_LE(0u, ssInHeapInfo.surfaceStateOffset);
|
|
|
|
EXPECT_GT(MemoryConstants::max32BitAddress, ssInHeapInfo.surfaceStateOffset);
|
2020-11-03 18:42:35 +08:00
|
|
|
}
|
|
|
|
|
2023-10-05 21:08:27 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocateSsInGlobalDshThenOffsetLessThanHeapSize) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2020-11-03 18:42:35 +08:00
|
|
|
MockGraphicsAllocation alloc;
|
|
|
|
size_t size = 0x40;
|
2023-12-14 00:09:52 +08:00
|
|
|
auto ssInHeapInfo = bindlessHeapHelper->allocateSSInHeap(size, &alloc, BindlessHeapsHelper::BindlesHeapType::globalDsh);
|
2023-10-05 21:08:27 +08:00
|
|
|
EXPECT_LE(0u, ssInHeapInfo.surfaceStateOffset);
|
|
|
|
EXPECT_GT(MemoryConstants::max32BitAddress, ssInHeapInfo.surfaceStateOffset);
|
2021-01-27 21:31:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenFreeGraphicsMemoryIsCalledThenSSinHeapInfoShouldBePlacedInReuseVector) {
|
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseBindlessMode.set(1);
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2021-01-27 21:31:29 +08:00
|
|
|
MockBindlesHeapsHelper *bindlessHeapHelperPtr = bindlessHeapHelper.get();
|
2024-03-20 19:45:31 +08:00
|
|
|
memManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->bindlessHeapsHelper.reset(bindlessHeapHelper.release());
|
2021-01-27 21:31:29 +08:00
|
|
|
MockGraphicsAllocation *alloc = new MockGraphicsAllocation;
|
2023-07-21 19:55:22 +08:00
|
|
|
memManager->allocateBindlessSlot(alloc);
|
|
|
|
|
|
|
|
auto ssInHeapInfo = alloc->getBindlessInfo();
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
memManager->freeGraphicsMemory(alloc);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
auto freePoolIndex = bindlessHeapHelperPtr->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][0].size(), 1u);
|
|
|
|
auto ssInHeapInfoFromReuseVector = bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][0].front();
|
2023-07-21 19:55:22 +08:00
|
|
|
EXPECT_EQ(ssInHeapInfoFromReuseVector.surfaceStateOffset, ssInHeapInfo.surfaceStateOffset);
|
|
|
|
EXPECT_EQ(ssInHeapInfoFromReuseVector.ssPtr, ssInHeapInfo.ssPtr);
|
2023-08-17 16:17:57 +08:00
|
|
|
|
|
|
|
MockGraphicsAllocation *alloc2 = new MockGraphicsAllocation;
|
2023-12-11 22:24:36 +08:00
|
|
|
alloc2->allocationType = AllocationType::image;
|
2023-08-17 16:17:57 +08:00
|
|
|
memManager->allocateBindlessSlot(alloc2);
|
|
|
|
|
|
|
|
auto ssInHeapInfo2 = alloc2->getBindlessInfo();
|
|
|
|
|
|
|
|
memManager->freeGraphicsMemory(alloc2);
|
2023-08-25 22:28:27 +08:00
|
|
|
EXPECT_EQ(bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][1].size(), 1u);
|
|
|
|
ssInHeapInfoFromReuseVector = bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][1].front();
|
2023-08-17 16:17:57 +08:00
|
|
|
EXPECT_EQ(ssInHeapInfoFromReuseVector.surfaceStateOffset, ssInHeapInfo2.surfaceStateOffset);
|
|
|
|
EXPECT_EQ(ssInHeapInfoFromReuseVector.ssPtr, ssInHeapInfo2.ssPtr);
|
2023-07-21 19:55:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenAllocatingBindlessSlotTwiceThenNewSlotIsNotAllocatedAndTrueIsReturned) {
|
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseBindlessMode.set(1);
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
|
|
|
memManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->bindlessHeapsHelper.reset(bindlessHeapHelper.release());
|
2023-07-21 19:55:22 +08:00
|
|
|
MockGraphicsAllocation *alloc = new MockGraphicsAllocation;
|
|
|
|
EXPECT_TRUE(memManager->allocateBindlessSlot(alloc));
|
|
|
|
auto ssInHeapInfo = alloc->getBindlessInfo();
|
|
|
|
|
|
|
|
EXPECT_TRUE(memManager->allocateBindlessSlot(alloc));
|
|
|
|
auto ssInHeapInfo2 = alloc->getBindlessInfo();
|
|
|
|
|
|
|
|
EXPECT_EQ(ssInHeapInfo.ssPtr, ssInHeapInfo2.ssPtr);
|
|
|
|
|
|
|
|
memManager->freeGraphicsMemory(alloc);
|
2021-01-27 21:31:29 +08:00
|
|
|
}
|
|
|
|
|
2023-08-25 22:28:27 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperPreviousAllocationThenItShouldNotBeReusedIfThresholdNotReached) {
|
2021-01-27 21:31:29 +08:00
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseBindlessMode.set(1);
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2021-01-27 21:31:29 +08:00
|
|
|
MockBindlesHeapsHelper *bindlessHeapHelperPtr = bindlessHeapHelper.get();
|
|
|
|
MockGraphicsAllocation *alloc = new MockGraphicsAllocation;
|
2024-03-20 19:45:31 +08:00
|
|
|
memManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->bindlessHeapsHelper.reset(bindlessHeapHelper.release());
|
2023-07-21 19:55:22 +08:00
|
|
|
memManager->allocateBindlessSlot(alloc);
|
|
|
|
|
|
|
|
auto ssInHeapInfo = alloc->getBindlessInfo();
|
2021-01-27 21:31:29 +08:00
|
|
|
memManager->freeGraphicsMemory(alloc);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
auto freePoolIndex = bindlessHeapHelperPtr->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][0].size(), 1u);
|
2021-01-27 21:31:29 +08:00
|
|
|
MockGraphicsAllocation *alloc2 = new MockGraphicsAllocation;
|
2023-07-21 19:55:22 +08:00
|
|
|
|
|
|
|
memManager->allocateBindlessSlot(alloc2);
|
2023-08-25 22:28:27 +08:00
|
|
|
auto newSSinHeapInfo = alloc2->getBindlessInfo();
|
2023-07-21 19:55:22 +08:00
|
|
|
|
2023-08-25 22:28:27 +08:00
|
|
|
EXPECT_NE(bindlessHeapHelperPtr->surfaceStateInHeapVectorReuse[freePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_NE(ssInHeapInfo.surfaceStateOffset, newSSinHeapInfo.surfaceStateOffset);
|
|
|
|
EXPECT_NE(ssInHeapInfo.ssPtr, newSSinHeapInfo.ssPtr);
|
2021-01-27 21:31:29 +08:00
|
|
|
memManager->freeGraphicsMemory(alloc2);
|
2021-10-05 18:30:14 +08:00
|
|
|
}
|
2023-08-25 22:28:27 +08:00
|
|
|
|
2021-10-05 18:30:14 +08:00
|
|
|
TEST_F(BindlessHeapsHelperTests, givenDeviceWhenBindlessHeapHelperInitializedThenCorrectDeviceBitFieldIsUsed) {
|
|
|
|
DebugManagerStateRestore dbgRestorer;
|
2023-11-30 16:32:25 +08:00
|
|
|
debugManager.flags.UseBindlessMode.set(1);
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
|
|
|
EXPECT_EQ(reinterpret_cast<MockMemoryManager *>(getMemoryManager())->recentlyPassedDeviceBitfield, getDevice()->getDeviceBitfield());
|
2022-08-11 22:01:11 +08:00
|
|
|
}
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenCreatedThenAllocateAndReleasePoolIndicesAreInitializedToZero) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->stateCacheDirtyForContext.to_ulong());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenFreeSlotsExceedingThresholdInResuePoolWhenNewSlotsAllocatedThenSlotsAreAllocatedFromReusePool) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
bindlessHeapHelper->reuseSlotCountThreshold = 4;
|
|
|
|
|
|
|
|
size_t size = bindlessHeapHelper->surfaceStateSize;
|
|
|
|
|
|
|
|
SurfaceStateInHeapInfo ssInHeapInfos[5];
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[1] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
// allocate triple size for image
|
|
|
|
ssInHeapInfos[2] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[i]);
|
|
|
|
ssInHeapInfos[i] = {0};
|
|
|
|
}
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
EXPECT_TRUE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
EXPECT_EQ(std::numeric_limits<uint64_t>::max(), bindlessHeapHelper->stateCacheDirtyForContext.to_ullong());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenReusePoolExhaustedWhenNewSlotsAllocatedThenSlotsAreNotResuedAndStateCacheDirtyFlagsAreNotSet) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
bindlessHeapHelper->reuseSlotCountThreshold = 4;
|
|
|
|
|
|
|
|
size_t size = bindlessHeapHelper->surfaceStateSize;
|
|
|
|
|
|
|
|
SurfaceStateInHeapInfo ssInHeapInfos[5];
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[1] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
// allocate triple size for image
|
|
|
|
ssInHeapInfos[2] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[i]);
|
|
|
|
ssInHeapInfos[i] = {0};
|
|
|
|
}
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[i] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
auto allocatePoolIndex = bindlessHeapHelper->allocatePoolIndex;
|
|
|
|
auto releasePoolIndex = bindlessHeapHelper->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 2u);
|
|
|
|
|
|
|
|
bindlessHeapHelper->stateCacheDirtyForContext.reset();
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
EXPECT_NE(0u, ssInHeapInfos[3].surfaceStateOffset);
|
|
|
|
EXPECT_NE(nullptr, ssInHeapInfos[3].ssPtr);
|
|
|
|
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->stateCacheDirtyForContext.to_ullong());
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 2u);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenReleasedSlotsToSecondPoolWhenThresholdReachedThenPoolsAreSwitchedAndSlotsAllocatedFromReusePool) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
bindlessHeapHelper->reuseSlotCountThreshold = 4;
|
|
|
|
|
|
|
|
size_t size = bindlessHeapHelper->surfaceStateSize;
|
|
|
|
|
|
|
|
SurfaceStateInHeapInfo ssInHeapInfos[5];
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[1] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
// allocate triple size for image
|
|
|
|
ssInHeapInfos[2] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[i]);
|
|
|
|
ssInHeapInfos[i] = {0};
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[i] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
auto allocatePoolIndex = bindlessHeapHelper->allocatePoolIndex;
|
|
|
|
auto releasePoolIndex = bindlessHeapHelper->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 2u);
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[i]);
|
|
|
|
ssInHeapInfos[i] = {0};
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][0].size(), 3u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 2u);
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
allocatePoolIndex = bindlessHeapHelper->allocatePoolIndex;
|
|
|
|
releasePoolIndex = bindlessHeapHelper->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 1u);
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 0u);
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[3]);
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[4]);
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 0u);
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][0].size(), 3u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 2u);
|
|
|
|
|
|
|
|
bindlessHeapHelper->stateCacheDirtyForContext.reset();
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
EXPECT_EQ(std::numeric_limits<uint64_t>::max(), bindlessHeapHelper->stateCacheDirtyForContext.to_ullong());
|
|
|
|
EXPECT_TRUE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
|
|
|
|
allocatePoolIndex = bindlessHeapHelper->allocatePoolIndex;
|
|
|
|
releasePoolIndex = bindlessHeapHelper->releasePoolIndex;
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 3u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 1u);
|
|
|
|
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[releasePoolIndex][1].size(), 0u);
|
|
|
|
|
|
|
|
for (int i = 0; i < 8; i++) {
|
2023-12-14 00:09:52 +08:00
|
|
|
bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
}
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 0u);
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->allocateFromReusePool);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenFreeSlotsInReusePoolForONeSizeWhenAllocatingDifferentSizeThenNewSlotFromHeapIsAllocated) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
bindlessHeapHelper->reuseSlotCountThreshold = 4;
|
|
|
|
|
|
|
|
size_t size = bindlessHeapHelper->surfaceStateSize;
|
|
|
|
|
|
|
|
SurfaceStateInHeapInfo ssInHeapInfos[5];
|
|
|
|
|
2023-12-14 00:09:52 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[1] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[2] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[3] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
|
|
|
ssInHeapInfos[4] = bindlessHeapHelper->allocateSSInHeap(size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
bindlessHeapHelper->releaseSSToReusePool(ssInHeapInfos[i]);
|
|
|
|
ssInHeapInfos[i] = {0};
|
|
|
|
}
|
|
|
|
|
2024-01-12 18:41:27 +08:00
|
|
|
ssInHeapInfos[0] = bindlessHeapHelper->allocateSSInHeap(3 * size, nullptr, BindlessHeapsHelper::BindlesHeapType::globalSsh);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(0u, bindlessHeapHelper->allocatePoolIndex);
|
|
|
|
EXPECT_EQ(1u, bindlessHeapHelper->releasePoolIndex);
|
|
|
|
|
|
|
|
EXPECT_NE(0u, ssInHeapInfos[0].surfaceStateOffset);
|
|
|
|
EXPECT_NE(nullptr, ssInHeapInfos[0].ssPtr);
|
|
|
|
|
|
|
|
auto allocatePoolIndex = bindlessHeapHelper->allocatePoolIndex;
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][0].size(), 5u);
|
|
|
|
EXPECT_EQ(bindlessHeapHelper->surfaceStateInHeapVectorReuse[allocatePoolIndex][1].size(), 0u);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHelperWhenGettingAndClearingDirstyStateForContextThenCorrectFlagIsReturnedAdCleard) {
|
2024-03-20 19:45:31 +08:00
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
2023-08-25 22:28:27 +08:00
|
|
|
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->getStateDirtyForContext(1));
|
|
|
|
bindlessHeapHelper->stateCacheDirtyForContext.set(3);
|
|
|
|
EXPECT_TRUE(bindlessHeapHelper->getStateDirtyForContext(3));
|
|
|
|
|
|
|
|
bindlessHeapHelper->clearStateDirtyForContext(3);
|
|
|
|
EXPECT_FALSE(bindlessHeapHelper->getStateDirtyForContext(3));
|
2024-03-20 19:45:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(BindlessHeapsHelperTests, givenBindlessHeapHelperWhenItsCreatedThenSshAllocationsAreResident) {
|
|
|
|
auto bindlessHeapHelper = std::make_unique<MockBindlesHeapsHelper>(getDevice(), false);
|
|
|
|
MemoryOperationsHandler *memoryOperationsIface = getDevice()->getRootDeviceEnvironmentRef().memoryOperationsInterface.get();
|
|
|
|
|
|
|
|
for (int heapType = 0; heapType < BindlessHeapsHelper::BindlesHeapType::numHeapTypes; heapType++) {
|
|
|
|
auto *allocation = bindlessHeapHelper->getHeap(static_cast<BindlessHeapsHelper::BindlesHeapType>(heapType))->getGraphicsAllocation();
|
|
|
|
EXPECT_EQ(memoryOperationsIface->isResident(getDevice(), *allocation), MemoryOperationsStatus::success);
|
|
|
|
}
|
|
|
|
}
|