2019-03-22 20:40:41 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2019 Intel Corporation
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "runtime/event/event_builder.h"
|
|
|
|
#include "runtime/event/user_event.h"
|
2019-04-10 18:44:02 +08:00
|
|
|
#include "runtime/helpers/timestamp_packet.h"
|
2019-03-22 20:40:41 +08:00
|
|
|
#include "runtime/memory_manager/surface.h"
|
|
|
|
#include "runtime/os_interface/os_context.h"
|
|
|
|
#include "test.h"
|
|
|
|
#include "unit_tests/fixtures/enqueue_handler_fixture.h"
|
|
|
|
#include "unit_tests/mocks/mock_command_queue.h"
|
2019-06-28 19:22:51 +08:00
|
|
|
#include "unit_tests/mocks/mock_csr.h"
|
2019-03-22 20:40:41 +08:00
|
|
|
#include "unit_tests/mocks/mock_graphics_allocation.h"
|
2019-04-10 18:44:02 +08:00
|
|
|
#include "unit_tests/mocks/mock_timestamp_container.h"
|
2019-03-22 20:40:41 +08:00
|
|
|
|
|
|
|
namespace NEO {
|
|
|
|
|
|
|
|
template <typename GfxFamily>
|
|
|
|
class MockCommandQueueWithCacheFlush : public MockCommandQueueHw<GfxFamily> {
|
|
|
|
using MockCommandQueueHw<GfxFamily>::MockCommandQueueHw;
|
|
|
|
|
|
|
|
public:
|
2019-04-08 16:09:36 +08:00
|
|
|
bool isCacheFlushCommand(uint32_t commandType) override {
|
2019-03-22 20:40:41 +08:00
|
|
|
return commandRequireCacheFlush;
|
|
|
|
}
|
|
|
|
bool commandRequireCacheFlush = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
HWTEST_F(EnqueueHandlerTest, GivenCommandStreamWithoutKernelWhenCommandEnqueuedThenTaskCountIncreased) {
|
|
|
|
|
|
|
|
std::unique_ptr<MockCommandQueueHw<FamilyType>> mockCmdQ(new MockCommandQueueHw<FamilyType>(context, pDevice, 0));
|
|
|
|
|
|
|
|
char buffer[64];
|
|
|
|
std::unique_ptr<MockGraphicsAllocation> allocation(new MockGraphicsAllocation(buffer, sizeof(buffer)));
|
|
|
|
std::unique_ptr<GeneralSurface> surface(new GeneralSurface(allocation.get()));
|
|
|
|
EventsRequest eventsRequest(0, nullptr, nullptr);
|
|
|
|
EventBuilder eventBuilder;
|
|
|
|
Surface *surfaces[] = {surface.get()};
|
|
|
|
auto blocking = true;
|
2019-04-10 18:44:02 +08:00
|
|
|
TimestampPacketContainer previousTimestampPacketNodes;
|
|
|
|
mockCmdQ->enqueueCommandWithoutKernel(surfaces, 1, mockCmdQ->getCS(0), 0, blocking, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0);
|
2019-03-22 20:40:41 +08:00
|
|
|
EXPECT_EQ(allocation->getTaskCount(mockCmdQ->getCommandStreamReceiver().getOsContext().getContextId()), 1u);
|
|
|
|
}
|
2019-06-28 19:22:51 +08:00
|
|
|
|
|
|
|
HWTEST_F(EnqueueHandlerTest, whenEnqueueCommandWithoutKernelThenPassCorrectDispatchFlags) {
|
|
|
|
auto executionEnvironment = pDevice->getExecutionEnvironment();
|
|
|
|
auto mockCsr = std::make_unique<MockCsrHw2<FamilyType>>(*executionEnvironment);
|
|
|
|
auto mockCmdQ = std::make_unique<MockCommandQueueHw<FamilyType>>(context, pDevice, nullptr);
|
|
|
|
mockCsr->setupContext(*mockCmdQ->engine->osContext);
|
|
|
|
mockCsr->initializeTagAllocation();
|
|
|
|
auto oldCsr = mockCmdQ->engine->commandStreamReceiver;
|
|
|
|
mockCmdQ->engine->commandStreamReceiver = mockCsr.get();
|
2019-06-28 03:33:05 +08:00
|
|
|
mockCsr->createPreemptionAllocation();
|
2019-06-28 19:22:51 +08:00
|
|
|
|
|
|
|
auto blocking = true;
|
|
|
|
TimestampPacketContainer previousTimestampPacketNodes;
|
|
|
|
EventsRequest eventsRequest(0, nullptr, nullptr);
|
|
|
|
EventBuilder eventBuilder;
|
|
|
|
mockCmdQ->enqueueCommandWithoutKernel(nullptr, 0, mockCmdQ->getCS(0), 0, blocking, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0);
|
|
|
|
|
|
|
|
EXPECT_EQ(blocking, mockCsr->passedDispatchFlags.blocking);
|
|
|
|
EXPECT_EQ(mockCmdQ->isMultiEngineQueue(), mockCsr->passedDispatchFlags.multiEngineQueue);
|
|
|
|
EXPECT_EQ(pDevice->getPreemptionMode(), mockCsr->passedDispatchFlags.preemptionMode);
|
|
|
|
mockCmdQ->engine->commandStreamReceiver = oldCsr;
|
|
|
|
}
|
|
|
|
|
2019-03-22 20:40:41 +08:00
|
|
|
HWTEST_F(EnqueueHandlerTest, GivenCommandStreamWithoutKernelAndZeroSurfacesWhenEnqueuedHandlerThenUsedSizeEqualZero) {
|
|
|
|
|
|
|
|
std::unique_ptr<MockCommandQueueWithCacheFlush<FamilyType>> mockCmdQ(new MockCommandQueueWithCacheFlush<FamilyType>(context, pDevice, 0));
|
|
|
|
|
|
|
|
mockCmdQ->commandRequireCacheFlush = true;
|
2019-07-03 15:30:30 +08:00
|
|
|
mockCmdQ->template enqueueHandler<CL_COMMAND_MARKER>(nullptr, 0, false, nullptr, 0, nullptr, nullptr);
|
2019-03-22 20:40:41 +08:00
|
|
|
EXPECT_EQ(mockCmdQ->getCS(0).getUsed(), 0u);
|
|
|
|
}
|
2019-04-10 18:44:02 +08:00
|
|
|
HWTEST_F(EnqueueHandlerTest, givenTimestampPacketWriteEnabledAndCommandWithCacheFlushWhenEnqueueingHandlerThenObtainNewStamp) {
|
|
|
|
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
|
|
|
csr.timestampPacketWriteEnabled = true;
|
|
|
|
|
|
|
|
auto mockTagAllocator = new MockTagAllocator<>(pDevice->getMemoryManager());
|
|
|
|
csr.timestampPacketAllocator.reset(mockTagAllocator);
|
|
|
|
std::unique_ptr<MockCommandQueueWithCacheFlush<FamilyType>> mockCmdQ(new MockCommandQueueWithCacheFlush<FamilyType>(context, pDevice, 0));
|
|
|
|
mockCmdQ->commandRequireCacheFlush = true;
|
|
|
|
|
|
|
|
cl_event event;
|
|
|
|
|
2019-07-03 15:30:30 +08:00
|
|
|
mockCmdQ->template enqueueHandler<CL_COMMAND_MARKER>(nullptr, 0, false, nullptr, 0, nullptr, &event);
|
2019-04-10 18:44:02 +08:00
|
|
|
auto node1 = mockCmdQ->timestampPacketContainer->peekNodes().at(0);
|
|
|
|
EXPECT_NE(nullptr, node1);
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
HWTEST_F(EnqueueHandlerTest, givenTimestampPacketWriteDisabledAndCommandWithCacheFlushWhenEnqueueingHandlerThenTimeStampContainerIsNotCreated) {
|
|
|
|
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
|
|
|
csr.timestampPacketWriteEnabled = false;
|
|
|
|
|
|
|
|
auto mockTagAllocator = new MockTagAllocator<>(pDevice->getMemoryManager());
|
|
|
|
csr.timestampPacketAllocator.reset(mockTagAllocator);
|
|
|
|
std::unique_ptr<MockCommandQueueWithCacheFlush<FamilyType>> mockCmdQ(new MockCommandQueueWithCacheFlush<FamilyType>(context, pDevice, 0));
|
|
|
|
mockCmdQ->commandRequireCacheFlush = true;
|
|
|
|
|
|
|
|
cl_event event;
|
|
|
|
|
2019-07-03 15:30:30 +08:00
|
|
|
mockCmdQ->template enqueueHandler<CL_COMMAND_MARKER>(nullptr, 0, false, nullptr, 0, nullptr, &event);
|
2019-04-10 18:44:02 +08:00
|
|
|
auto container = mockCmdQ->timestampPacketContainer.get();
|
|
|
|
EXPECT_EQ(nullptr, container);
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
2019-04-08 16:09:36 +08:00
|
|
|
} // namespace NEO
|