blob: c51ae13c2cbb3f7d45eff3cefe2fce27aca05bdd [file] [log] [blame]
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef TESTSELECTS_INCLUDED_H
#define TESTSELECTS_INCLUDED_H
#include "harness/compat.h"
#include <stdio.h>
#include <string.h>
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/opencl.h>
#endif
// Defines the set of types we support (no support for double)
typedef enum {
kuchar = 0,
kchar = 1,
kushort = 2,
kshort = 3,
kuint = 4,
kint = 5,
kfloat = 6,
kulong = 7,
klong = 8,
kdouble = 9,
kTypeCount // always goes last
} Type;
// Support max vector size of 16
#define kVectorSizeCount 6
#define kMaxVectorSize 16
// Type names and their sizes in bytes
extern const char *type_name[kTypeCount];
extern const size_t type_size[kTypeCount];
// Associated comparison types
extern const Type ctype[kTypeCount][2];
// Reference functions for the primitive (non vector) type
typedef void (*Select)(void *dest, void *src1, void *src2, void *cmp, size_t c);
extern Select refSelects[kTypeCount][2];
// Reference functions for the primtive type but uses the vector
// definition of true and false
extern Select vrefSelects[kTypeCount][2];
// Check functions for each output type
typedef size_t (*CheckResults)(void *out1, void *out2, size_t count, size_t vectorSize);
extern CheckResults checkResults[kTypeCount];
// Helpful macros
// The next three functions check on different return values. Returns -1
// if the check failed
#define checkErr(err, msg) \
if (err != CL_SUCCESS) { \
log_error("%s failed errcode:%d\n", msg, err); \
return -1; \
}
#define checkZero(val, msg) \
if (val == 0) { \
log_error("%s failed errcode:%d\n", msg, err); \
return -1; \
}
#define checkNull(ptr, msg) \
if (!ptr) { \
log_error("%s failed\n", msg); \
return -1; \
}
// When a helper returns a negative one, we want to return from main
// with negative one. This helper prevents me from having to write
// this multiple time
#define checkHelperErr(err) \
if (err == -1) { \
return err; \
}
#endif // TESTSELECTS_INCLUDED_H