Skip to content

Commit 9e9e7ab

Browse files
Correct memory banks passed to hardware contexts
Related-To: NEO-2881 Change-Id: I60d4a649c1ab3db634c56792e407bb318831de1b Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent bc150a9 commit 9e9e7ab

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

runtime/helpers/hardware_context_controller.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,15 @@ void HardwareContextController::submit(uint64_t batchBufferGpuAddress, const voi
4848
}
4949

5050
void HardwareContextController::writeMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t memoryBanks, int hint, size_t pageSize) {
51-
for (auto &hardwareContext : hardwareContexts) {
52-
hardwareContext->writeMemory(gfxAddress, memory, size, memoryBanks, hint, pageSize);
51+
if (hardwareContexts.size() == 1u) {
52+
hardwareContexts.at(0)->writeMemory(gfxAddress, memory, size, memoryBanks, hint, pageSize);
53+
return;
54+
}
55+
for (auto bankId = 0u; bankId < hardwareContexts.size(); bankId++) {
56+
auto &hardwareContext = hardwareContexts.at(bankId);
57+
auto selectedBank = memoryBanks & (1 << bankId);
58+
UNRECOVERABLE_IF(selectedBank == 0);
59+
hardwareContext->writeMemory(gfxAddress, memory, size, memoryBanks & (1 << bankId), hint, pageSize);
5360
}
5461
}
5562

unit_tests/command_stream/aub_command_stream_receiver_1_tests.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,20 @@ TEST_F(HardwareContextContainerTests, givenSingleHwContextWhenSubmitMethodIsCall
11771177
EXPECT_FALSE(mockHwContext0->writeMemoryCalled);
11781178
}
11791179

1180+
TEST_F(HardwareContextContainerTests, givenSingleHwContextWhenWriteMemoryIsCalledThenWholeMemoryBanksArePassed) {
1181+
MockAubManager aubManager;
1182+
MockOsContext osContext(1, getDeviceBitfieldForNDevices(1), aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
1183+
HardwareContextController hwContextContainer(aubManager, osContext, 0);
1184+
EXPECT_EQ(1u, hwContextContainer.hardwareContexts.size());
1185+
1186+
auto mockHwContext0 = static_cast<MockHardwareContext *>(hwContextContainer.hardwareContexts[0].get());
1187+
1188+
hwContextContainer.writeMemory(1, reinterpret_cast<const void *>(0x123), 2, 3u, 4, 5);
1189+
1190+
EXPECT_TRUE(mockHwContext0->writeMemoryCalled);
1191+
EXPECT_EQ(3u, mockHwContext0->memoryBanksPassed);
1192+
}
1193+
11801194
TEST_F(HardwareContextContainerTests, givenMultipleHwContextWhenSingleMethodIsCalledThenUseAllContexts) {
11811195
MockAubManager aubManager;
11821196
MockOsContext osContext(1, getDeviceBitfieldForNDevices(2), aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
@@ -1201,7 +1215,7 @@ TEST_F(HardwareContextContainerTests, givenMultipleHwContextWhenSingleMethodIsCa
12011215
hwContextContainer.pollForCompletion();
12021216
hwContextContainer.expectMemory(1, reinterpret_cast<const void *>(0x123), 2, 0);
12031217
hwContextContainer.submit(1, reinterpret_cast<const void *>(0x123), 2, 0, 1);
1204-
hwContextContainer.writeMemory(1, reinterpret_cast<const void *>(0x123), 2, 3, 4, 5);
1218+
hwContextContainer.writeMemory(1, reinterpret_cast<const void *>(0x123), 2, 3u, 4, 5);
12051219

12061220
EXPECT_TRUE(mockHwContext0->initializeCalled);
12071221
EXPECT_TRUE(mockHwContext1->initializeCalled);
@@ -1213,6 +1227,8 @@ TEST_F(HardwareContextContainerTests, givenMultipleHwContextWhenSingleMethodIsCa
12131227
EXPECT_TRUE(mockHwContext1->submitCalled);
12141228
EXPECT_TRUE(mockHwContext0->writeMemoryCalled);
12151229
EXPECT_TRUE(mockHwContext1->writeMemoryCalled);
1230+
EXPECT_EQ(1u, mockHwContext0->memoryBanksPassed);
1231+
EXPECT_EQ(2u, mockHwContext1->memoryBanksPassed);
12161232
}
12171233

12181234
TEST_F(HardwareContextContainerTests, givenMultipleHwContextWhenSingleMethodIsCalledThenUseFirstContext) {

unit_tests/mocks/mock_aub_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct MockHardwareContext : public aub_stream::HardwareContext {
2424
void writeMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t memoryBanks, int hint, size_t pageSize = 65536) override {
2525
writeMemoryCalled = true;
2626
writeMemoryPageSizePassed = pageSize;
27+
memoryBanksPassed = memoryBanks;
2728
}
2829
void freeMemory(uint64_t gfxAddress, size_t size) override { freeMemoryCalled = true; }
2930
void expectMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t compareOperation) override { expectMemoryCalled = true; }
@@ -43,6 +44,7 @@ struct MockHardwareContext : public aub_stream::HardwareContext {
4344
bool dumpSurfaceCalled = false;
4445

4546
size_t writeMemoryPageSizePassed = 0;
47+
uint32_t memoryBanksPassed = 0;
4648

4749
const uint32_t deviceIndex;
4850
};

0 commit comments

Comments
 (0)