diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 1cc0ae587a..508bfb4535 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -1356,7 +1356,7 @@ ze_result_t CommandListCoreFamily::appendPageFaultCopy(NEO::Graph size_t middleElSize = sizeof(uint32_t) * 4; uintptr_t rightSize = size % middleElSize; - bool isStateless = false; + bool isStateless = this->cmdListHeapAddressModel == NEO::HeapAddressModel::globalStateless; if (size >= 4ull * MemoryConstants::gigaByte) { isStateless = true; @@ -1441,7 +1441,7 @@ ze_result_t CommandListCoreFamily::appendMemoryCopy(void *dstptr, uintptr_t leftSize = 0; uintptr_t rightSize = 0; uintptr_t middleSizeBytes = 0; - bool isStateless = false; + bool isStateless = this->cmdListHeapAddressModel == NEO::HeapAddressModel::globalStateless; const bool isHeapless = this->isHeaplessModeEnabled(); if (!isCopyOnly()) { @@ -1887,7 +1887,7 @@ ze_result_t CommandListCoreFamily::appendMemoryFill(void *ptr, ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents, bool relaxedOrderingDispatch) { - bool isStateless = false; + bool isStateless = this->cmdListHeapAddressModel == NEO::HeapAddressModel::globalStateless; const bool isHeapless = this->isHeaplessModeEnabled(); NEO::Device *neoDevice = device->getNEODevice(); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_6.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_6.cpp index 9e6eacf7d9..614428e230 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_6.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_6.cpp @@ -16,6 +16,7 @@ #include "shared/test/common/libult/ult_command_stream_receiver.h" #include "shared/test/common/mocks/mock_command_stream_receiver.h" #include "shared/test/common/mocks/mock_device.h" +#include "shared/test/common/mocks/mock_graphics_allocation.h" #include "shared/test/common/mocks/mock_memory_operations_handler.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/test_macros/hw_test.h" @@ -2704,5 +2705,84 @@ HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest, EXPECT_EQ(ZE_RESULT_SUCCESS, result); } +HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest, + givenCommandListUsingGlobalHeapsWhenAppendingCopyKernelThenStatelessKernelUsedAndNoSurfaceHeapUsed, + IsAtLeastXeHpCore) { + auto &container = commandList->getCmdContainer(); + + auto ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); + + void *hostPtr = nullptr; + void *devicePtr = nullptr; + + constexpr size_t size = 1; + ze_host_mem_alloc_desc_t hostDesc = {}; + auto result = context->allocHostMem(&hostDesc, size, 1u, &hostPtr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ze_device_mem_alloc_desc_t deviceDesc = {}; + result = context->allocDeviceMem(device->toHandle(), &deviceDesc, size, 1u, &devicePtr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + result = commandList->appendMemoryCopy(devicePtr, hostPtr, size, nullptr, 0, nullptr, false, false); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); + + context->freeMem(hostPtr); + context->freeMem(devicePtr); +} + +HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest, + givenCommandListUsingGlobalHeapsWhenAppendingFillKernelThenStatelessKernelUsedAndNoSurfaceHeapUsed, + IsAtLeastXeHpCore) { + auto &container = commandList->getCmdContainer(); + + auto ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); + + char pattern = 1; + void *patternPtr = &pattern; + void *devicePtr = nullptr; + + constexpr size_t size = 128; + + ze_device_mem_alloc_desc_t deviceDesc = {}; + auto result = context->allocDeviceMem(device->toHandle(), &deviceDesc, size, 1u, &devicePtr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + result = commandList->appendMemoryFill(devicePtr, patternPtr, sizeof(pattern), size, nullptr, 0, nullptr, false); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); + + context->freeMem(devicePtr); +} + +HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest, + givenCommandListUsingGlobalHeapsWhenAppendingPageFaultCopyThenStatelessKernelUsedAndNoSurfaceHeapUsed, + IsAtLeastXeHpCore) { + auto &container = commandList->getCmdContainer(); + + auto ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); + + constexpr size_t size = 64; + uint8_t *buffer[size]; + uint64_t gpuAddress = 0x1200; + + NEO::MockGraphicsAllocation mockSrcAllocation(buffer, gpuAddress, size); + NEO::MockGraphicsAllocation mockDstAllocation(buffer, gpuAddress, size); + + auto result = commandList->appendPageFaultCopy(&mockDstAllocation, &mockSrcAllocation, size, false); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ssh = container.getIndirectHeap(NEO::HeapType::surfaceState); + EXPECT_EQ(nullptr, ssh); +} + } // namespace ult } // namespace L0