Skip to content

Commit b681d4f

Browse files
Add cl_ext_immutable_memory_objects tests writing to and from buffer (#2432)
This change extends the test coverage for KhronosGroup/OpenCL-Docs#1280 The change tests: 1. Writing to immutable buffers. 2. Writing to buffer/image from immutable buffers. 3. Reading from immutable buffers. This change adds the following tests: 1. `test_negative_imagearraycopy` 2. `test_negative_imagearraycopy3d` 3. `test_immutable_bufferreadwriterect` 4. `test_immutable_arrayreadwrite` 5. `test_write_from_immutable_buffer_to_buffer` 6. `test_immutable_buffer_map_*` and extends the following tests: 1. `test_arrayimagecopy3d` 2. `test_arrayimagecopy` 3. `test_imagearraycopy3d` 4. `test_imagearraycopy` 5. `test_buffer_copy` 6. `test_buffer_partial_copy` Signed-off-by: Michael Rizkalla <michael.rizkalla@arm.com>
1 parent 02a3c7e commit b681d4f

File tree

11 files changed

+833
-45
lines changed

11 files changed

+833
-45
lines changed

test_conformance/basic/test_arrayimagecopy.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,33 @@ REGISTER_TEST(arrayimagecopy)
188188
{
189189
PASSIVE_REQUIRE_IMAGE_SUPPORT(device)
190190

191-
return test_arrayimagecommon(device, context, queue, CL_MEM_READ_WRITE,
192-
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
193-
test_arrayimagecopy_single_format);
191+
int error = test_arrayimagecommon(device, context, queue, CL_MEM_READ_WRITE,
192+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
193+
test_arrayimagecopy_single_format);
194+
if (is_extension_available(device, "cl_ext_immutable_memory_objects"))
195+
{
196+
error |= test_arrayimagecommon(
197+
device, context, queue, CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
198+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
199+
test_arrayimagecopy_single_format);
200+
}
201+
return error;
194202
}
195203

196204

197205
REGISTER_TEST(arrayimagecopy3d)
198206
{
199207
PASSIVE_REQUIRE_3D_IMAGE_SUPPORT(device)
200208

201-
return test_arrayimagecommon(device, context, queue, CL_MEM_READ_WRITE,
202-
CL_MEM_READ_ONLY, CL_MEM_OBJECT_IMAGE3D,
203-
test_arrayimagecopy_single_format);
209+
int error = test_arrayimagecommon(device, context, queue, CL_MEM_READ_WRITE,
210+
CL_MEM_READ_ONLY, CL_MEM_OBJECT_IMAGE3D,
211+
test_arrayimagecopy_single_format);
212+
if (is_extension_available(device, "cl_ext_immutable_memory_objects"))
213+
{
214+
error |= test_arrayimagecommon(
215+
device, context, queue, CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
216+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE3D,
217+
test_arrayimagecopy_single_format);
218+
}
219+
return error;
204220
}

test_conformance/basic/test_arrayreadwrite.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,36 @@ static int test_arrayreadwrite_impl(cl_device_id device, cl_context context,
7272
err = clEnqueueWriteBuffer(
7373
queue, buffer, CL_TRUE, offset * sizeof(cl_uint),
7474
sizeof(cl_uint) * cb, &reference_vals[offset], 0, nullptr, nullptr);
75-
test_error(err, "clEnqueueWriteBuffer failed");
75+
if (flags & CL_MEM_IMMUTABLE_EXT)
76+
{
77+
test_failure_error_ret(err, CL_INVALID_OPERATION,
78+
"clEnqueueWriteBuffer is expected to fail "
79+
"with CL_INVALID_OPERATION when the buffer "
80+
"is created with CL_MEM_IMMUTABLE_EXT",
81+
TEST_FAIL);
82+
}
83+
else
84+
{
85+
test_error(err, "clEnqueueWriteBuffer failed");
86+
}
7687

7788
err = clEnqueueReadBuffer(
7889
queue, buffer, CL_TRUE, offset * sizeof(cl_uint),
7990
cb * sizeof(cl_uint), &outptr[offset], 0, nullptr, nullptr);
8091
test_error(err, "clEnqueueReadBuffer failed");
8192

93+
const cl_uint* expected_buffer_values = nullptr;
94+
if (flags & CL_MEM_IMMUTABLE_EXT)
95+
{
96+
expected_buffer_values = inptr.data();
97+
}
98+
else
99+
{
100+
expected_buffer_values = reference_vals.data();
101+
}
82102
for (int j = offset; j < offset + cb; j++)
83103
{
84-
if (reference_vals[j] != outptr[j])
104+
if (expected_buffer_values[j] != outptr[j])
85105
{
86106
log_error("ARRAY read, write test failed\n");
87107
err = -1;
@@ -105,3 +125,11 @@ REGISTER_TEST(arrayreadwrite)
105125
return test_arrayreadwrite_impl(device, context, queue, num_elements,
106126
CL_MEM_READ_WRITE);
107127
}
128+
129+
REGISTER_TEST(immutable_arrayreadwrite)
130+
{
131+
REQUIRE_EXTENSION("cl_ext_immutable_memory_objects");
132+
133+
return test_arrayreadwrite_impl(device, context, queue, num_elements,
134+
CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR);
135+
}

test_conformance/basic/test_bufferreadwriterect.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
// limitations under the License.
1515
//
1616
#include "harness/compat.h"
17+
#include "errorHelpers.h"
1718

1819
#include <stdio.h>
1920
#include <stdlib.h>
@@ -194,6 +195,43 @@ int copy_region(size_t src, size_t soffset[3], size_t sregion[3], size_t dst, si
194195
return 0;
195196
}
196197

198+
int immutable_copy_region(size_t src, size_t soffset[3], size_t sregion[3],
199+
size_t dst, size_t doffset[3], size_t dregion[3])
200+
{
201+
202+
// Copy between cl buffers.
203+
size_t src_slice_pitch =
204+
(width[src] * height[src] != 1) ? width[src] * height[src] : 0;
205+
size_t dst_slice_pitch =
206+
(width[dst] * height[dst] != 1) ? width[dst] * height[dst] : 0;
207+
size_t src_row_pitch = width[src];
208+
209+
cl_int err;
210+
if (check_overlap_rect(soffset, doffset, sregion, src_row_pitch,
211+
src_slice_pitch))
212+
{
213+
log_info("Copy overlap reported, skipping copy buffer rect\n");
214+
return CL_SUCCESS;
215+
}
216+
else
217+
{
218+
err = clEnqueueCopyBufferRect(gQueue, buffer[src], buffer[dst], soffset,
219+
doffset, sregion, /*dregion,*/
220+
width[src], src_slice_pitch, width[dst],
221+
dst_slice_pitch, 0, nullptr, nullptr);
222+
if (err != CL_INVALID_OPERATION)
223+
{
224+
log_error(
225+
"clEnqueueCopyBufferRect should return "
226+
"CL_INVALID_OPERATION but returned %s between %zu and %zu",
227+
IGetErrorString(err), src, dst);
228+
return TEST_FAIL;
229+
}
230+
}
231+
232+
return TEST_PASS;
233+
}
234+
197235
// This function compares the destination region in the buffer pointed
198236
// to by device, to the source region of the specified verify buffer.
199237
int verify_region(BufferType* device, size_t src, size_t soffset[3], size_t sregion[3], size_t dst, size_t doffset[3]) {
@@ -337,6 +375,32 @@ int write_region(size_t src, size_t soffset[3], size_t sregion[3], size_t dst, s
337375
return 0;
338376
}
339377

378+
int immutable_write_region(size_t src, size_t soffset[3], size_t sregion[3],
379+
size_t dst, size_t doffset[3], size_t dregion[3])
380+
{
381+
initialize_image(tmp_buffer, tmp_buffer_size, 1, 1, mt);
382+
383+
size_t src_slice_pitch =
384+
(width[src] * height[src] != 1) ? width[src] * height[src] : 0;
385+
size_t dst_slice_pitch =
386+
(width[dst] * height[dst] != 1) ? width[dst] * height[dst] : 0;
387+
388+
cl_int error = clEnqueueWriteBufferRect(
389+
gQueue, buffer[dst], CL_TRUE, doffset, soffset, dregion, width[dst],
390+
dst_slice_pitch, width[src], src_slice_pitch, tmp_buffer, 0, nullptr,
391+
nullptr);
392+
393+
if (error != CL_INVALID_OPERATION)
394+
{
395+
log_error("clEnqueueWriteBufferRect should return CL_INVALID_OPERATION "
396+
"but retured %s between %zu and %zu",
397+
IGetErrorString(error), src, dst);
398+
return TEST_FAIL;
399+
}
400+
401+
return TEST_PASS;
402+
}
403+
340404
void CL_CALLBACK mem_obj_destructor_callback( cl_mem, void *data )
341405
{
342406
free( data );
@@ -591,3 +655,16 @@ REGISTER_TEST(bufferreadwriterect)
591655
device, context, queue, num_elements,
592656
CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, test_functions);
593657
}
658+
659+
REGISTER_TEST(immutable_bufferreadwriterect)
660+
{
661+
REQUIRE_EXTENSION("cl_ext_immutable_memory_objects");
662+
663+
TestFunctions test_functions;
664+
test_functions.copy = immutable_copy_region;
665+
test_functions.read = read_verify_region;
666+
test_functions.write = immutable_write_region;
667+
return test_bufferreadwriterect_impl(
668+
device, context, queue, num_elements,
669+
CL_MEM_USE_HOST_PTR | CL_MEM_IMMUTABLE_EXT, test_functions);
670+
}

test_conformance/basic/test_imagearraycopy.cpp

Lines changed: 121 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,82 @@ using test_function_t = int (*)(cl_device_id, cl_context, cl_command_queue,
2727
cl_mem_flags, cl_mem_flags, cl_mem_object_type,
2828
const cl_image_format *);
2929

30+
static int test_negative_imagearraycopy_single_format(
31+
cl_device_id device, cl_context context, cl_command_queue queue,
32+
cl_mem_flags image_flags, cl_mem_flags buffer_flags,
33+
cl_mem_object_type image_type, const cl_image_format *format)
34+
{
35+
std::unique_ptr<cl_uchar, decltype(&free)> bufptr{ nullptr, free },
36+
imgptr{ nullptr, free };
37+
clMemWrapper image;
38+
clMemWrapper buffer;
39+
const size_t img_width = 512;
40+
const size_t img_height = 512;
41+
const size_t img_depth = (image_type == CL_MEM_OBJECT_IMAGE3D) ? 32 : 1;
42+
size_t elem_size;
43+
size_t buffer_size;
44+
cl_int err;
45+
RandomSeed seed(gRandomSeed);
46+
47+
const size_t origin[3] = { 0, 0, 0 },
48+
region[3] = { img_width, img_height, img_depth };
49+
50+
log_info("Testing %s %s\n",
51+
GetChannelOrderName(format->image_channel_order),
52+
GetChannelTypeName(format->image_channel_data_type));
53+
54+
elem_size = get_pixel_size(format);
55+
buffer_size =
56+
sizeof(cl_uchar) * elem_size * img_width * img_height * img_depth;
57+
58+
if (image_flags & CL_MEM_USE_HOST_PTR || image_flags & CL_MEM_COPY_HOST_PTR)
59+
{
60+
imgptr.reset(static_cast<cl_uchar *>(
61+
create_random_data(kUChar, seed, buffer_size)));
62+
}
63+
64+
bufptr.reset(
65+
static_cast<cl_uchar *>(create_random_data(kUChar, seed, buffer_size)));
66+
67+
if (CL_MEM_OBJECT_IMAGE2D == image_type)
68+
{
69+
image = create_image_2d(context, image_flags, format, img_width,
70+
img_height, 0, imgptr.get(), &err);
71+
}
72+
else
73+
{
74+
image =
75+
create_image_3d(context, image_flags, format, img_width, img_height,
76+
img_depth, 0, 0, imgptr.get(), &err);
77+
}
78+
test_error(err, "create_image_xd failed");
79+
80+
if (!(image_flags & CL_MEM_USE_HOST_PTR
81+
|| image_flags & CL_MEM_COPY_HOST_PTR))
82+
{
83+
imgptr.reset(static_cast<cl_uchar *>(
84+
create_random_data(kUChar, seed, buffer_size)));
85+
86+
err = clEnqueueWriteImage(queue, image, CL_TRUE, origin, region, 0, 0,
87+
imgptr.get(), 0, nullptr, nullptr);
88+
test_error(err, "clEnqueueWriteImage failed");
89+
}
90+
91+
buffer =
92+
clCreateBuffer(context, buffer_flags, buffer_size, bufptr.get(), &err);
93+
test_error(err, "clCreateBuffer failed");
94+
95+
err = clEnqueueCopyImageToBuffer(queue, image, buffer, origin, region, 0, 0,
96+
nullptr, nullptr);
97+
test_failure_error_ret(
98+
err, CL_INVALID_OPERATION,
99+
"clEnqueueCopyImageToBuffer should return CL_INVALID_OPERATION when: "
100+
"\" dst_buffer is created with CL_MEM_IMMUTABLE_EXT flag\"",
101+
TEST_FAIL);
102+
103+
return TEST_PASS;
104+
}
105+
30106
static int test_imagearraycopy_single_format(
31107
cl_device_id device, cl_context context, cl_command_queue queue,
32108
cl_mem_flags image_flags, cl_mem_flags buffer_flags,
@@ -188,17 +264,57 @@ REGISTER_TEST(imagearraycopy)
188264
{
189265
PASSIVE_REQUIRE_IMAGE_SUPPORT(device)
190266

191-
return test_imagearraycommon(device, context, queue, CL_MEM_READ_WRITE,
192-
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
193-
test_imagearraycopy_single_format);
267+
int error = test_imagearraycommon(device, context, queue, CL_MEM_READ_WRITE,
268+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
269+
test_imagearraycopy_single_format);
270+
271+
if (is_extension_available(device, "cl_ext_immutable_memory_objects"))
272+
{
273+
error |= test_imagearraycommon(
274+
device, context, queue, CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
275+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE2D,
276+
test_imagearraycopy_single_format);
277+
}
278+
return error;
194279
}
195280

196281

197282
REGISTER_TEST(imagearraycopy3d)
198283
{
199284
PASSIVE_REQUIRE_3D_IMAGE_SUPPORT(device)
200285

286+
int error = test_imagearraycommon(device, context, queue, CL_MEM_READ_ONLY,
287+
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE3D,
288+
test_imagearraycopy_single_format);
289+
290+
if (is_extension_available(device, "cl_ext_immutable_memory_objects"))
291+
{
292+
error |= test_imagearraycommon(
293+
device, context, queue, CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
294+
CL_MEM_READ_ONLY, CL_MEM_OBJECT_IMAGE3D,
295+
test_imagearraycopy_single_format);
296+
}
297+
return error;
298+
}
299+
300+
REGISTER_TEST(negative_imagearraycopy)
301+
{
302+
PASSIVE_REQUIRE_IMAGE_SUPPORT(device);
303+
REQUIRE_EXTENSION("cl_ext_immutable_memory_objects");
304+
305+
return test_imagearraycommon(device, context, queue, CL_MEM_READ_WRITE,
306+
CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
307+
CL_MEM_OBJECT_IMAGE2D,
308+
test_negative_imagearraycopy_single_format);
309+
}
310+
311+
REGISTER_TEST(negative_imagearraycopy3d)
312+
{
313+
PASSIVE_REQUIRE_3D_IMAGE_SUPPORT(device);
314+
REQUIRE_EXTENSION("cl_ext_immutable_memory_objects");
315+
201316
return test_imagearraycommon(device, context, queue, CL_MEM_READ_ONLY,
202-
CL_MEM_READ_WRITE, CL_MEM_OBJECT_IMAGE3D,
203-
test_imagearraycopy_single_format);
317+
CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
318+
CL_MEM_OBJECT_IMAGE3D,
319+
test_negative_imagearraycopy_single_format);
204320
}

test_conformance/buffers/main.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,24 @@
1919

2020
#include "testBase.h"
2121

22-
const cl_mem_flags flag_set[] = {
23-
CL_MEM_ALLOC_HOST_PTR,
24-
CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR,
25-
CL_MEM_USE_HOST_PTR,
26-
CL_MEM_COPY_HOST_PTR,
27-
0
28-
};
22+
const cl_mem_flags flag_set[] = { CL_MEM_ALLOC_HOST_PTR,
23+
CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR,
24+
CL_MEM_USE_HOST_PTR,
25+
CL_MEM_COPY_HOST_PTR,
26+
0,
27+
CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR,
28+
CL_MEM_IMMUTABLE_EXT | CL_MEM_COPY_HOST_PTR,
29+
CL_MEM_IMMUTABLE_EXT | CL_MEM_COPY_HOST_PTR
30+
| CL_MEM_ALLOC_HOST_PTR };
2931
const char* flag_set_names[] = {
3032
"CL_MEM_ALLOC_HOST_PTR",
3133
"CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR",
3234
"CL_MEM_USE_HOST_PTR",
3335
"CL_MEM_COPY_HOST_PTR",
34-
"0"
36+
"0",
37+
"CL_MEM_IMMUTABLE_EXT | CL_MEM_USE_HOST_PTR",
38+
"CL_MEM_IMMUTABLE_EXT | CL_MEM_COPY_HOST_PTR",
39+
"CL_MEM_IMMUTABLE_EXT | CL_MEM_COPY_HOST_PTR | CL_MEM_ALLOC_HOST_PTR",
3540
};
3641

3742
int main( int argc, const char *argv[] )

test_conformance/buffers/testBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@
2525
extern const cl_mem_flags flag_set[];
2626
extern const char* flag_set_names[];
2727

28-
#define NUM_FLAGS 5
28+
#define NUM_FLAGS 8
2929

3030
#endif // _testBase_h

0 commit comments

Comments
 (0)