1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/test/common/helpers/default_hw_info.h"
10 
11 #include "opencl/test/unit_test/command_queue/enqueue_fixture.h"
12 #include "opencl/test/unit_test/fixtures/hello_world_fixture.h"
13 #include "opencl/test/unit_test/helpers/cl_hw_parse.h"
14 
15 namespace NEO {
16 
17 template <typename FactoryType>
18 struct MediaKernelFixture : public HelloWorldFixture<FactoryType>,
19                             public ClHardwareParse,
20                             public ::testing::Test {
21     typedef HelloWorldFixture<FactoryType> Parent;
22 
23     using Parent::pCmdBuffer;
24     using Parent::pCmdQ;
25     using Parent::pContext;
26     using Parent::pCS;
27     using Parent::pDevice;
28     using Parent::pKernel;
29     using Parent::pProgram;
30     using Parent::retVal;
31 
MediaKernelFixtureMediaKernelFixture32     MediaKernelFixture() {}
33 
34     template <typename FamilyType>
enqueueRegularKernelMediaKernelFixture35     void enqueueRegularKernel() {
36         auto retVal = EnqueueKernelHelper<>::enqueueKernel(
37             pCmdQ,
38             pKernel);
39         ASSERT_EQ(CL_SUCCESS, retVal);
40 
41         parseCommands<FamilyType>(*pCmdQ);
42 
43         itorWalker1 = find<typename FamilyType::WALKER_TYPE *>(cmdList.begin(), cmdList.end());
44         ASSERT_NE(cmdList.end(), itorWalker1);
45     }
46 
47     template <typename FamilyType>
enqueueVmeKernelMediaKernelFixture48     void enqueueVmeKernel() {
49         auto retVal = EnqueueKernelHelper<>::enqueueKernel(
50             pCmdQ,
51             pVmeKernel);
52         ASSERT_EQ(CL_SUCCESS, retVal);
53 
54         parseCommands<FamilyType>(*pCmdQ);
55 
56         itorWalker1 = find<typename FamilyType::WALKER_TYPE *>(cmdList.begin(), cmdList.end());
57         ASSERT_NE(cmdList.end(), itorWalker1);
58     }
59 
SetUpMediaKernelFixture60     void SetUp() override {
61         skipVmeTest = !defaultHwInfo->capabilityTable.supportsVme;
62         if (skipVmeTest) {
63             GTEST_SKIP();
64         }
65         Parent::kernelFilename = "vme_kernels";
66         Parent::kernelName = "non_vme_kernel";
67 
68         Parent::SetUp();
69         ClHardwareParse::SetUp();
70 
71         ASSERT_NE(nullptr, pKernel);
72         ASSERT_EQ(false, pKernel->isVmeKernel());
73 
74         cl_int retVal;
75 
76         // create the VME kernel
77         pMultiDeviceVmeKernel = MultiDeviceKernel::create<MockKernel>(
78             pProgram,
79             pProgram->getKernelInfosForKernel("device_side_block_motion_estimate_intel"),
80             &retVal);
81 
82         pVmeKernel = pMultiDeviceVmeKernel->getKernel(pDevice->getRootDeviceIndex());
83         ASSERT_NE(nullptr, pVmeKernel);
84         ASSERT_EQ(true, pVmeKernel->isVmeKernel());
85     }
86 
TearDownMediaKernelFixture87     void TearDown() override {
88         if (skipVmeTest) {
89             return;
90         }
91         pMultiDeviceVmeKernel->release();
92 
93         ClHardwareParse::TearDown();
94         Parent::TearDown();
95     }
96 
97     GenCmdList::iterator itorWalker1;
98     GenCmdList::iterator itorWalker2;
99 
100     MultiDeviceKernel *pMultiDeviceVmeKernel = nullptr;
101     Kernel *pVmeKernel = nullptr;
102     bool skipVmeTest = false;
103 };
104 } // namespace NEO
105