/*
* Copyright © 2012 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* Author: Benjamin Segovia
*/
/**
* \file utest_helper.hpp
*
* \author Benjamin Segovia
*/
#ifndef __UTEST_HELPER_HPP__
#define __UTEST_HELPER_HPP__
#include "CL/cl.h"
#include "CL/cl_intel.h"
#include "utest.hpp"
#include "utest_assert.hpp"
#include "utest_error.h"
#include
#include
#include
#ifdef HAS_EGL
#define EGL_WINDOW_WIDTH 256
#define EGL_WINDOW_HEIGHT 256
#include
#include
#include
#include
extern EGLDisplay eglDisplay;
extern EGLContext eglContext;
extern EGLSurface eglSurface;
#endif
#define OCL_THROW_ERROR(FN, STATUS) \
do { \
char msg[2048]; \
sprintf(msg, "error calling %s with error %s \n", #FN, err_msg[-STATUS]); \
OCL_ASSERTM(false, msg); \
} while (0)
#define OCL_CALL(FN, ...) \
do { \
int status = FN(__VA_ARGS__); \
if (status != CL_SUCCESS) OCL_THROW_ERROR(FN, status); \
} while (0)
#define OCL_CREATE_KERNEL(NAME) \
do { \
OCL_CALL (cl_kernel_init, NAME".cl", NAME, SOURCE, NULL); \
} while (0)
#define OCL_DESTROY_KERNEL_KEEP_PROGRAM(KEEP_PROGRAM) \
do { \
cl_kernel_destroy(!(KEEP_PROGRAM)); \
} while(0)
#define OCL_CREATE_KERNEL_FROM_FILE(FILE_NAME, KERNEL_NAME) \
do { \
OCL_CALL(cl_kernel_init, FILE_NAME".cl", KERNEL_NAME, SOURCE, NULL); \
} while (0)
#define OCL_FLUSH() \
do { \
OCL_CALL(clFlush, queue); \
} while(0)
#define OCL_FINISH() \
do { \
OCL_CALL(clFinish, queue); \
} while(0)
#define OCL_CALL2(FN, RET, ...) \
do { \
cl_int status; \
RET = FN(__VA_ARGS__, &status);\
if (status != CL_SUCCESS) OCL_THROW_ERROR(FN, status); \
} while (0)
#define OCL_CREATE_BUFFER(BUFFER, FLAGS, SIZE, DATA) \
OCL_CALL2(clCreateBuffer, BUFFER, ctx, FLAGS, SIZE, DATA)
#define OCL_CREATE_USER_EVENT(EVENT) \
OCL_CALL2(clCreateUserEvent, EVENT, ctx)
#define OCL_SET_USER_EVENT_STATUS(EVENT, STATUS) \
OCL_CALL(clSetUserEventStatus, EVENT, STATUS)
#define OCL_CREATE_IMAGE(IMAGE, FLAGS, FORMAT, DESC, DATA) \
OCL_CALL2(clCreateImage, IMAGE, ctx, FLAGS, FORMAT, DESC, DATA)
#define OCL_READ_IMAGE(IMAGE, ORIGIN, REGION, DATA) \
OCL_CALL(clEnqueueReadImage, queue, IMAGE, CL_TRUE, ORIGIN, REGION, 0, 0, DATA, 0, NULL, NULL)
#define OCL_WRITE_IMAGE(IMAGE, ORIGIN, REGION, DATA) \
OCL_CALL(clEnqueueWriteImage, queue, IMAGE, CL_TRUE, ORIGIN, REGION, 0, 0, DATA, 0, NULL, NULL)
#define OCL_CREATE_GL_IMAGE(IMAGE, FLAGS, TARGET, LEVEL, TEXTURE) \
OCL_CALL2(clCreateFromGLTexture, IMAGE, ctx, FLAGS, TARGET, LEVEL, TEXTURE)
#define OCL_ENQUEUE_ACQUIRE_GL_OBJECTS(ID) \
OCL_CALL(clEnqueueAcquireGLObjects, queue, 1, &buf[ID], 0, 0, 0)
#define OCL_SWAP_EGL_BUFFERS() \
eglSwapBuffers(eglDisplay, eglSurface);
#define OCL_CREATE_SAMPLER(SAMPLER, ADDRESS_MODE, FILTER_MODE) \
OCL_CALL2(clCreateSampler, SAMPLER, ctx, 0, ADDRESS_MODE, FILTER_MODE)
#define OCL_MAP_BUFFER(ID) \
OCL_CALL2(clMapBufferIntel, buf_data[ID], buf[ID])
#define OCL_UNMAP_BUFFER(ID) \
do { \
if (buf[ID] != NULL) { \
OCL_CALL (clUnmapBufferIntel, buf[ID]); \
buf_data[ID] = NULL; \
} \
} while (0)
#define OCL_MAP_BUFFER_GTT(ID) \
OCL_CALL2(clMapBufferGTTIntel, buf_data[ID], buf[ID])
#define OCL_UNMAP_BUFFER_GTT(ID) \
do { \
if (buf[ID] != NULL) { \
OCL_CALL (clUnmapBufferGTTIntel, buf[ID]); \
buf_data[ID] = NULL; \
} \
} while (0)
#define OCL_NDRANGE(DIM_N) \
OCL_CALL (clEnqueueNDRangeKernel, queue, kernel, DIM_N, NULL, globals, locals, 0, NULL, NULL)
#define OCL_SET_ARG(ID, SIZE, ARG) \
OCL_CALL (clSetKernelArg, kernel, ID, SIZE, ARG)
#define OCL_CHECK_IMAGE(DATA, W, H, FILENAME) \
if (cl_check_image(DATA, W, H, FILENAME) == 0) \
OCL_ASSERTM(false, "image mismatch")
enum { MAX_BUFFER_N = 16 };
extern cl_platform_id platform;
extern cl_device_id device;
extern cl_context ctx;
extern cl_program program;
extern cl_kernel kernel;
extern cl_command_queue queue;
extern cl_mem buf[MAX_BUFFER_N];
extern void* buf_data[MAX_BUFFER_N];
extern size_t globals[3];
extern size_t locals[3];
enum {
SOURCE = 0,
LLVM = 1,
BIN = 2
};
/* The SF is float type spliter*/
typedef struct
{
unsigned int mantissa:23;
unsigned int exponent:8;
unsigned int sign:1;
} FLOAT;
typedef union
{
float f;
unsigned int i;
FLOAT spliter;
} SF;
/* Init OpenCL */
extern int cl_ocl_init(void);
/* Init program and kernel for the test */
extern int cl_kernel_init(const char *file_name,
const char *kernel_name, int format, const char * build_opt);
/* Get the file path */
extern char* cl_do_kiss_path(const char *file, cl_device_id device);
/* init the bunch of global varaibles here */
extern int cl_test_init(const char *file_name, const char *kernel_name, int format);
/* Unmap and release all the created buffers */
extern void cl_buffer_destroy(void);
/* Release OCL queue, context and device */
extern void cl_ocl_destroy(void);
/* Release kernel and program */
extern void cl_kernel_destroy(bool needDestroyProgram = true);
/* Release everything allocated in cl_test_init */
extern void cl_test_destroy(void);
/* Nicely output the performance counters */
extern void cl_report_perf_counters(cl_mem perf);
/* Read a bmp from file */
extern int *cl_read_bmp(const char *filename, int *width, int *height);
/* Write a bmp to a file */
extern void cl_write_bmp(const int *data, int width, int height, const char *filename);
/* Check data from img against bmp file located at "bmp" */
extern int cl_check_image(const int *img, int w, int h, const char *bmp);
/* Calculator ULP of each FLOAT value */
extern float cl_FLT_ULP(float float_number);
/* Calculator ULP of each INT value */
extern int cl_INT_ULP(int int_number);
/* subtract the time */
double time_subtract(struct timeval *y, struct timeval *x, struct timeval *result);
#endif /* __UTEST_HELPER_HPP__ */