mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-25 16:29:03 +00:00
Add a test that clSetKernelArg does not retain the arg (#665)
* Add `retain_mem_object_set_kernel_arg` to test that calling clSetKernelArg with a cl_mem object does not retain that mem object
This commit is contained in:
@@ -105,6 +105,7 @@ test_definition test_list[] = {
|
|||||||
ADD_TEST( retain_queue_multiple ),
|
ADD_TEST( retain_queue_multiple ),
|
||||||
ADD_TEST( retain_mem_object_single ),
|
ADD_TEST( retain_mem_object_single ),
|
||||||
ADD_TEST( retain_mem_object_multiple ),
|
ADD_TEST( retain_mem_object_multiple ),
|
||||||
|
ADD_TEST( retain_mem_object_set_kernel_arg ),
|
||||||
ADD_TEST( min_data_type_align_size_alignment ),
|
ADD_TEST( min_data_type_align_size_alignment ),
|
||||||
|
|
||||||
ADD_TEST( mem_object_destructor_callback ),
|
ADD_TEST( mem_object_destructor_callback ),
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ extern int test_retain_queue_single(cl_device_id deviceID, cl_context con
|
|||||||
extern int test_retain_queue_multiple(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
extern int test_retain_queue_multiple(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
||||||
extern int test_retain_mem_object_single(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
extern int test_retain_mem_object_single(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
||||||
extern int test_retain_mem_object_multiple(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
extern int test_retain_mem_object_multiple(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
||||||
|
extern int test_retain_mem_object_set_kernel_arg(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
||||||
extern int test_min_data_type_align_size_alignment(cl_device_id device, cl_context context, cl_command_queue queue, int n_elems );
|
extern int test_min_data_type_align_size_alignment(cl_device_id device, cl_context context, cl_command_queue queue, int n_elems );
|
||||||
|
|
||||||
extern int test_mem_object_destructor_callback(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
extern int test_mem_object_destructor_callback(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
|
||||||
|
|||||||
@@ -232,3 +232,44 @@ int test_retain_mem_object_multiple(cl_device_id deviceID, cl_context context, c
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_retain_mem_object_set_kernel_arg(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
cl_mem buffer = nullptr;
|
||||||
|
cl_program program;
|
||||||
|
cl_kernel kernel;
|
||||||
|
static volatile uint32_t sValue;
|
||||||
|
sValue = 0;
|
||||||
|
auto callback = []( cl_mem, void * ) {
|
||||||
|
++sValue;
|
||||||
|
};
|
||||||
|
const char *testProgram[] = { "__kernel void sample_test(__global int *data){}" };
|
||||||
|
|
||||||
|
buffer = clCreateBuffer( context, CL_MEM_READ_ONLY, 32, NULL, &err );
|
||||||
|
test_error( err, "Unable to create buffer to test with" );
|
||||||
|
|
||||||
|
err = clSetMemObjectDestructorCallback( buffer, callback, nullptr );
|
||||||
|
test_error( err, "Unable to set destructor callback" );
|
||||||
|
|
||||||
|
err = create_single_kernel_helper( context, &program, nullptr, 1, testProgram, nullptr );
|
||||||
|
test_error( err, "Unable to build sample program" );
|
||||||
|
|
||||||
|
kernel = clCreateKernel( program, "sample_test", &err );
|
||||||
|
test_error( err, "Unable to create sample_test kernel" );
|
||||||
|
|
||||||
|
err = clSetKernelArg( kernel, 0, sizeof(cl_mem), &buffer );
|
||||||
|
test_error( err, "Unable to set kernel argument" );
|
||||||
|
|
||||||
|
err = clReleaseMemObject( buffer );
|
||||||
|
test_error( err, "Unable to release buffer" );
|
||||||
|
|
||||||
|
// Spin waiting for the release to finish. If you don't call the mem_destructor_callback, you will not
|
||||||
|
// pass the test. bugzilla 6316
|
||||||
|
while (sValue == 0) { }
|
||||||
|
|
||||||
|
clReleaseKernel( kernel );
|
||||||
|
clReleaseProgram( program );
|
||||||
|
|
||||||
|
// If we got this far, we succeeded.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user