@@ -1505,5 +1505,78 @@ TEST_F(KernelPrintHandlerTest, whenPrintPrintfOutputIsCalledThenPrintfBufferIsUs
15051505 EXPECT_EQ (buffer, MyPrintfHandler::getPrintfSurfaceInitialDataSize ());
15061506}
15071507
1508+ using PrintfTest = Test<DeviceFixture>;
1509+
1510+ TEST_F (PrintfTest, givenKernelWithPrintfThenPrintfBufferIsCreated) {
1511+ Mock<Module> mockModule (this ->device , nullptr );
1512+ Mock<Kernel> mockKernel;
1513+ mockKernel.descriptor .kernelAttributes .flags .usesPrintf = true ;
1514+ mockKernel.module = &mockModule;
1515+
1516+ EXPECT_TRUE (mockKernel.getImmutableData ()->getDescriptor ().kernelAttributes .flags .usesPrintf );
1517+
1518+ ze_kernel_desc_t kernelDesc = {};
1519+ kernelDesc.pKernelName = " mock" ;
1520+ mockKernel.createPrintfBuffer ();
1521+ EXPECT_NE (nullptr , mockKernel.getPrintfBufferAllocation ());
1522+ }
1523+
1524+ TEST_F (PrintfTest, GivenKernelNotUsingPrintfWhenCreatingPrintfBufferThenAllocationIsNotCreated) {
1525+ Mock<Module> mockModule (this ->device , nullptr );
1526+ Mock<Kernel> mockKernel;
1527+ mockKernel.descriptor .kernelAttributes .flags .usesPrintf = false ;
1528+ mockKernel.module = &mockModule;
1529+
1530+ ze_kernel_desc_t kernelDesc = {};
1531+ kernelDesc.pKernelName = " mock" ;
1532+ mockKernel.createPrintfBuffer ();
1533+ EXPECT_EQ (nullptr , mockKernel.getPrintfBufferAllocation ());
1534+ }
1535+
1536+ TEST_F (PrintfTest, WhenCreatingPrintfBufferThenAllocationAddedToResidencyContainer) {
1537+ Mock<Module> mockModule (this ->device , nullptr );
1538+ Mock<Kernel> mockKernel;
1539+ mockKernel.descriptor .kernelAttributes .flags .usesPrintf = true ;
1540+ mockKernel.module = &mockModule;
1541+
1542+ ze_kernel_desc_t kernelDesc = {};
1543+ kernelDesc.pKernelName = " mock" ;
1544+ mockKernel.createPrintfBuffer ();
1545+
1546+ auto printfBufferAllocation = mockKernel.getPrintfBufferAllocation ();
1547+ EXPECT_NE (nullptr , printfBufferAllocation);
1548+
1549+ EXPECT_NE (0u , mockKernel.residencyContainer .size ());
1550+ EXPECT_EQ (mockKernel.residencyContainer [mockKernel.residencyContainer .size () - 1 ], printfBufferAllocation);
1551+ }
1552+
1553+ TEST_F (PrintfTest, WhenCreatingPrintfBufferThenCrossThreadDataIsPatched) {
1554+ Mock<Module> mockModule (this ->device , nullptr );
1555+ Mock<Kernel> mockKernel;
1556+ mockKernel.descriptor .kernelAttributes .flags .usesPrintf = true ;
1557+ mockKernel.module = &mockModule;
1558+
1559+ ze_kernel_desc_t kernelDesc = {};
1560+ kernelDesc.pKernelName = " mock" ;
1561+
1562+ auto crossThreadData = std::make_unique<uint32_t []>(4 );
1563+
1564+ mockKernel.descriptor .payloadMappings .implicitArgs .printfSurfaceAddress .stateless = 0 ;
1565+ mockKernel.descriptor .payloadMappings .implicitArgs .printfSurfaceAddress .pointerSize = sizeof (uintptr_t );
1566+ mockKernel.crossThreadData .reset (reinterpret_cast <uint8_t *>(crossThreadData.get ()));
1567+ mockKernel.crossThreadDataSize = sizeof (uint32_t [4 ]);
1568+
1569+ mockKernel.createPrintfBuffer ();
1570+
1571+ auto printfBufferAllocation = mockKernel.getPrintfBufferAllocation ();
1572+ EXPECT_NE (nullptr , printfBufferAllocation);
1573+
1574+ auto printfBufferAddressPatched = *reinterpret_cast <uintptr_t *>(crossThreadData.get ());
1575+ auto printfBufferGpuAddressOffset = static_cast <uintptr_t >(printfBufferAllocation->getGpuAddressToPatch ());
1576+ EXPECT_EQ (printfBufferGpuAddressOffset, printfBufferAddressPatched);
1577+
1578+ mockKernel.crossThreadData .release ();
1579+ }
1580+
15081581} // namespace ult
15091582} // namespace L0
0 commit comments