diff --git a/opencl/test/unit_test/command_queue/blit_enqueue_tests.cpp b/opencl/test/unit_test/command_queue/blit_enqueue_tests.cpp index 13d5f1efa3..86a8507411 100644 --- a/opencl/test/unit_test/command_queue/blit_enqueue_tests.cpp +++ b/opencl/test/unit_test/command_queue/blit_enqueue_tests.cpp @@ -10,6 +10,7 @@ #include "opencl/source/event/user_event.h" #include "opencl/test/unit_test/helpers/hw_parse.h" +#include "opencl/test/unit_test/helpers/unit_test_helper.h" #include "opencl/test/unit_test/mocks/mock_command_queue.h" #include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_device.h" @@ -141,6 +142,27 @@ struct BlitAuxTranslationTests : public ::testing::Test { return --commandItor; } + template + GenCmdList::iterator expectMiFlush(GenCmdList::iterator itorStart, GenCmdList::iterator itorEnd) { + Family *miFlushCmd = nullptr; + GenCmdList::iterator commandItor = itorStart; + bool miFlushWithMemoryWrite = false; + + do { + commandItor = find(commandItor, itorEnd); + if (itorEnd == commandItor) { + EXPECT_TRUE(false); + return itorEnd; + } + miFlushCmd = genCmdCast(*commandItor); + miFlushWithMemoryWrite = miFlushCmd->getDestinationAddress() != 0; + + ++commandItor; + } while (!miFlushWithMemoryWrite); + + return --commandItor; + } + template GenCmdList::iterator expectCommand(GenCmdList::iterator itorStart, GenCmdList::iterator itorEnd) { auto commandItor = find(itorStart, itorEnd); @@ -357,21 +379,21 @@ HWTEST_TEMPLATED_F(BlitAuxTranslationTests, givenBlitTranslationWhenConstructing auto cmdFound = expectCommand(cmdListBcs.begin(), cmdListBcs.end()); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); auto miflushDwCmd = genCmdCast(*cmdFound); auxToNonAuxOutputAddress[0] = miflushDwCmd->getDestinationAddress(); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); auxToNonAuxOutputAddress[1] = miflushDwCmd->getDestinationAddress(); cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); nonAuxToAuxOutputAddress[0] = miflushDwCmd->getDestinationAddress(); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); nonAuxToAuxOutputAddress[1] = miflushDwCmd->getDestinationAddress(); } @@ -728,21 +750,21 @@ HWTEST_TEMPLATED_F(BlitAuxTranslationTests, givenBlitTranslationWhenConstructing auto cmdFound = expectCommand(cmdListBcs.begin(), cmdListBcs.end()); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); auto miflushDwCmd = genCmdCast(*cmdFound); auxToNonAuxOutputAddress[0] = miflushDwCmd->getDestinationAddress(); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); auxToNonAuxOutputAddress[1] = miflushDwCmd->getDestinationAddress(); cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); nonAuxToAuxOutputAddress[0] = miflushDwCmd->getDestinationAddress(); - cmdFound = expectCommand(++cmdFound, cmdListBcs.end()); + cmdFound = expectMiFlush(++cmdFound, cmdListBcs.end()); miflushDwCmd = genCmdCast(*cmdFound); nonAuxToAuxOutputAddress[1] = miflushDwCmd->getDestinationAddress(); } diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp index dab04a61c1..da3178917f 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp @@ -472,6 +472,20 @@ HWTEST_F(BcsTests, givenBltSizeWithLeftoverWhenDispatchedThenProgramAllRequiredC } auto miFlushCmd = genCmdCast(*(cmdIterator++)); + + if (UnitTestHelper::additionalMiFlushDwRequired) { + uint64_t gpuAddress = 0x0; + uint64_t immData = 0; + + EXPECT_NE(nullptr, miFlushCmd); + EXPECT_EQ(MI_FLUSH_DW::POST_SYNC_OPERATION_NO_WRITE, miFlushCmd->getPostSyncOperation()); + EXPECT_EQ(gpuAddress, miFlushCmd->getDestinationAddress()); + EXPECT_EQ(immData, miFlushCmd->getImmediateData()); + + miFlushCmd++; + *(cmdIterator++); + } + EXPECT_NE(nullptr, miFlushCmd); EXPECT_EQ(MI_FLUSH_DW::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA_QWORD, miFlushCmd->getPostSyncOperation()); EXPECT_EQ(csr.getTagAllocation()->getGpuAddress(), miFlushCmd->getDestinationAddress()); diff --git a/opencl/test/unit_test/helpers/unit_test_helper.h b/opencl/test/unit_test/helpers/unit_test_helper.h index b2cdd8d75d..777c5f0359 100644 --- a/opencl/test/unit_test/helpers/unit_test_helper.h +++ b/opencl/test/unit_test/helpers/unit_test_helper.h @@ -51,6 +51,8 @@ struct UnitTestHelper { static const AuxTranslationMode requiredAuxTranslationMode; static const bool useFullRowForLocalIdsGeneration; + + static const bool additionalMiFlushDwRequired; }; } // namespace NEO diff --git a/opencl/test/unit_test/helpers/unit_test_helper.inl b/opencl/test/unit_test/helpers/unit_test_helper.inl index 4a2659dd03..ba97d41dca 100644 --- a/opencl/test/unit_test/helpers/unit_test_helper.inl +++ b/opencl/test/unit_test/helpers/unit_test_helper.inl @@ -87,4 +87,7 @@ const AuxTranslationMode UnitTestHelper::requiredAuxTranslationMode = template const bool UnitTestHelper::useFullRowForLocalIdsGeneration = false; +template +const bool UnitTestHelper::additionalMiFlushDwRequired = false; + } // namespace NEO diff --git a/opencl/test/unit_test/mem_obj/buffer_tests.cpp b/opencl/test/unit_test/mem_obj/buffer_tests.cpp index 096d304bee..a95cad0a3d 100644 --- a/opencl/test/unit_test/mem_obj/buffer_tests.cpp +++ b/opencl/test/unit_test/mem_obj/buffer_tests.cpp @@ -1247,17 +1247,31 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenOutputTimestampPacketWhenBlitCalledThenP for (auto &cmd : hwParser.cmdList) { if (auto miFlushDwCmd = genCmdCast(cmd)) { EXPECT_TRUE(blitCmdFound); - EXPECT_EQ(miFlushDwCmdsCount == 0, - timestampPacketGpuWriteAddress == miFlushDwCmd->getDestinationAddress()); - EXPECT_EQ(miFlushDwCmdsCount == 0, - 0u == miFlushDwCmd->getImmediateData()); + if (UnitTestHelper::additionalMiFlushDwRequired) { + miFlushDwCmd++; + if (miFlushDwCmdsCount % 2 == 0) { + EXPECT_EQ(miFlushDwCmdsCount == 0, + timestampPacketGpuWriteAddress == miFlushDwCmd->getDestinationAddress()); + EXPECT_EQ(miFlushDwCmdsCount == 0, + 0u == miFlushDwCmd->getImmediateData()); + } + } else { + EXPECT_EQ(miFlushDwCmdsCount == 0, + timestampPacketGpuWriteAddress == miFlushDwCmd->getDestinationAddress()); + EXPECT_EQ(miFlushDwCmdsCount == 0, + 0u == miFlushDwCmd->getImmediateData()); + } miFlushDwCmdsCount++; } else if (genCmdCast(cmd)) { blitCmdFound = true; EXPECT_EQ(0u, miFlushDwCmdsCount); } } - EXPECT_EQ(2u, miFlushDwCmdsCount); + if (UnitTestHelper::additionalMiFlushDwRequired) { + EXPECT_EQ(4u, miFlushDwCmdsCount); + } else { + EXPECT_EQ(2u, miFlushDwCmdsCount); + } EXPECT_TRUE(blitCmdFound); } diff --git a/shared/source/command_container/command_encoder.inl b/shared/source/command_container/command_encoder.inl index 5b90c58a2c..5a458e3c44 100644 --- a/shared/source/command_container/command_encoder.inl +++ b/shared/source/command_container/command_encoder.inl @@ -404,7 +404,4 @@ void EncodeMiFlushDW::programMiFlushDw(LinearStream &commandStream, u appendMiFlushDw(miFlushDwCmd); } -template -void EncodeMiFlushDW::programMiFlushDwWA(LinearStream &commandStream) {} - } // namespace NEO diff --git a/shared/source/command_container/command_encoder_base.inl b/shared/source/command_container/command_encoder_base.inl index 2143ade554..250463b663 100644 --- a/shared/source/command_container/command_encoder_base.inl +++ b/shared/source/command_container/command_encoder_base.inl @@ -269,4 +269,7 @@ size_t EncodeDispatchKernel::estimateEncodeDispatchKernelCmdsSize(Device template void EncodeMiFlushDW::appendMiFlushDw(MI_FLUSH_DW *miFlushDwCmd) {} +template +void EncodeMiFlushDW::programMiFlushDwWA(LinearStream &commandStream) {} + } // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/command_container/command_encoder_tests.cpp b/shared/test/unit_test/command_container/command_encoder_tests.cpp index 5b3015c95e..90a7893871 100644 --- a/shared/test/unit_test/command_container/command_encoder_tests.cpp +++ b/shared/test/unit_test/command_container/command_encoder_tests.cpp @@ -8,6 +8,7 @@ #include "shared/source/command_container/command_encoder.h" #include "opencl/test/unit_test/fixtures/device_fixture.h" +#include "opencl/test/unit_test/helpers/unit_test_helper.h" #include "test.h" using namespace NEO; @@ -37,7 +38,19 @@ HWTEST_F(CommandEncoderTests, givenImmDataWriteWhenProgrammingMiFlushDwThenSetAl EncodeMiFlushDW::programMiFlushDw(linearStream, gpuAddress, immData); auto miFlushDwCmd = reinterpret_cast(buffer); - EXPECT_EQ(sizeof(MI_FLUSH_DW), linearStream.getUsed()); + unsigned int sizeMultiplier = 1; + if (UnitTestHelper::additionalMiFlushDwRequired) { + sizeMultiplier = 2; + uint64_t gpuAddress = 0x0; + uint64_t immData = 0; + + EXPECT_EQ(MI_FLUSH_DW::POST_SYNC_OPERATION_NO_WRITE, miFlushDwCmd->getPostSyncOperation()); + EXPECT_EQ(gpuAddress, miFlushDwCmd->getDestinationAddress()); + EXPECT_EQ(immData, miFlushDwCmd->getImmediateData()); + miFlushDwCmd++; + } + + EXPECT_EQ(sizeMultiplier * sizeof(MI_FLUSH_DW), linearStream.getUsed()); EXPECT_EQ(MI_FLUSH_DW::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA_QWORD, miFlushDwCmd->getPostSyncOperation()); EXPECT_EQ(gpuAddress, miFlushDwCmd->getDestinationAddress()); EXPECT_EQ(immData, miFlushDwCmd->getImmediateData());