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:
alan-baker
2020-03-11 06:09:51 -04:00
committed by GitHub
parent 9d5dc202cb
commit 5ec04da102
3 changed files with 43 additions and 0 deletions

View File

@@ -105,6 +105,7 @@ test_definition test_list[] = {
ADD_TEST( retain_queue_multiple ),
ADD_TEST( retain_mem_object_single ),
ADD_TEST( retain_mem_object_multiple ),
ADD_TEST( retain_mem_object_set_kernel_arg ),
ADD_TEST( min_data_type_align_size_alignment ),
ADD_TEST( mem_object_destructor_callback ),

View File

@@ -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_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_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_mem_object_destructor_callback(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);

View File

@@ -232,3 +232,44 @@ int test_retain_mem_object_multiple(cl_device_id deviceID, cl_context context, c
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;
}