4
4
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5
5
#include < uur/fixtures.h>
6
6
7
- using urEnqueueMemBufferFillTest = uur::urMemBufferQueueTest;
8
- UUR_INSTANTIATE_DEVICE_TEST_SUITE_P (urEnqueueMemBufferFillTest);
7
+ struct testParametersFill {
8
+ size_t size;
9
+ size_t pattern_size;
10
+ };
11
+
12
+ template <typename T>
13
+ inline std::string
14
+ printFillTestString (const testing::TestParamInfo<typename T::ParamType> &info) {
15
+ const auto device_handle = std::get<0 >(info.param );
16
+ const auto platform_device_name =
17
+ uur::GetPlatformAndDeviceName (device_handle);
18
+ std::stringstream test_name;
19
+ test_name << platform_device_name << " __size__"
20
+ << std::get<1 >(info.param ).size << " __patternSize__"
21
+ << std::get<1 >(info.param ).pattern_size ;
22
+ return test_name.str ();
23
+ }
24
+
25
+ struct urEnqueueMemBufferFillTest
26
+ : uur::urQueueTestWithParam<testParametersFill> {
27
+ void SetUp () override {
28
+ UUR_RETURN_ON_FATAL_FAILURE (
29
+ urQueueTestWithParam<testParametersFill>::SetUp ());
30
+ size = std::get<1 >(GetParam ()).size ;
31
+ pattern_size = std::get<1 >(GetParam ()).pattern_size ;
32
+ pattern = std::vector<uint8_t >(pattern_size);
33
+ uur::generateMemFillPattern (pattern);
34
+ ASSERT_SUCCESS (urMemBufferCreate (this ->context , UR_MEM_FLAG_READ_WRITE,
35
+ size, nullptr , &buffer));
36
+ }
37
+
38
+ void TearDown () override {
39
+ if (buffer) {
40
+ EXPECT_SUCCESS (urMemRelease (buffer));
41
+ }
42
+ UUR_RETURN_ON_FATAL_FAILURE (
43
+ urQueueTestWithParam<testParametersFill>::TearDown ());
44
+ }
45
+
46
+ void verifyData (std::vector<uint8_t > &output, size_t verify_size) {
47
+ size_t pattern_index = 0 ;
48
+ for (size_t i = 0 ; i < verify_size; ++i) {
49
+ ASSERT_EQ (output[i], pattern[pattern_index])
50
+ << " Result mismatch at index: " << i;
51
+
52
+ ++pattern_index;
53
+ if (pattern_index % pattern_size == 0 ) {
54
+ pattern_index = 0 ;
55
+ }
56
+ }
57
+ }
58
+
59
+ ur_mem_handle_t buffer = nullptr ;
60
+ std::vector<uint8_t > pattern;
61
+ size_t size;
62
+ size_t pattern_size;
63
+ };
64
+
65
+ static std::vector<testParametersFill> test_cases{
66
+ /* Everything set to 1 */
67
+ {1 , 1 },
68
+ /* pattern_size == size */
69
+ {256 , 256 },
70
+ /* pattern_size < size */
71
+ {1024 , 256 },
72
+ /* pattern sizes corresponding to some common scalar and vector types */
73
+ {256 , 4 },
74
+ {256 , 8 },
75
+ {256 , 16 },
76
+ {256 , 32 }};
77
+
78
+ UUR_TEST_SUITE_P (urEnqueueMemBufferFillTest, testing::ValuesIn(test_cases),
79
+ printFillTestString<urEnqueueMemBufferFillTest>);
9
80
10
81
TEST_P (urEnqueueMemBufferFillTest, Success) {
11
- const uint32_t pattern = 0xdeadbeef ;
12
- ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, &pattern,
13
- sizeof (pattern), 0 , size, 0 , nullptr ,
82
+ ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, pattern.data (),
83
+ pattern_size, 0 , size, 0 , nullptr ,
14
84
nullptr ));
15
- std::vector<uint32_t > output (count , 1 );
85
+ std::vector<uint8_t > output (size , 1 );
16
86
ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, buffer, true , 0 , size,
17
87
output.data (), 0 , nullptr , nullptr ));
18
- for (unsigned i = 0 ; i < count; ++i) {
19
- ASSERT_EQ (output[i], pattern) << " Result mismatch at index: " << i;
20
- }
88
+ verifyData (output, size);
21
89
}
22
-
23
90
TEST_P (urEnqueueMemBufferFillTest, SuccessPartialFill) {
24
- const std::vector<uint32_t > input (count, 42 );
91
+ if (size == 1 ) {
92
+ // Can't partially fill one byte
93
+ GTEST_SKIP ();
94
+ }
95
+ const std::vector<uint8_t > input (size, 0 );
25
96
ASSERT_SUCCESS (urEnqueueMemBufferWrite (queue, buffer, true , 0 , size,
26
97
input.data (), 0 , nullptr , nullptr ));
27
- const uint32_t pattern = 0xdeadbeef ;
28
98
const size_t partial_fill_size = size / 2 ;
29
- const size_t fill_count = count / 2 ;
30
- ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, &pattern,
31
- sizeof (pattern), 0 , partial_fill_size,
32
- 0 , nullptr , nullptr ));
33
- std::vector<uint32_t > output (count, 1 );
99
+ // Make sure we don't end up with pattern_size > size
100
+ pattern_size = pattern_size / 2 ;
101
+ ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, pattern.data (),
102
+ pattern_size, 0 , partial_fill_size, 0 ,
103
+ nullptr , nullptr ));
104
+ std::vector<uint8_t > output (size, 1 );
34
105
ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, buffer, true , 0 , size,
35
106
output.data (), 0 , nullptr , nullptr ));
36
- for (size_t i = 0 ; i < count - fill_count; ++i) {
37
- ASSERT_EQ (output[i], pattern) << " Result mismatch at index: " << i;
38
- }
107
+ // Check the first half matches the pattern and the second half remains untouched.
108
+ verifyData (output, partial_fill_size);
39
109
40
- for (size_t i = fill_count ; i < count ; ++i) {
41
- ASSERT_EQ (output[i], 42 ) << " Result mismatch at index: " << i;
110
+ for (size_t i = partial_fill_size ; i < size ; ++i) {
111
+ ASSERT_EQ (output[i], input[i] ) << " Result mismatch at index: " << i;
42
112
}
43
113
}
44
114
45
115
TEST_P (urEnqueueMemBufferFillTest, SuccessOffset) {
46
- const std::vector<uint32_t > input (count, 42 );
116
+ if (size == 1 ) {
117
+ // No room for an offset
118
+ GTEST_SKIP ();
119
+ }
120
+ const std::vector<uint8_t > input (size, 0 );
47
121
ASSERT_SUCCESS (urEnqueueMemBufferWrite (queue, buffer, true , 0 , size,
48
122
input.data (), 0 , nullptr , nullptr ));
49
- const uint32_t pattern = 0xdeadbeef ;
123
+
50
124
const size_t offset_size = size / 2 ;
51
- const size_t offset_count = count / 2 ;
52
- ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, &pattern,
53
- sizeof (pattern), offset_size,
125
+ // Make sure we don't end up with pattern_size > size
126
+ pattern_size = pattern_size / 2 ;
127
+ ASSERT_SUCCESS (urEnqueueMemBufferFill (queue, buffer, pattern.data (),
128
+ pattern_size, offset_size,
54
129
offset_size, 0 , nullptr , nullptr ));
55
- std::vector<uint32_t > output (count, 1 );
56
- ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, buffer, true , 0 , size,
57
- output.data (), 0 , nullptr , nullptr ));
58
- for (size_t i = 0 ; i < offset_count; ++i) {
59
- ASSERT_EQ (output[i], 42 ) << " Result mismatch at index: " << i;
60
- }
61
130
62
- for (size_t i = offset_count; i < count; ++i) {
63
- ASSERT_EQ (output[i], pattern) << " Result mismatch at index: " << i;
131
+ // Check the second half matches the pattern and the first half remains untouched.
132
+ std::vector<uint8_t > output (offset_size);
133
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, buffer, true , offset_size,
134
+ offset_size, output.data (), 0 ,
135
+ nullptr , nullptr ));
136
+ verifyData (output, offset_size);
137
+
138
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, buffer, true , 0 , offset_size,
139
+ output.data (), 0 , nullptr , nullptr ));
140
+ for (size_t i = 0 ; i < offset_size; ++i) {
141
+ ASSERT_EQ (output[i], input[i]) << " Result mismatch at index: " << i;
64
142
}
65
143
}
66
144
67
- TEST_P (urEnqueueMemBufferFillTest, InvalidNullHandleQueue) {
145
+ using urEnqueueMemBufferFillNegativeTest = uur::urMemBufferQueueTest;
146
+
147
+ UUR_INSTANTIATE_DEVICE_TEST_SUITE_P (urEnqueueMemBufferFillNegativeTest);
148
+
149
+ TEST_P (urEnqueueMemBufferFillNegativeTest, InvalidNullHandleQueue) {
68
150
const uint32_t pattern = 0xdeadbeef ;
69
151
ASSERT_EQ_RESULT (UR_RESULT_ERROR_INVALID_NULL_HANDLE,
70
152
urEnqueueMemBufferFill (nullptr , buffer, &pattern,
71
153
sizeof (pattern), 0 , size, 0 ,
72
154
nullptr , nullptr ));
73
155
}
74
156
75
- TEST_P (urEnqueueMemBufferFillTest , InvalidNullHandleBuffer) {
157
+ TEST_P (urEnqueueMemBufferFillNegativeTest , InvalidNullHandleBuffer) {
76
158
const uint32_t pattern = 0xdeadbeef ;
77
159
ASSERT_EQ_RESULT (UR_RESULT_ERROR_INVALID_NULL_HANDLE,
78
160
urEnqueueMemBufferFill (queue, nullptr , &pattern,
79
161
sizeof (pattern), 0 , size, 0 ,
80
162
nullptr , nullptr ));
81
163
}
82
164
83
- TEST_P (urEnqueueMemBufferFillTest , InvalidNullHandlePointerPattern) {
165
+ TEST_P (urEnqueueMemBufferFillNegativeTest , InvalidNullHandlePointerPattern) {
84
166
ASSERT_EQ_RESULT (UR_RESULT_ERROR_INVALID_NULL_POINTER,
85
167
urEnqueueMemBufferFill (queue, buffer, nullptr ,
86
168
sizeof (uint32_t ), 0 , size, 0 ,
87
169
nullptr , nullptr ));
88
170
}
89
171
90
- TEST_P (urEnqueueMemBufferFillTest , InvalidNullPtrEventWaitList) {
172
+ TEST_P (urEnqueueMemBufferFillNegativeTest , InvalidNullPtrEventWaitList) {
91
173
const uint32_t pattern = 0xdeadbeef ;
92
174
ASSERT_EQ_RESULT (urEnqueueMemBufferFill (queue, buffer, &pattern,
93
175
sizeof (uint32_t ), 0 , size, 1 ,
@@ -103,7 +185,7 @@ TEST_P(urEnqueueMemBufferFillTest, InvalidNullPtrEventWaitList) {
103
185
UR_RESULT_ERROR_INVALID_EVENT_WAIT_LIST);
104
186
}
105
187
106
- TEST_P (urEnqueueMemBufferFillTest , InvalidSize) {
188
+ TEST_P (urEnqueueMemBufferFillNegativeTest , InvalidSize) {
107
189
const uint32_t pattern = 0xdeadbeef ;
108
190
ASSERT_EQ_RESULT (UR_RESULT_ERROR_INVALID_SIZE,
109
191
urEnqueueMemBufferFill (queue, buffer, &pattern,
0 commit comments