summaryrefslogtreecommitdiff
path: root/tests/test_builtins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_builtins.cpp')
-rw-r--r--tests/test_builtins.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/tests/test_builtins.cpp b/tests/test_builtins.cpp
new file mode 100644
index 0000000..1513428
--- /dev/null
+++ b/tests/test_builtins.cpp
@@ -0,0 +1,181 @@
+#include <iostream>
+#include <cstdlib>
+
+#include "test_builtins.h"
+#include "CL/cl.h"
+
+#include <stdint.h>
+
+const char sampler_source[] =
+ "__kernel void test_case(__global uint *rs, sampler_t sampler) {\n"
+ " sampler_t good_sampler = CLK_NORMALIZED_COORDS_TRUE |\n"
+ " CLK_ADDRESS_MIRRORED_REPEAT |\n"
+ " CLK_FILTER_NEAREST;\n"
+ "\n"
+ " if (sampler != good_sampler) *rs = 1;"
+ "}\n";
+
+enum TestCaseKind
+{
+ NormalKind,
+ SamplerKind
+};
+
+/*
+ * To ease testing, each kernel will be a Task kernel taking a pointer to an
+ * integer and running built-in functions. If an error is encountered, the
+ * integer pointed to by the arg will be set accordingly. If the kernel succeeds,
+ * this integer is set to 0.
+ */
+static uint32_t run_kernel(const char *source, TestCaseKind kind)
+{
+ cl_platform_id platform = 0;
+ cl_device_id device;
+ cl_context ctx;
+ cl_command_queue queue;
+ cl_program program;
+ cl_int result;
+ cl_kernel kernel;
+ cl_event event;
+ cl_mem rs_buf;
+
+ cl_sampler sampler;
+
+ uint32_t rs = 0;
+
+ result = clGetDeviceIDs(platform, CL_DEVICE_TYPE_DEFAULT, 1, &device, 0);
+ if (result != CL_SUCCESS) return 65536;
+
+ ctx = clCreateContext(0, 1, &device, 0, 0, &result);
+ if (result != CL_SUCCESS) return 65537;
+
+ queue = clCreateCommandQueue(ctx, device, 0, &result);
+ if (result != CL_SUCCESS) return 65538;
+
+ program = clCreateProgramWithSource(ctx, 1, &source, 0, &result);
+ if (result != CL_SUCCESS) return 65539;
+
+ result = clBuildProgram(program, 1, &device, "", 0, 0);
+ if (result != CL_SUCCESS)
+ {
+ // Print log
+ char *log = 0;
+ size_t len = 0;
+
+ clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, 0, &len);
+ log = (char *)std::malloc(len);
+ clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, len, log, 0);
+
+ std::cout << log << std::endl;
+ std::free(log);
+
+ return 65540;
+ }
+
+ kernel = clCreateKernel(program, "test_case", &result);
+ if (result != CL_SUCCESS) return 65541;
+
+ // Create the result buffer
+ rs_buf = clCreateBuffer(ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
+ sizeof(rs), &rs, &result);
+ if (result != CL_SUCCESS) return 65542;
+
+ result = clSetKernelArg(kernel, 0, sizeof(cl_mem), &rs_buf);
+ if (result != CL_SUCCESS) return 65543;
+
+ // Kind
+ switch (kind)
+ {
+ case NormalKind:
+ break;
+
+ case SamplerKind:
+ sampler = clCreateSampler(ctx, 1, CL_ADDRESS_MIRRORED_REPEAT, CL_FILTER_NEAREST, &result);
+ if (result != CL_SUCCESS) return 65546;
+
+ result = clSetKernelArg(kernel, 1, sizeof(cl_sampler), &sampler);
+ if (result != CL_SUCCESS) return 65547;
+ break;
+ }
+
+ result = clEnqueueTask(queue, kernel, 0, 0, &event);
+ if (result != CL_SUCCESS) return 65544;
+
+ result = clWaitForEvents(1, &event);
+ if (result != CL_SUCCESS) return 65545;
+
+ if (kind == SamplerKind) clReleaseSampler(sampler);
+ clReleaseEvent(event);
+ clReleaseMemObject(rs_buf);
+ clReleaseKernel(kernel);
+ clReleaseProgram(program);
+ clReleaseCommandQueue(queue);
+ clReleaseContext(ctx);
+
+ return rs;
+}
+
+static const char *default_error(uint32_t errcode)
+{
+ switch (errcode)
+ {
+ case 0:
+ return 0;
+ case 65536:
+ return "Cannot get a device ID";
+ case 65537:
+ return "Cannot create a context";
+ case 65538:
+ return "Cannot create a command queue";
+ case 65539:
+ return "Cannot create a program with given source";
+ case 65540:
+ return "Cannot build the program";
+ case 65541:
+ return "Cannot create the test_case kernel";
+ case 65542:
+ return "Cannot create a buffer holding a uint32_t";
+ case 65543:
+ return "Cannot set kernel argument";
+ case 65544:
+ return "Cannot enqueue a task kernel";
+ case 65545:
+ return "Cannot wait for the event";
+ case 65546:
+ return "Cannot create a sampler";
+ case 65547:
+ return "Cannot set a sampler kernel argument";
+
+ default:
+ return "Unknown error code";
+ }
+}
+
+START_TEST (test_sampler)
+{
+ uint32_t rs = run_kernel(sampler_source, SamplerKind);
+ const char *errstr = 0;
+
+ switch (rs)
+ {
+ case 1:
+ errstr = "Sampler bitfield invalid";
+ break;
+ default:
+ errstr = default_error(rs);
+ }
+
+ fail_if(
+ errstr != 0,
+ errstr
+ );
+}
+END_TEST
+
+TCase *cl_builtins_tcase_create(void)
+{
+ TCase *tc = NULL;
+ tc = tcase_create("builtins");
+ tcase_add_test(tc, test_sampler);
+ return tc;
+}