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