blob: 1bc04f5006fa1ebf2425e7e1c6b6666ddbdeb7b2 [file] [log] [blame]
#define TEST_CL2
#define CL_HPP_UNIT_TEST_ENABLE
#define CL_HPP_USE_CL_SUB_GROUPS_KHR
// Want to support 2.2 but also test that 1.x is ok
#define CL_HPP_TARGET_OPENCL_VERSION 220
#define CL_HPP_MINIMUM_OPENCL_VERSION 100
extern "C" {
// Headers required to make unity use mocks correctly
#include <unity.h>
#include <cmock.h>
#include "Mockcl.h"
#include <string.h>
// Declarations for the benefit of the runner generator
// to import tests from test_clhpp.cpp
// Saves duplication of tests and the runner generator
// does not process through the include below
void testCompareExchange();
void testFence();
void testCopyContextNonNull();
void testMoveAssignContextNonNull();
void testMoveAssignContextNull();
void testMoveConstructContextNonNull();
void testMoveConstructContextNull();
void testContextGetDevices1_1();
void testContextGetDevices1_2();
void testContextFromType();
void testMoveAssignCommandQueueNonNull();
void testMoveAssignCommandQueueNull();
void testMoveConstructCommandQueueNonNull();
void testMoveConstructCommandQueueNull();
void testCommandQueueGetContext();
void testCommandQueueGetDevice1_1();
void testCommandQueueGetDevice1_2();
void testCommandQueueFromSpecifiedContext();
void testCopyDeviceNonNull1_1();
void testCopyDeviceNonNull1_2();
void testCopyDeviceFromNull1_1();
void testCopyDeviceFromNull1_2();
void testCopyDeviceToNull1_1();
void testCopyDeviceToNull1_2();
void testCopyDeviceSelf();
void testAssignDeviceNull();
void testMoveAssignDeviceNonNull();
void testMoveAssignDeviceNull();
void testMoveConstructDeviceNonNull();
void testMoveConstructDeviceNull();
void testDestroyDevice1_1();
void testDestroyDevice1_2();
void testPlatformWithZeroDevices();
void testMoveAssignBufferNonNull();
void testMoveAssignBufferNull();
void testMoveConstructBufferNonNull();
void testMoveConstructBufferNull();
void testBufferConstructorContextIterator();
void testBufferConstructorQueueIterator();
void testGetImageInfoBuffer();
void testGetImageInfoBufferNull();
void testGetImageInfoBufferOverwrite();
void testConstructImageFromBuffer();
void testMoveAssignImage2DNonNull();
void testMoveAssignImage2DNull();
void testMoveConstructImage2DNonNull();
void testMoveConstructImage2DNull();
void testCreateImage2D_1_1();
void testCreateImage2D_1_2();
void testMoveAssignImage3DNonNull();
void testMoveAssignImage3DNull();
void testMoveConstructImage3DNonNull();
void testMoveConstructImage3DNull();
void testCreateImage3D_1_1();
void testCreateImage3D_1_2();
void testMoveAssignKernelNonNull();
void testMoveAssignKernelNull();
void testMoveConstructKernelNonNull();
void testMoveConstructKernelNull();
void testKernelSetArgScalar();
void testKernelSetArgVector();
void testKernelSetArgMem();
void testKernelSetArgLocal();
void testCopyHostToBuffer();
void testGetBuildInfo();
void testGetSupportedImageFormats();
void testCreateSubDevice();
void testGetContextInfoDevices();
void testSetProgramReleaseCallback();
void testSetProgramSpecializationConstantScalar();
void testSetProgramSpecializationConstantBool();
void testSetProgramSpecializationConstantPointer();
} // extern "C"
#include "test_clhpp.cpp"
extern "C" {
static cl_mem clCreateImage_testCreateImage2DFromBuffer_2_0(
cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
const cl_image_desc *image_desc,
void *host_ptr,
cl_int *errcode_ret,
int num_calls)
{
TEST_ASSERT_NOT_NULL(image_format);
TEST_ASSERT_NOT_NULL(image_desc);
TEST_ASSERT_NULL(host_ptr);
TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
// Return the passed buffer as the cl_mem and success for the error code
if (errcode_ret) {
*errcode_ret = CL_SUCCESS;
}
return image_desc->buffer;
}
void testCreateImage2DFromBuffer_2_0()
{
clGetContextInfo_StubWithCallback(clGetContextInfo_device);
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clCreateImage_StubWithCallback(clCreateImage_testCreateImage2DFromBuffer_2_0);
clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
cl_int err;
cl::Context context(make_context(0));
// Create buffer
// Create image from buffer
cl::Buffer buffer(make_mem(0));
cl::Image2D imageFromBuffer(
context,
cl::ImageFormat(CL_R, CL_FLOAT), buffer, 64, 32, 256, &err);
TEST_ASSERT_EQUAL_PTR(buffer(), imageFromBuffer());
TEST_ASSERT_EQUAL(CL_SUCCESS, err);
buffer() = NULL;
}
static cl_mem clCreateImage_testCreateImage2D_2_0(
cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
const cl_image_desc *image_desc,
void *host_ptr,
cl_int *errcode_ret,
int num_calls)
{
TEST_ASSERT_EQUAL(0, num_calls);
TEST_ASSERT_EQUAL_PTR(make_context(0), context);
TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE, flags);
TEST_ASSERT_NOT_NULL(image_format);
TEST_ASSERT_EQUAL_HEX(CL_RGBA, image_format->image_channel_order);
TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
TEST_ASSERT_NOT_NULL(image_desc);
TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
TEST_ASSERT_EQUAL(64, image_desc->image_width);
TEST_ASSERT_EQUAL(32, image_desc->image_height);
TEST_ASSERT_EQUAL(256, image_desc->image_row_pitch);
TEST_ASSERT_EQUAL(0, image_desc->num_mip_levels);
TEST_ASSERT_EQUAL(0, image_desc->num_samples);
TEST_ASSERT_NULL(image_desc->buffer);
TEST_ASSERT_NULL(host_ptr);
if (errcode_ret != NULL)
*errcode_ret = CL_SUCCESS;
return make_mem(0);
}
static cl_mem clCreateImage_testCreateImage2DFromImage_2_0(
cl_context context,
cl_mem_flags flags,
const cl_image_format *image_format,
const cl_image_desc *image_desc,
void *host_ptr,
cl_int *errcode_ret,
int num_calls)
{
TEST_ASSERT_NOT_NULL(image_format);
TEST_ASSERT_NOT_NULL(image_desc);
TEST_ASSERT_NULL(host_ptr);
TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
// Return the passed buffer as the cl_mem and success for the error code
if (errcode_ret) {
*errcode_ret = CL_SUCCESS;
}
return image_desc->buffer;
}
static cl_int clGetImageInfo_testCreateImage2DFromImage_2_0(
cl_mem image,
cl_image_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret,
int num_calls)
{
TEST_ASSERT_INT_WITHIN(6, 0, num_calls);
return CL_SUCCESS;
}
void testCreateImage2DFromImage_2_0()
{
clGetContextInfo_StubWithCallback(clGetContextInfo_device);
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clCreateImage_StubWithCallback(clCreateImage_testCreateImage2D_2_0);
cl_int err;
cl::Context context(make_context(0));
// As in 1.2 2D image test, needed as source for image-from-image
cl::Image2D image(
context, CL_MEM_READ_WRITE,
cl::ImageFormat(CL_RGBA, CL_FLOAT), 64, 32, 256, NULL, &err);
TEST_ASSERT_EQUAL(CL_SUCCESS, err);
TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
// Continue state for next phase
clGetImageInfo_StubWithCallback(clGetImageInfo_testCreateImage2DFromImage_2_0);
clCreateImage_StubWithCallback(clCreateImage_testCreateImage2DFromImage_2_0);
clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
// Create 2D image from 2D Image with a new channel order
cl::Image2D imageFromImage(
context,
CL_sRGB,
image,
&err
);
TEST_ASSERT_EQUAL(CL_SUCCESS, err);
TEST_ASSERT_EQUAL_PTR(image(), imageFromImage());
//imageFromImage() = NULL;
//image() = NULL;
//context() = NULL;
}
// Note that default tests maintain state when run from the same
// unit process.
// One default setting test will maintain the defaults until the end.
void testSetDefaultPlatform()
{
cl::Platform p(make_platform_id(1));
cl::Platform p2 = cl::Platform::setDefault(p);
cl::Platform p3 = cl::Platform::getDefault();
TEST_ASSERT_EQUAL(p(), p2());
TEST_ASSERT_EQUAL(p(), p3());
}
// Note that default tests maintain state when run from the same
// unit process.
// One default setting test will maintain the defaults until the end.
void testSetDefaultPlatformTwice()
{
cl::Platform p(make_platform_id(2));
cl::Platform p2 = cl::Platform::getDefault();
cl::Platform p3 = cl::Platform::setDefault(p);
// Set default should have failed
TEST_ASSERT_EQUAL(p2(), p3());
TEST_ASSERT_NOT_EQUAL(p(), p3());
}
// Note that default tests maintain state when run from the same
// unit process.
// One default setting test will maintain the defaults until the end.
void testSetDefaultContext()
{
clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
cl::Context c(make_context(1));
cl::Context c2 = cl::Context::setDefault(c);
cl::Context c3 = cl::Context::getDefault();
TEST_ASSERT_EQUAL(c(), c2());
TEST_ASSERT_EQUAL(c(), c3());
}
// Note that default tests maintain state when run from the same
// unit process.
// One default setting test will maintain the defaults until the end.
void testSetDefaultCommandQueue()
{
clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
cl::CommandQueue c(make_command_queue(1));
cl::CommandQueue c2 = cl::CommandQueue::setDefault(c);
cl::CommandQueue c3 = cl::CommandQueue::getDefault();
TEST_ASSERT_EQUAL(c(), c2());
TEST_ASSERT_EQUAL(c(), c3());
}
// Note that default tests maintain state when run from the same
// unit process.
// One default setting test will maintain the defaults until the end.
void testSetDefaultDevice()
{
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
cl::Device d(make_device_id(1));
cl::Device d2 = cl::Device::setDefault(d);
cl::Device d3 = cl::Device::getDefault();
TEST_ASSERT_EQUAL(d(), d2());
TEST_ASSERT_EQUAL(d(), d3());
}
static cl_command_queue clCreateCommandQueueWithProperties_testCommandQueueDevice(
cl_context context,
cl_device_id device,
const cl_queue_properties *properties,
cl_int *errcode_ret,
int num_calls)
{
(void)num_calls;
TEST_ASSERT_EQUAL_PTR(make_context(1), context);
TEST_ASSERT_EQUAL_PTR(make_device_id(1), device);
TEST_ASSERT_EQUAL(properties[0], CL_QUEUE_PROPERTIES);
static cl_command_queue default_ = 0;
if ((properties[1] & CL_QUEUE_ON_DEVICE_DEFAULT) == 0) {
TEST_ASSERT_EQUAL(properties[1], (CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE));
if (properties[2] == CL_QUEUE_SIZE) {
TEST_ASSERT_EQUAL(properties[3], 256);
TEST_ASSERT_EQUAL(properties[4], 0);
return make_command_queue(2);
}
else {
TEST_ASSERT_EQUAL(properties[2], 0);
return make_command_queue(3);
}
}
else {
TEST_ASSERT_EQUAL(properties[1], (CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT));
if (default_ == 0) {
default_ = make_command_queue(4);
}
return default_;
}
}
void testCreateDeviceCommandQueue()
{
clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clCreateCommandQueueWithProperties_StubWithCallback(clCreateCommandQueueWithProperties_testCommandQueueDevice);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(4), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(4), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(2), CL_SUCCESS);
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(3), CL_SUCCESS);
clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
cl::Context c(make_context(1));
cl::Context c2 = cl::Context::setDefault(c);
cl::Device d(make_device_id(1));
cl::DeviceCommandQueue dq(c, d);
cl::DeviceCommandQueue dq2(c, d, 256);
cl::DeviceCommandQueue dqd = cl::DeviceCommandQueue::makeDefault(c, d);
cl::DeviceCommandQueue dqd2 = cl::DeviceCommandQueue::makeDefault(c, d);
TEST_ASSERT_EQUAL(dqd(), dqd2());
}
static cl_mem clCreatePipe_testCreatePipe(
cl_context context,
cl_mem_flags flags,
cl_uint packet_size,
cl_uint num_packets,
const cl_pipe_properties *props,
cl_int *errcode_ret,
int num_calls)
{
if (flags == 0) {
flags = CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS;
}
TEST_ASSERT_EQUAL(flags, CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS);
TEST_ASSERT_NULL(props);
if (errcode_ret)
*errcode_ret = CL_SUCCESS;
return make_mem(0);
}
static cl_int clGetPipeInfo_testCreatePipe(
cl_mem pipe,
cl_pipe_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret,
int num_calls)
{
TEST_ASSERT_NOT_NULL(param_value);
if (param_name == CL_PIPE_PACKET_SIZE) {
*static_cast<cl_uint*>(param_value) = 16;
if (param_value_size_ret) {
*param_value_size_ret = param_value_size;
}
return CL_SUCCESS;
}
else if (param_name == CL_PIPE_MAX_PACKETS) {
*static_cast<cl_uint*>(param_value) = 32;
if (param_value_size_ret) {
*param_value_size_ret = param_value_size;
}
return CL_SUCCESS;
}
else {
TEST_FAIL();
return CL_INVALID_VALUE;
}
}
void testCreatePipe()
{
clCreatePipe_StubWithCallback(clCreatePipe_testCreatePipe);
clGetPipeInfo_StubWithCallback(clGetPipeInfo_testCreatePipe);
clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
cl::Context c(make_context(1));
cl::Pipe p(c, 16, 32);
cl::Pipe p2(16, 32);
cl_uint size = p2.getInfo<CL_PIPE_PACKET_SIZE>();
cl_uint packets;
p2.getInfo(CL_PIPE_MAX_PACKETS, &packets);
TEST_ASSERT_EQUAL(size, 16);
TEST_ASSERT_EQUAL(packets, 32);
}
#if defined(_WIN32)
#define CL_API_CALL __stdcall
#else
#define CL_API_CALL
#endif
static cl_int CL_API_CALL clGetKernelSubGroupInfo_testSubGroups(cl_kernel kernel,
cl_device_id device,
cl_kernel_sub_group_info param_name,
size_t input_value_size,
const void *input_value,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret,
int num_calls)
{
TEST_ASSERT_NOT_NULL(input_value);
TEST_ASSERT_NOT_NULL(param_value);
if (param_name == CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR) {
*static_cast<size_t*>(param_value) = 32;
if (param_value_size_ret) {
*param_value_size_ret = sizeof(size_t);
}
return CL_SUCCESS;
}
else if (param_name == CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR) {
*static_cast<size_t*>(param_value) = 2;
if (param_value_size_ret) {
*param_value_size_ret = sizeof(size_t);
}
return CL_SUCCESS;
}
else {
TEST_ABORT();
}
}
void testSubGroups()
{
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clGetKernelSubGroupInfo_StubWithCallback(clGetKernelSubGroupInfo_testSubGroups);
clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
clReleaseKernel_ExpectAndReturn(make_kernel(0), CL_SUCCESS);
cl::Kernel k(make_kernel(0));
cl::Device d(make_device_id(0));
cl_int err;
cl::NDRange ndrange(8, 8);
size_t res1 = k.getSubGroupInfo<CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR>(
d, ndrange, &err);
size_t res2 = 0;
err = k.getSubGroupInfo(
d, CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR, ndrange, &res2);
TEST_ASSERT_EQUAL(res1, 32);
TEST_ASSERT_EQUAL(res2, 2);
}
/**
* Stub implementation of clGetDeviceInfo that returns an absense of builtin kernels
*/
static cl_int clGetDeviceInfo_builtin(
cl_device_id id,
cl_device_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret,
int num_calls)
{
// Test to verify case where empty string is returned - so size is 0
(void)num_calls;
TEST_ASSERT_EQUAL_HEX(CL_DEVICE_BUILT_IN_KERNELS, param_name);
if (param_value == NULL) {
if (param_value_size_ret != NULL) {
*param_value_size_ret = 0;
}
}
return CL_SUCCESS;
}
void testBuiltInKernels()
{
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
cl::Device d0(make_device_id(0));
clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_builtin);
cl::string s = d0.getInfo<CL_DEVICE_BUILT_IN_KERNELS>();
}
/**
* Stub implementation of clCloneKernel that returns a new kernel object
*/
static cl_kernel clCloneKernel_simplecopy(
cl_kernel k,
cl_int *err,
int num_calls)
{
// Test to verify case where empty string is returned - so size is 0
(void)num_calls;
return make_kernel(POOL_MAX);
return CL_SUCCESS;
}
void testCloneKernel()
{
clCloneKernel_StubWithCallback(clCloneKernel_simplecopy);
clReleaseKernel_ExpectAndReturn(make_kernel(POOL_MAX), CL_SUCCESS);
cl::Kernel clone = kernelPool[0].clone();
TEST_ASSERT_EQUAL(clone(), make_kernel(POOL_MAX));
}
// Run after other tests to clear the default state in the header
// using special unit test bypasses.
// We cannot remove the once_flag, so this is a hard fix
// but it means we won't hit cmock release callbacks at the end.
// This is a lot like tearDown but for the header default
// so we do not want to run it for every test.
// The alternative would be to manually modify the test runner
// but we avoid that for now.
void testCleanupHeaderState()
{
clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
cl::CommandQueue::unitTestClearDefault();
cl::Context::unitTestClearDefault();
cl::Device::unitTestClearDefault();
cl::Platform::unitTestClearDefault();
}
// OpenCL 2.2 APIs:
static void CL_CALLBACK test_program_release_callback(
cl_program,
void*)
{
}
void testSetProgramReleaseCallback()
{
cl_program program = make_program(0);
int user_data = 0;
clSetProgramReleaseCallback_ExpectAndReturn(program, test_program_release_callback, &user_data, CL_SUCCESS);
clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
cl::Program prog(program);
prog.setReleaseCallback(test_program_release_callback, &user_data);
}
void testSetProgramSpecializationConstantScalar()
{
cl_program program = make_program(0);
int sc = 0;
clSetProgramSpecializationConstant_ExpectAndReturn(program, 0, sizeof(sc), &sc, CL_SUCCESS);
clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
cl::Program prog(program);
prog.setSpecializationConstant(0, sc);
}
/// Stub for testing boolean specialization constants
static cl_int clSetProgramSpecializationConstant_testBool(
cl_program program,
cl_uint spec_id,
size_t spec_size,
const void* spec_value,
int num_calls)
{
(void) num_calls;
TEST_ASSERT_EQUAL_PTR(make_program(0), program);
TEST_ASSERT(spec_id == 0 || spec_id == 1);
TEST_ASSERT_EQUAL(spec_size, 1);
if (spec_id == 0)
{
const cl_uchar *uc_value = (const cl_uchar*)spec_value;
TEST_ASSERT_EQUAL_HEX(uc_value[0], 0);
}
if (spec_id == 1)
{
const cl_uchar *uc_value = (const cl_uchar*)spec_value;
TEST_ASSERT_EQUAL_HEX(uc_value[0], CL_UCHAR_MAX);
}
return CL_SUCCESS;
}
void testSetProgramSpecializationConstantBool()
{
// Spec constant "false" should turn into a call with size one and no bits set.
// Spec constant "true" should turn into a call with size one and all bits set.
cl_program program = make_program(0);
bool scFalse = false;
bool scTrue = true;
clSetProgramSpecializationConstant_StubWithCallback(clSetProgramSpecializationConstant_testBool);
clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
cl::Program prog(program);
prog.setSpecializationConstant(0, scFalse);
prog.setSpecializationConstant(1, scTrue);
}
void testSetProgramSpecializationConstantPointer()
{
cl_program program = make_program(0);
int scArray[5];
clSetProgramSpecializationConstant_ExpectAndReturn(program, 0, sizeof(scArray), &scArray, CL_SUCCESS);
clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
cl::Program prog(program);
prog.setSpecializationConstant(0, sizeof(scArray), scArray);
}
} // extern "C"