1 /*
2 * Copyright (C) 2020-2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "shared/test/common/helpers/state_base_address_tests.h"
9
10 using IsBetweenSklAndTgllp = IsWithinProducts<IGFX_SKYLAKE, IGFX_TIGERLAKE_LP>;
11
HWTEST2_F(SBATest,WhenAppendStateBaseAddressParametersIsCalledThenSBACmdHasBindingSurfaceStateProgrammed,IsBetweenSklAndTgllp)12 HWTEST2_F(SBATest, WhenAppendStateBaseAddressParametersIsCalledThenSBACmdHasBindingSurfaceStateProgrammed, IsBetweenSklAndTgllp) {
13 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
14
15 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
16
17 STATE_BASE_ADDRESS stateBaseAddress;
18 stateBaseAddress.setBindlessSurfaceStateSize(0);
19 stateBaseAddress.setBindlessSurfaceStateBaseAddress(0);
20 stateBaseAddress.setBindlessSurfaceStateBaseAddressModifyEnable(false);
21
22 StateBaseAddressHelper<FamilyType>::appendStateBaseAddressParameters(
23 &stateBaseAddress,
24 &ssh,
25 false,
26 0,
27 nullptr,
28 false,
29 MemoryCompressionState::NotApplicable,
30 true,
31 false,
32 1u);
33
34 EXPECT_EQ(ssh.getMaxAvailableSpace() / 64 - 1, stateBaseAddress.getBindlessSurfaceStateSize());
35 EXPECT_EQ(ssh.getHeapGpuBase(), stateBaseAddress.getBindlessSurfaceStateBaseAddress());
36 EXPECT_TRUE(stateBaseAddress.getBindlessSurfaceStateBaseAddressModifyEnable());
37 }
38
HWTEST2_F(SBATest,WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBindingSurfaceStateProgrammed,IsAtLeastSkl)39 HWTEST2_F(SBATest, WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBindingSurfaceStateProgrammed, IsAtLeastSkl) {
40 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
41
42 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
43
44 STATE_BASE_ADDRESS stateBaseAddress;
45 stateBaseAddress.setBindlessSurfaceStateSize(0);
46 stateBaseAddress.setBindlessSurfaceStateBaseAddress(0);
47 stateBaseAddress.setBindlessSurfaceStateBaseAddressModifyEnable(false);
48
49 STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(commandStream.getSpace(0));
50 *cmd = stateBaseAddress;
51
52 StateBaseAddressHelper<FamilyType>::programStateBaseAddress(
53 cmd,
54 nullptr,
55 nullptr,
56 &ssh,
57 0,
58 false,
59 0,
60 0,
61 0,
62 0,
63 false,
64 false,
65 pDevice->getGmmHelper(),
66 true,
67 MemoryCompressionState::NotApplicable,
68 false,
69 1u);
70
71 EXPECT_EQ(ssh.getMaxAvailableSpace() / 64 - 1, cmd->getBindlessSurfaceStateSize());
72 EXPECT_EQ(ssh.getHeapGpuBase(), cmd->getBindlessSurfaceStateBaseAddress());
73 EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
74 }
75
76 using SbaForBindlessTests = Test<DeviceFixture>;
77
HWTEST2_F(SbaForBindlessTests,givenGlobalBindlessBaseAddressWhenProgramStateBaseAddressThenSbaProgrammedCorrectly,IsAtLeastSkl)78 HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenProgramStateBaseAddressThenSbaProgrammedCorrectly, IsAtLeastSkl) {
79 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
80
81 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
82
83 uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
84
85 StackVec<char, 4096> buffer(4096);
86 NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
87
88 STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(cmdStream.getSpace(0));
89 StateBaseAddressHelper<FamilyType>::programStateBaseAddress(
90 cmd,
91 nullptr,
92 nullptr,
93 nullptr,
94 0,
95 false,
96 0,
97 0,
98 0,
99 globalBindlessHeapsBaseAddress,
100 false,
101 true,
102 pDevice->getGmmHelper(),
103 true,
104 MemoryCompressionState::NotApplicable,
105 false,
106 1u);
107 EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
108 EXPECT_EQ(cmd->getBindlessSurfaceStateBaseAddress(), globalBindlessHeapsBaseAddress);
109
110 auto surfaceStateCount = StateBaseAddressHelper<FamilyType>::getMaxBindlessSurfaceStates();
111 EXPECT_EQ(surfaceStateCount, cmd->getBindlessSurfaceStateSize());
112 }
113
114 using IohSupported = IsWithinGfxCore<GFXCORE_FAMILY::IGFX_GEN9_CORE, GFXCORE_FAMILY::IGFX_GEN12LP_CORE>;
115
HWTEST2_F(SbaForBindlessTests,givenGlobalBindlessBaseAddressWhenPassingIndirectBaseAddressThenIndirectBaseAddressIsSet,IohSupported)116 HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenPassingIndirectBaseAddressThenIndirectBaseAddressIsSet, IohSupported) {
117 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
118
119 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
120
121 uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
122 uint64_t indirectObjectBaseAddress = 0x12340000;
123
124 StackVec<char, 4096> buffer(4096);
125 NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
126
127 STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(cmdStream.getSpace(0));
128 StateBaseAddressHelper<FamilyType>::programStateBaseAddress(
129 cmd,
130 nullptr,
131 nullptr,
132 nullptr,
133 0,
134 false,
135 0,
136 indirectObjectBaseAddress,
137 0,
138 globalBindlessHeapsBaseAddress,
139 false,
140 true,
141 pDevice->getGmmHelper(),
142 true,
143 MemoryCompressionState::NotApplicable,
144 false,
145 1u);
146
147 EXPECT_EQ(cmd->getIndirectObjectBaseAddress(), indirectObjectBaseAddress);
148 }
149
HWTEST2_F(SBATest,givenSbaWhenOverrideBindlessSurfaceBaseIsFalseThenBindlessSurfaceBaseIsNotSet,IsAtLeastSkl)150 HWTEST2_F(SBATest, givenSbaWhenOverrideBindlessSurfaceBaseIsFalseThenBindlessSurfaceBaseIsNotSet, IsAtLeastSkl) {
151 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
152
153 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
154
155 STATE_BASE_ADDRESS stateBaseAddress;
156 stateBaseAddress.setBindlessSurfaceStateSize(0);
157 stateBaseAddress.setBindlessSurfaceStateBaseAddress(0);
158 stateBaseAddress.setBindlessSurfaceStateBaseAddressModifyEnable(false);
159
160 StateBaseAddressHelper<FamilyType>::appendStateBaseAddressParameters(
161 &stateBaseAddress,
162 &ssh,
163 false,
164 0,
165 pDevice->getRootDeviceEnvironment().getGmmHelper(),
166 false,
167 MemoryCompressionState::NotApplicable,
168 false,
169 false,
170 1u);
171
172 EXPECT_EQ(0u, stateBaseAddress.getBindlessSurfaceStateBaseAddress());
173 }
174
HWTEST2_F(SBATest,givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurfaceBaseIsGlobalHeapBase,IsAtLeastSkl)175 HWTEST2_F(SBATest, givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurfaceBaseIsGlobalHeapBase, IsAtLeastSkl) {
176 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
177
178 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
179
180 uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
181
182 StackVec<char, 4096> buffer(4096);
183 NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
184
185 STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(cmdStream.getSpace(0));
186 StateBaseAddressHelper<FamilyType>::programStateBaseAddress(
187 cmd,
188 nullptr,
189 nullptr,
190 &ssh,
191 0,
192 false,
193 0,
194 0,
195 0,
196 globalBindlessHeapsBaseAddress,
197 false,
198 true,
199 pDevice->getGmmHelper(),
200 true,
201 MemoryCompressionState::NotApplicable,
202 false,
203 1u);
204 EXPECT_EQ(cmd->getBindlessSurfaceStateBaseAddress(), globalBindlessHeapsBaseAddress);
205 }
HWTEST2_F(SBATest,givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSurfaceBaseIsSshBase,IsAtLeastSkl)206 HWTEST2_F(SBATest, givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSurfaceBaseIsSshBase, IsAtLeastSkl) {
207 using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
208
209 EXPECT_NE(IGFX_BROADWELL, ::productFamily);
210
211 uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
212
213 StackVec<char, 4096> buffer(4096);
214 NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
215
216 STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(cmdStream.getSpace(0));
217 StateBaseAddressHelper<FamilyType>::programStateBaseAddress(
218 cmd,
219 nullptr,
220 nullptr,
221 &ssh,
222 0,
223 false,
224 0,
225 0,
226 0,
227 globalBindlessHeapsBaseAddress,
228 false,
229 false,
230 pDevice->getGmmHelper(),
231 true,
232 MemoryCompressionState::NotApplicable,
233 false,
234 1u);
235 EXPECT_EQ(ssh.getHeapGpuBase(), cmd->getBindlessSurfaceStateBaseAddress());
236 }
237