diff --git a/CMakeLists.txt b/CMakeLists.txt index f033b7d9..cda0f932 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ set(CLConform_VERSION "${CLConform_VERSION_MAJOR}.${CLConform_VERSION_MINOR}") set(CLConform_VERSION_FULL "${CLConform_VERSION}.${CLConform_VERSION_MICRO}${CLConform_VERSION_EXTRA}") -add_definitions(-DCL_TARGET_OPENCL_VERSION=200) +add_definitions(-DCL_TARGET_OPENCL_VERSION=220) add_definitions(-DCL_USE_DEPRECATED_OPENCL_2_0_APIS=1) add_definitions(-DCL_USE_DEPRECATED_OPENCL_1_2_APIS=1) diff --git a/test_common/harness/crc32.c b/test_common/harness/crc32.c new file mode 100644 index 00000000..a34be300 --- /dev/null +++ b/test_common/harness/crc32.c @@ -0,0 +1,104 @@ +/*- + * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or + * code or tables extracted from it, as desired without restriction. + * + * First, the polynomial itself and its table of feedback terms. The + * polynomial is + * X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 + * + * Note that we take it "backwards" and put the highest-order term in + * the lowest-order bit. The X^32 term is "implied"; the LSB is the + * X^31 term, etc. The X^0 term (usually shown as "+1") results in + * the MSB being 1 + * + * Note that the usual hardware shift register implementation, which + * is what we're using (we're merely optimizing it by doing eight-bit + * chunks at a time) shifts bits into the lowest-order term. In our + * implementation, that means shifting towards the right. Why do we + * do it this way? Because the calculated CRC must be transmitted in + * order from highest-order term to lowest-order term. UARTs transmit + * characters in order from LSB to MSB. By storing the CRC this way + * we hand it to the UART in the order low-byte to high-byte; the UART + * sends each low-bit to hight-bit; and the result is transmission bit + * by bit from highest- to lowest-order term without requiring any bit + * shuffling on our part. Reception works similarly + * + * The feedback terms table consists of 256, 32-bit entries. Notes + * + * The table can be generated at runtime if desired; code to do so + * is shown later. It might not be obvious, but the feedback + * terms simply represent the results of eight shift/xor opera + * tions for all combinations of data and CRC register values + * + * The values must be right-shifted by eight bits by the "updcrc + * logic; the shift must be unsigned (bring in zeroes). On some + * hardware you could probably optimize the shift in assembler by + * using byte-swap instructions + * polynomial $edb88320 + * + * + * CRC32 code derived from work by Gary S. Brown. + */ + +#include "crc32.h" + +static uint32_t crc32_tab[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +uint32_t +crc32(const void *buf, size_t size) +{ + const uint8_t *p; + + p = (const uint8_t*)buf; + uint32_t crc = ~0U; + + while (size--) + crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + + return crc ^ ~0U; +} + diff --git a/test_common/harness/crc32.h b/test_common/harness/crc32.h new file mode 100644 index 00000000..745ba90e --- /dev/null +++ b/test_common/harness/crc32.h @@ -0,0 +1,34 @@ +/****************************************************************** +Copyright (c) 2016 The Khronos Group Inc. +All Rights Reserved. This code is protected by copyright laws and +contains material proprietary to the Khronos Group, Inc. +This is UNPUBLISHED PROPRIETARY SOURCE CODE that may not be disclosed +in whole or in part to third parties, and may not be reproduced, republished, +distributed, transmitted, displayed, broadcast or otherwise exploited in any +manner without the express prior written permission of Khronos Group. + +The receipt or possession of this code does not convey any rights to +reproduce, disclose, or distribute its contents, or to +manufacture, use, or sell anything that it may describe, in whole +or in part other than under the terms of the Khronos Adopters +Agreement or Khronos Conformance Test Source License Agreement as +executed between Khronos and the recipient. +******************************************************************/ + +#ifndef _CRC32_H_ +#define _CRC32_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint32_t crc32(const void *buf, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/test_common/harness/errorHelpers.c b/test_common/harness/errorHelpers.c index 13dc61e2..58a5d831 100644 --- a/test_common/harness/errorHelpers.c +++ b/test_common/harness/errorHelpers.c @@ -20,6 +20,8 @@ #include "errorHelpers.h" +#include "parseParameters.h" + const char *IGetErrorString( int clErrorCode ) { switch( clErrorCode ) @@ -705,6 +707,48 @@ const char * subtests_requiring_opencl_1_2[] = { "popcount" }; +const char * subtests_to_skip_with_offline_compiler[] = { + "get_kernel_arg_info", + "binary_create", + "load_program_source", + "load_multistring_source", + "load_two_kernel_source", + "load_null_terminated_source", + "load_null_terminated_multi_line_source", + "load_null_terminated_partial_multi_line_source", + "load_discreet_length_source", + "get_program_source", + "get_program_build_info", + "options_build_optimizations", + "options_build_macro", + "options_build_macro_existence", + "options_include_directory", + "options_denorm_cache", + "preprocessor_define_udef", + "preprocessor_include", + "preprocessor_line_error", + "preprocessor_pragma", + "compiler_defines_for_extensions", + "image_macro", + "simple_extern_compile_only", + "simple_embedded_header_compile", + "two_file_regular_variable_access", + "two_file_regular_struct_access", + "two_file_regular_function_access", + "simple_embedded_header_link", + "execute_after_simple_compile_and_link_with_defines", + "execute_after_simple_compile_and_link_with_callbacks", + "execute_after_embedded_header_link", + "execute_after_included_header_link", + "multi_file_libraries", + "multiple_files", + "multiple_libraries", + "multiple_files_multiple_libraries", + "multiple_embedded_headers", + "program_binary_type", + "compile_and_link_status_options_log", + "kernel_preprocessor_macros", +}; int check_opencl_version_with_testname(const char *subtestname, cl_device_id device) { @@ -751,4 +795,17 @@ int check_opencl_version(cl_device_id device, cl_uint requestedMajorVersion, cl_ return 1; } - +int check_functions_for_offline_compiler(const char *subtestname, cl_device_id device) +{ + if (gCompilationMode != kOnline) + { + int nNotRequiredWithOfflineCompiler = sizeof(subtests_to_skip_with_offline_compiler)/sizeof(char *); + size_t i; + for(i=0; i < nNotRequiredWithOfflineCompiler; ++i) { + if(!strcmp(subtestname, subtests_to_skip_with_offline_compiler[i])) { + return 1; + } + } + } + return 0; +} diff --git a/test_common/harness/errorHelpers.h b/test_common/harness/errorHelpers.h index 9ef6e258..e85a53fe 100644 --- a/test_common/harness/errorHelpers.h +++ b/test_common/harness/errorHelpers.h @@ -87,6 +87,10 @@ extern "C" { #define test_missing_feature_ret(errCode,msg,retValue) { if( errCode != CL_SUCCESS ) { print_missing_feature( errCode, msg ); return CL_SUCCESS ; } } #define print_missing_feature(errCode, msg) log_missing_feature("ERROR: Subtest %s tests a feature not supported by the device version! (from %s:%d)\n", msg, __FILE__, __LINE__ ); +#define test_missing_support_offline_cmpiler(errCode, msg) test_missing_support_offline_cmpiler_ret(errCode, msg, errCode) +// this macro should always return CL_SUCCESS, but print the skip message on test not supported with offline compiler +#define test_missing_support_offline_cmpiler_ret(errCode,msg,retValue) { if( errCode != CL_SUCCESS ) { log_info( "INFO: Subtest %s tests is not supported in offline compiler execution path! (from %s:%d)\n", msg, __FILE__, __LINE__ ); return TEST_SKIP ; } } + // expected error code vs. what we got #define test_failure_error(errCode, expectedErrCode, msg) test_failure_error_ret(errCode, expectedErrCode, msg, errCode != expectedErrCode) #define test_failure_error_ret(errCode, expectedErrCode, msg, retValue) { if( errCode != expectedErrCode ) { print_failure_error( errCode, expectedErrCode, msg ); return retValue ; } } @@ -123,6 +127,7 @@ extern const char *GetAddressModeName( cl_addressing_mode mode ); extern const char *GetDeviceTypeName( cl_device_type type ); int check_opencl_version_with_testname(const char *subtestname, cl_device_id device); int check_opencl_version(cl_device_id device, cl_uint requestedMajorVersion, cl_uint requestedMinorVersion); +int check_functions_for_offline_compiler(const char *subtestname, cl_device_id device); // NON-REENTRANT UNLESS YOU PROVIDE A BUFFER PTR (pass null to use static storage, but it's not reentrant then!) extern const char *GetDataVectorString( void *dataBuffer, size_t typeSize, size_t vecSize, char *buffer ); diff --git a/test_common/harness/kernelHelpers.c b/test_common/harness/kernelHelpers.c index eb04d483..29d6f18c 100644 --- a/test_common/harness/kernelHelpers.c +++ b/test_common/harness/kernelHelpers.c @@ -13,213 +13,807 @@ // See the License for the specific language governing permissions and // limitations under the License. // +#include "crc32.h" #include "kernelHelpers.h" #include "errorHelpers.h" #include "imageHelpers.h" #include "typeWrappers.h" +#include "testHarness.h" +#include "parseParameters.h" + +#include +#include +#include +#include +#include +#include #if defined(__MINGW32__) #include "mingw_compat.h" #endif -int create_single_kernel_helper( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, const char **kernelProgram, const char *kernelName ) +#if defined(_WIN32) +std::string slash = "\\"; +#else +std::string slash = "/"; +#endif + +std::string get_file_name(const std::string &baseName, int index, const std::string &extension) { - int error = CL_SUCCESS; - - /* Create the program object from source */ - *outProgram = clCreateProgramWithSource( context, numKernelLines, kernelProgram, NULL, &error ); - if( *outProgram == NULL || error != CL_SUCCESS) - { - print_error( error, "clCreateProgramWithSource failed" ); - return error; - } - - /* Compile the program */ - int buildProgramFailed = 0; - int printedSource = 0; - error = clBuildProgram( *outProgram, 0, NULL, NULL, NULL, NULL ); - if (error != CL_SUCCESS) - { - unsigned int i; - print_error(error, "clBuildProgram failed"); - buildProgramFailed = 1; - printedSource = 1; - log_error( "Original source is: ------------\n" ); - for( i = 0; i < numKernelLines; i++ ) - log_error( "%s", kernelProgram[ i ] ); - } - - // Verify the build status on all devices - cl_uint deviceCount = 0; - error = clGetProgramInfo( *outProgram, CL_PROGRAM_NUM_DEVICES, sizeof( deviceCount ), &deviceCount, NULL ); - if (error != CL_SUCCESS) { - print_error(error, "clGetProgramInfo CL_PROGRAM_NUM_DEVICES failed"); - return error; - } - - if (deviceCount == 0) { - log_error("No devices found for program.\n"); - return -1; - } - - cl_device_id *devices = (cl_device_id*) malloc( deviceCount * sizeof( cl_device_id ) ); - if( NULL == devices ) - return -1; - BufferOwningPtr devicesBuf(devices); - - memset( devices, 0, deviceCount * sizeof( cl_device_id )); - error = clGetProgramInfo( *outProgram, CL_PROGRAM_DEVICES, sizeof( cl_device_id ) * deviceCount, devices, NULL ); - if (error != CL_SUCCESS) { - print_error(error, "clGetProgramInfo CL_PROGRAM_DEVICES failed"); - return error; - } - - cl_uint z; - for( z = 0; z < deviceCount; z++ ) - { - char deviceName[4096] = ""; - error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof( deviceName), deviceName, NULL); - if (error != CL_SUCCESS || deviceName[0] == '\0') { - log_error("Device \"%d\" failed to return a name\n", z); - print_error(error, "clGetDeviceInfo CL_DEVICE_NAME failed"); - } - - cl_build_status buildStatus; - error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); - if (error != CL_SUCCESS) { - print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_STATUS failed"); - return error; - } - - if (buildStatus != CL_BUILD_SUCCESS || buildProgramFailed) { - char log[10240] = ""; - if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed) log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n"); - - char statusString[64] = ""; - if (buildStatus == (cl_build_status)CL_BUILD_SUCCESS) - sprintf(statusString, "CL_BUILD_SUCCESS"); - else if (buildStatus == (cl_build_status)CL_BUILD_NONE) - sprintf(statusString, "CL_BUILD_NONE"); - else if (buildStatus == (cl_build_status)CL_BUILD_ERROR) - sprintf(statusString, "CL_BUILD_ERROR"); - else if (buildStatus == (cl_build_status)CL_BUILD_IN_PROGRESS) - sprintf(statusString, "CL_BUILD_IN_PROGRESS"); - else - sprintf(statusString, "UNKNOWN (%d)", buildStatus); - - if (buildStatus != CL_BUILD_SUCCESS) log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString); - error = clGetProgramBuildInfo( *outProgram, devices[z], CL_PROGRAM_BUILD_LOG, sizeof(log), log, NULL ); - if (error != CL_SUCCESS || log[0]=='\0'){ - log_error("Device %d (%s) failed to return a build log\n", z, deviceName); - if (error) { - print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed"); - return error; - } else { - log_error("clGetProgramBuildInfo returned an empty log.\n"); - return -1; - } - } - // In this case we've already printed out the code above. - if (!printedSource) - { - unsigned int i; - log_error( "Original source is: ------------\n" ); - for( i = 0; i < numKernelLines; i++ ) - log_error( "%s", kernelProgram[ i ] ); - printedSource = 1; - } - log_error( "Build log for device \"%s\" is: ------------\n", deviceName ); - log_error( "%s\n", log ); - log_error( "\n----------\n" ); - return -1; - } - } - - /* And create a kernel from it */ - *outKernel = clCreateKernel( *outProgram, kernelName, &error ); - if( *outKernel == NULL || error != CL_SUCCESS) - { - print_error( error, "Unable to create kernel" ); - return error; - } - - return 0; + std::ostringstream fileName; + fileName << baseName << "." << index << extension; + return fileName.str(); } - -int create_single_kernel_helper_with_build_options( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, - const char **kernelProgram, const char *kernelName, const char *buildOptions ) +long get_file_size(const std::string &fileName) { - int error = CL_SUCCESS; + std::ifstream ifs(fileName.c_str(), std::ios::binary); + if (!ifs.good()) + return 0; + // get length of file: + ifs.seekg(0, std::ios::end); + std::ios::pos_type length = ifs.tellg(); + return static_cast(length); +} - /* Create the program object from source */ - *outProgram = clCreateProgramWithSource( context, numKernelLines, kernelProgram, NULL, &error ); - if( *outProgram == NULL || error != CL_SUCCESS) +std::vector get_file_content(const std::string &fileName) +{ + std::ifstream ifs(fileName.c_str(), std::ios::binary); + if (!ifs.good()) + return std::vector(0); + // get length of file: + ifs.seekg(0, std::ios::end); + std::ios::pos_type length = ifs.tellg(); + ifs.seekg(0, std::ios::beg); + + // allocate memory: + std::vector content(static_cast(length)); + + // read data as a block: + ifs.read(&content[0], length); + return content; +} + +static std::string get_kernel_content(unsigned int numKernelLines, const char *const *kernelProgram) +{ + std::string kernel; + for (size_t i = 0; i < numKernelLines; ++i) + { + std::string chunk(kernelProgram[i], 0, std::string::npos); + kernel += chunk; + } + + return kernel; +} + +std::string get_kernel_name(const std::string &source) +{ + // Count CRC + cl_uint crc = crc32(source.data(), source.size()); + + // Create list of kernel names + std::string kernelsList; + size_t kPos = source.find("kernel"); + while (kPos != std::string::npos) + { + // check for '__kernel' + size_t pos = kPos; + if (pos >= 2 && source[pos - 1] == '_' && source[pos - 2] == '_') + pos -= 2; + + //check character before 'kernel' (white space expected) + size_t wsPos = source.find_last_of(" \t\r\n", pos); + if (wsPos == std::string::npos || wsPos + 1 == pos) + { + //check character after 'kernel' (white space expected) + size_t akPos = kPos + sizeof("kernel") - 1; + wsPos = source.find_first_of(" \t\r\n", akPos); + if (!(wsPos == akPos)) + { + kPos = source.find("kernel", kPos + 1); + continue; + } + + bool attributeFound; + do + { + attributeFound = false; + // find '(' after kernel name name + size_t pPos = source.find("(", akPos); + if (!(pPos != std::string::npos)) + continue; + + // check for not empty kernel name before '(' + pos = source.find_last_not_of(" \t\r\n", pPos - 1); + if (!(pos != std::string::npos && pos > akPos)) + continue; + + //find character before kernel name + wsPos = source.find_last_of(" \t\r\n", pos); + if (!(wsPos != std::string::npos && wsPos >= akPos)) + continue; + + std::string name = source.substr(wsPos + 1, pos + 1 - (wsPos + 1)); + //check for kernel attribute + if (name == "__attribute__") + { + attributeFound = true; + int pCount = 1; + akPos = pPos + 1; + while (pCount > 0 && akPos != std::string::npos) + { + akPos = source.find_first_of("()", akPos + 1); + if (akPos != std::string::npos) + { + if (source[akPos] == '(') + pCount++; + else + pCount--; + } + } + } + else + { + kernelsList += name + "."; + } + } while (attributeFound); + } + kPos = source.find("kernel", kPos + 1); + } + std::ostringstream oss; + if (MAX_LEN_FOR_KERNEL_LIST > 0) + { + if (kernelsList.size() > MAX_LEN_FOR_KERNEL_LIST + 1) + { + kernelsList = kernelsList.substr(0, MAX_LEN_FOR_KERNEL_LIST + 1); + kernelsList[kernelsList.size() - 1] = '.'; + kernelsList[kernelsList.size() - 1] = '.'; + } + oss << kernelsList; + } + oss << std::hex << std::setfill('0') << std::setw(8) << crc; + return oss.str(); +} + +std::string add_build_options(const std::string &baseName, const char *options) +{ + if (options == 0 || options[0] == 0) + return get_file_name(baseName, 0, ""); + + bool equal = false; + int i = 0; + + do + { + i++; + std::string fileName = gCompilationCachePath + slash + get_file_name(baseName, i, ".options"); + long fileSize = get_file_size(fileName); + if (fileSize == 0) + break; + //if(fileSize == strlen(options)) + { + std::vector options2 = get_file_content(fileName); + options2.push_back(0); //terminate string + equal = strcmp(options, &options2[0]) == 0; + } + } while (!equal); + if (equal) + return get_file_name(baseName, i, ""); + + std::string fileName = gCompilationCachePath + slash + get_file_name(baseName, i, ".options"); + std::ofstream ofs(fileName.c_str(), std::ios::binary); + if (!ofs.good()) + { + log_info("OfflineCompiler: can't create options: %s\n", fileName.c_str()); + return ""; + } + // write data as a block: + ofs.write(options, strlen(options)); + log_info("OfflineCompiler: options added: %s\n", fileName.c_str()); + return get_file_name(baseName, i, ""); +} + +static std::string get_offline_compilation_file_type_str(const CompilationMode compilationMode) +{ + switch (compilationMode) + { + default: + assert(0 && "Invalid compilation mode for offline compilation"); + abort(); + case kBinary: + return "binary"; + case kSpir_v: + return "SPIR-V"; + } +} + +static std::string get_khronos_compiler_command(const cl_uint device_address_space_size, + const bool openclCXX, + const std::string &bOptions, + const std::string &sourceFilename, + const std::string &outputFilename) +{ + // Set compiler options + // Emit SPIR-V + std::string compilerOptions = " -cc1 -emit-spirv"; + // : for 32 bit SPIR-V use spir-unknown-unknown, for 64 bit SPIR-V use spir64-unknown-unknown. + if(device_address_space_size == 32) + { + compilerOptions += " -triple=spir-unknown-unknown"; + } + else + { + compilerOptions += " -triple=spir64-unknown-unknown"; + } + // Set OpenCL C++ flag required by SPIR-V-ready clang (compiler provided by Khronos) + if(openclCXX) + { + compilerOptions = compilerOptions + " -cl-std=c++"; + } + // Set correct includes + if(openclCXX) + { + compilerOptions += " -I "; + compilerOptions += STRINGIFY_VALUE(CL_LIBCLCXX_DIR); + } + else + { + compilerOptions += " -include opencl.h"; + } + +#ifdef KHRONOS_OFFLINE_COMPILER_OPTIONS + compilerOptions += STRINGIFY_VALUE(KHRONOS_OFFLINE_COMPILER_OPTIONS); +#endif + + // Add build options passed to this function + compilerOptions += " " + bOptions; + compilerOptions += + " " + sourceFilename + + " -o " + outputFilename; + std::string runString = STRINGIFY_VALUE(KHRONOS_OFFLINE_COMPILER) + compilerOptions; + + return runString; +} + +static std::string get_offline_compilation_command(const cl_uint device_address_space_size, + const CompilationMode compilationMode, + const std::string &bOptions, + const std::string &sourceFilename, + const std::string &outputFilename) +{ + std::ostringstream size_t_width_stream; + size_t_width_stream << device_address_space_size; + std::string size_t_width_str = size_t_width_stream.str(); + + // set output type and default script + std::string outputTypeStr; + std::string defaultScript; + if (compilationMode == kBinary) + { + outputTypeStr = "binary"; + #if defined(_WIN32) + defaultScript = "..\\build_script_binary.py "; + #else + defaultScript = "../build_script_binary.py "; + #endif + } + else if (compilationMode == kSpir_v) + { + outputTypeStr = "spir_v"; + #if defined(_WIN32) + defaultScript = "..\\build_script_spirv.py "; + #else + defaultScript = "../build_script_spirv.py "; + #endif + } + + // set script arguments + std::string scriptArgs = sourceFilename + " " + outputFilename + " " + size_t_width_str + " " + outputTypeStr; + + if (!bOptions.empty()) + { + //search for 2.0 build options + std::string oclVersion; + std::string buildOptions20 = "-cl-std=CL2.0"; + std::size_t found = bOptions.find(buildOptions20); + + if (found != std::string::npos) + oclVersion = "20"; + else + oclVersion = "12"; + + std::string bOptionsWRemovedStd20 = bOptions; + + std::string::size_type i = bOptions.find(buildOptions20); + + if (i != std::string::npos) + bOptionsWRemovedStd20.erase(i, buildOptions20.length()); + + //remove space before -cl-std=CL2.0 if it was first build option + size_t spacePos = bOptionsWRemovedStd20.find_last_of(" \t\r\n", i); + if (spacePos != std::string::npos && i == 0) + bOptionsWRemovedStd20.erase(spacePos, sizeof(char)); + + //remove space after -cl-std=CL2.0 + spacePos = bOptionsWRemovedStd20.find_first_of(" \t\r\n", i - 1); + if (spacePos != std::string::npos) + bOptionsWRemovedStd20.erase(spacePos, sizeof(char)); + + if (!bOptionsWRemovedStd20.empty()) + scriptArgs += " " + oclVersion + " \"" + bOptionsWRemovedStd20 + "\""; + else + scriptArgs += " " + oclVersion; + } + else + scriptArgs += " 12"; + + // set script command line + std::string scriptToRunString = defaultScript + scriptArgs; + + return scriptToRunString; +} + +static int invoke_offline_compiler(cl_context context, + const cl_uint device_address_space_size, + const CompilationMode compilationMode, + const std::string &bOptions, + const std::string &sourceFilename, + const std::string &outputFilename, + const bool openclCXX) +{ + std::string runString; + if (openclCXX) + { +#ifndef KHRONOS_OFFLINE_COMPILER + log_error("CL C++ compilation is not possible: KHRONOS_OFFLINE_COMPILER was not defined.\n"); + return CL_INVALID_OPERATION; +#else + runString = get_khronos_compiler_command(device_address_space_size, openclCXX, bOptions, + sourceFilename, outputFilename); +#endif + } + else + { + runString = get_offline_compilation_command(device_address_space_size, compilationMode, bOptions, + sourceFilename, outputFilename); + } + + // execute script + log_info("Executing command: %s\n", runString.c_str()); + fflush(stdout); + int returnCode = system(runString.c_str()); + if (returnCode != 0) + { + log_error("ERROR: Command finished with error: 0x%x\n", returnCode); + return CL_COMPILE_PROGRAM_FAILURE; + } + + return CL_SUCCESS; +} + +static cl_int get_first_device_id(const cl_context context, cl_device_id &device) +{ + cl_uint numDevices = 0; + cl_int error = clGetContextInfo(context, CL_CONTEXT_NUM_DEVICES, sizeof(cl_uint), &numDevices, NULL); + test_error(error, "clGetContextInfo failed getting CL_CONTEXT_NUM_DEVICES"); + + if (numDevices == 0) + { + log_error("ERROR: No CL devices found\n"); + return -1; + } + + std::vector devices(numDevices, 0); + error = clGetContextInfo(context, CL_CONTEXT_DEVICES, numDevices*sizeof(cl_device_id), &devices[0], NULL); + test_error(error, "clGetContextInfo failed getting CL_CONTEXT_DEVICES"); + + device = devices[0]; + return CL_SUCCESS; +} + +static cl_int get_first_device_address_bits(const cl_context context, cl_uint &device_address_space_size) +{ + cl_device_id device; + cl_int error = get_first_device_id(context, device); + if (error != CL_SUCCESS) { - print_error( error, "clCreateProgramWithSource failed" ); return error; } + error = clGetDeviceInfo(device, CL_DEVICE_ADDRESS_BITS, sizeof(cl_uint), &device_address_space_size, NULL); + test_error(error, "Unable to obtain device address bits"); + + if (device_address_space_size != 32 && device_address_space_size != 64) + { + log_error("ERROR: Unexpected number of device address bits: %u\n", device_address_space_size); + return -1; + } + + return CL_SUCCESS; +} + +static int get_offline_compiler_output(std::ifstream &ifs, + cl_context context, + const std::string &kernel, + const bool openclCXX, + const CompilationMode compilationMode, + const std::string &bOptions, + const std::string &kernelName) +{ + std::string sourceFilename = gCompilationCachePath + slash + kernelName + ".cl"; + + // Get device CL_DEVICE_ADDRESS_BITS + cl_uint device_address_space_size = 0; + int error = get_first_device_address_bits(context, device_address_space_size); + if (error != CL_SUCCESS) + return error; + + std::string outputFilename = gCompilationCachePath + slash + kernelName; + if (compilationMode == kSpir_v) + { + std::ostringstream extension; + extension << ".spv" << device_address_space_size; + outputFilename += extension.str(); + } + + // try to read cached output file when test is run with gCompilationCacheMode != kCacheModeOverwrite + ifs.open(outputFilename.c_str(), std::ios::binary); + + if (gCompilationCacheMode == kCacheModeOverwrite || !ifs.good()) + { + std::string file_type = get_offline_compilation_file_type_str(compilationMode); + + if (gCompilationCacheMode == kCacheModeForceRead) + { + log_info("OfflineCompiler: can't open cached %s file: %s\n", + file_type.c_str(), outputFilename.c_str()); + return -1; + } + + ifs.close(); + + if (gCompilationCacheMode != kCacheModeOverwrite) + log_info("OfflineCompiler: can't find cached %s file: %s\n", + file_type.c_str(), outputFilename.c_str()); + + std::ofstream ofs(sourceFilename.c_str(), std::ios::binary); + if (!ofs.good()) + { + log_info("OfflineCompiler: can't create source file: %s\n", sourceFilename.c_str()); + return -1; + } + + // write source to input file + ofs.write(kernel.c_str(), kernel.size()); + ofs.close(); + + error = invoke_offline_compiler(context, device_address_space_size, compilationMode, + bOptions, sourceFilename, outputFilename, openclCXX); + if (error != CL_SUCCESS) + return error; + + // read output file + ifs.open(outputFilename.c_str(), std::ios::binary); + if (!ifs.good()) + { + log_info("OfflineCompiler: can't read generated %s file: %s\n", + file_type.c_str(), outputFilename.c_str()); + return -1; + } + } + + return CL_SUCCESS; +} + +static int create_single_kernel_helper_create_program_offline(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char *const *kernelProgram, + const char *buildOptions, + const bool openclCXX, + CompilationMode compilationMode) +{ + int error; + std::string kernel = get_kernel_content(numKernelLines, kernelProgram); + std::string kernelName = get_kernel_name(kernel); + + // set build options + std::string bOptions; + bOptions += buildOptions ? std::string(buildOptions) : ""; + + kernelName = add_build_options(kernelName, buildOptions); + + std::ifstream ifs; + error = get_offline_compiler_output(ifs, context, kernel, openclCXX, compilationMode, bOptions, kernelName); + if (error != CL_SUCCESS) + return error; + + // ----------------------------------------------------------------------------------- + // ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------ + // ----------------------------------------------------------------------------------- + // Only OpenCL C++ to SPIR-V compilation + #if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION) + if(openclCXX) + { + return CL_SUCCESS; + } + #endif + + ifs.seekg(0, ifs.end); + int length = ifs.tellg(); + ifs.seekg(0, ifs.beg); + + //treat modifiedProgram as input for clCreateProgramWithBinary + if (compilationMode == kBinary) + { + // read binary from file: + std::vector modifiedKernelBuf(length); + + ifs.read((char *)&modifiedKernelBuf[0], length); + ifs.close(); + + cl_device_id device; + error = get_first_device_id(context, device); + test_error(error, "Failed to get device ID"); + + size_t lengths = modifiedKernelBuf.size(); + const unsigned char *binaries = { &modifiedKernelBuf[0] }; + log_info("offlineCompiler: clCreateProgramWithSource replaced with clCreateProgramWithBinary\n"); + *outProgram = clCreateProgramWithBinary(context, 1, &device, &lengths, &binaries, NULL, &error); + if (*outProgram == NULL || error != CL_SUCCESS) + { + print_error(error, "clCreateProgramWithBinary failed"); + return error; + } + } + //treat modifiedProgram as input for clCreateProgramWithIL + else if (compilationMode == kSpir_v) + { + // read spir-v from file: + std::vector modifiedKernelBuf(length); + + ifs.read((char *)&modifiedKernelBuf[0], length); + ifs.close(); + + size_t length = modifiedKernelBuf.size(); + log_info("offlineCompiler: clCreateProgramWithSource replaced with clCreateProgramWithIL\n"); + + *outProgram = clCreateProgramWithIL(context, &modifiedKernelBuf[0], length, &error); + if (*outProgram == NULL || error != CL_SUCCESS) + { + print_error(error, "clCreateProgramWithIL failed"); + return error; + } + } + + return CL_SUCCESS; +} + +static int create_single_kernel_helper_create_program(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char **kernelProgram, + const char *buildOptions, + const bool openclCXX, + CompilationMode compilationMode) +{ + if (compilationMode == kOnline) + { + int error = CL_SUCCESS; + + /* Create the program object from source */ + *outProgram = clCreateProgramWithSource(context, numKernelLines, kernelProgram, NULL, &error); + if (*outProgram == NULL || error != CL_SUCCESS) + { + print_error(error, "clCreateProgramWithSource failed"); + return error; + } + return CL_SUCCESS; + } + else + { + return create_single_kernel_helper_create_program_offline(context, outProgram, numKernelLines, + kernelProgram, buildOptions, + openclCXX, compilationMode); + } +} + +int create_single_kernel_helper_create_program(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char **kernelProgram, + const char *buildOptions, + const bool openclCXX) +{ + return create_single_kernel_helper_create_program(context, outProgram, numKernelLines, + kernelProgram, buildOptions, + openclCXX, gCompilationMode); +} + +int create_single_kernel_helper_with_build_options(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions, + const bool openclCXX) +{ + return create_single_kernel_helper(context, outProgram, outKernel, numKernelLines, kernelProgram, kernelName, buildOptions, openclCXX); +} + +// Creates and builds OpenCL C/C++ program, and creates a kernel +int create_single_kernel_helper(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions, + const bool openclCXX) +{ + int error; + // Create OpenCL C++ program + if(openclCXX) + { + // ----------------------------------------------------------------------------------- + // ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------ + // ----------------------------------------------------------------------------------- + // Only OpenCL C++ to SPIR-V compilation + #if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION) + // Save global variable + bool tempgCompilationCacheMode = gCompilationCacheMode; + // Force OpenCL C++ -> SPIR-V compilation on every run + gCompilationCacheMode = kCacheModeOverwrite; + #endif + error = create_openclcpp_program( + context, outProgram, numKernelLines, kernelProgram, buildOptions + ); + if (error != CL_SUCCESS) + { + log_error("Create program failed: %d, line: %d\n", error, __LINE__); + return error; + } + // ----------------------------------------------------------------------------------- + // ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------ + // ----------------------------------------------------------------------------------- + #if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION) + // Restore global variables + gCompilationCacheMode = tempgCompilationCacheMode; + log_info("WARNING: KERNEL %s WAS ONLY COMPILED TO SPIR-V\n", kernelName); + return error; + #endif + } + // Create OpenCL C program + else + { + error = create_single_kernel_helper_create_program( + context, outProgram, numKernelLines, kernelProgram, buildOptions + ); + if (error != CL_SUCCESS) + { + log_error("Create program failed: %d, line: %d\n", error, __LINE__); + return error; + } + } + // Remove offline-compiler-only build options + std::string newBuildOptions; + if (buildOptions != NULL) + { + newBuildOptions = buildOptions; + std::string offlineCompierOptions[] = { + "-cl-fp16-enable", + "-cl-fp64-enable", + "-cl-zero-init-local-mem-vars" + }; + for(auto& s : offlineCompierOptions) + { + std::string::size_type i = newBuildOptions.find(s); + if (i != std::string::npos) + newBuildOptions.erase(i, s.length()); + } + } + // Build program and create kernel + return build_program_create_kernel_helper( + context, outProgram, outKernel, numKernelLines, kernelProgram, kernelName, newBuildOptions.c_str() + ); +} + +// Creates OpenCL C++ program +int create_openclcpp_program(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char **kernelProgram, + const char *buildOptions) +{ + // Create program + return create_single_kernel_helper_create_program( + context, outProgram, numKernelLines, kernelProgram, buildOptions, true, kSpir_v + ); +} + +// Builds OpenCL C/C++ program and creates +int build_program_create_kernel_helper(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions) +{ + int error; /* Compile the program */ int buildProgramFailed = 0; int printedSource = 0; - error = clBuildProgram( *outProgram, 0, NULL, buildOptions, NULL, NULL ); + error = clBuildProgram(*outProgram, 0, NULL, buildOptions, NULL, NULL); if (error != CL_SUCCESS) { unsigned int i; print_error(error, "clBuildProgram failed"); buildProgramFailed = 1; printedSource = 1; - log_error( "Original source is: ------------\n" ); - for( i = 0; i < numKernelLines; i++ ) - log_error( "%s", kernelProgram[ i ] ); + log_error("Build options: %s\n", buildOptions); + log_error("Original source is: ------------\n"); + for (i = 0; i < numKernelLines; i++) + log_error("%s", kernelProgram[i]); } // Verify the build status on all devices cl_uint deviceCount = 0; - error = clGetProgramInfo( *outProgram, CL_PROGRAM_NUM_DEVICES, sizeof( deviceCount ), &deviceCount, NULL ); - if (error != CL_SUCCESS) { + error = clGetProgramInfo(*outProgram, CL_PROGRAM_NUM_DEVICES, sizeof(deviceCount), &deviceCount, NULL); + if (error != CL_SUCCESS) + { print_error(error, "clGetProgramInfo CL_PROGRAM_NUM_DEVICES failed"); return error; } - if (deviceCount == 0) { + if (deviceCount == 0) + { log_error("No devices found for program.\n"); return -1; } - cl_device_id *devices = (cl_device_id*) malloc( deviceCount * sizeof( cl_device_id ) ); - if( NULL == devices ) + cl_device_id *devices = (cl_device_id *)malloc(deviceCount * sizeof(cl_device_id)); + if (NULL == devices) return -1; BufferOwningPtr devicesBuf(devices); - memset( devices, 0, deviceCount * sizeof( cl_device_id )); - error = clGetProgramInfo( *outProgram, CL_PROGRAM_DEVICES, sizeof( cl_device_id ) * deviceCount, devices, NULL ); - if (error != CL_SUCCESS) { + memset(devices, 0, deviceCount * sizeof(cl_device_id)); + error = clGetProgramInfo(*outProgram, CL_PROGRAM_DEVICES, sizeof(cl_device_id) * deviceCount, devices, NULL); + if (error != CL_SUCCESS) + { print_error(error, "clGetProgramInfo CL_PROGRAM_DEVICES failed"); return error; } cl_uint z; - for( z = 0; z < deviceCount; z++ ) + bool buildFailed = false; + for (z = 0; z < deviceCount; z++) { char deviceName[4096] = ""; - error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof( deviceName), deviceName, NULL); - if (error != CL_SUCCESS || deviceName[0] == '\0') { + error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL); + if (error != CL_SUCCESS || deviceName[0] == '\0') + { log_error("Device \"%d\" failed to return a name\n", z); print_error(error, "clGetDeviceInfo CL_DEVICE_NAME failed"); } cl_build_status buildStatus; error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); - if (error != CL_SUCCESS) { + if (error != CL_SUCCESS) + { print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_STATUS failed"); return error; } - if (buildStatus != CL_BUILD_SUCCESS || buildProgramFailed) { - char log[10240] = ""; - if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed) log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n"); + if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed && deviceCount == 1) + { + buildFailed = true; + log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n"); + } + + if (buildStatus != CL_BUILD_SUCCESS) + { char statusString[64] = ""; if (buildStatus == (cl_build_status)CL_BUILD_SUCCESS) @@ -233,14 +827,30 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr else sprintf(statusString, "UNKNOWN (%d)", buildStatus); - if (buildStatus != CL_BUILD_SUCCESS) log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString); - error = clGetProgramBuildInfo( *outProgram, devices[z], CL_PROGRAM_BUILD_LOG, sizeof(log), log, NULL ); - if (error != CL_SUCCESS || log[0]=='\0'){ + if (buildStatus != CL_BUILD_SUCCESS) + log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString); + size_t paramSize = 0; + error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_LOG, 0, NULL, ¶mSize); + if (error != CL_SUCCESS) + { + + print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed"); + return error; + } + + std::string log; + log.resize(paramSize / sizeof(char)); + error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_LOG, paramSize, &log[0], NULL); + if (error != CL_SUCCESS || log[0] == '\0') + { log_error("Device %d (%s) failed to return a build log\n", z, deviceName); - if (error) { + if (error) + { print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed"); return error; - } else { + } + else + { log_error("clGetProgramBuildInfo returned an empty log.\n"); return -1; } @@ -249,31 +859,37 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr if (!printedSource) { unsigned int i; - log_error( "Original source is: ------------\n" ); - for( i = 0; i < numKernelLines; i++ ) - log_error( "%s", kernelProgram[ i ] ); + log_error("Original source is: ------------\n"); + for (i = 0; i < numKernelLines; i++) + log_error("%s", kernelProgram[i]); printedSource = 1; } - log_error( "Build log for device \"%s\" is: ------------\n", deviceName ); - log_error( "%s\n", log ); - log_error( "\n----------\n" ); + log_error("Build log for device \"%s\" is: ------------\n", deviceName); + log_error("%s\n", log.c_str()); + log_error("\n----------\n"); return -1; } } - /* And create a kernel from it */ - *outKernel = clCreateKernel( *outProgram, kernelName, &error ); - if( *outKernel == NULL || error != CL_SUCCESS) + if (buildFailed) { - print_error( error, "Unable to create kernel" ); - return error; + return -1; + } + + /* And create a kernel from it */ + if (kernelName != NULL) + { + *outKernel = clCreateKernel(*outProgram, kernelName, &error); + if (*outKernel == NULL || error != CL_SUCCESS) + { + print_error(error, "Unable to create kernel"); + return error; + } } return 0; } - - int get_device_version( cl_device_id id, size_t* major, size_t* minor) { cl_char buffer[ 4098 ]; @@ -543,11 +1159,9 @@ int is_extension_available( cl_device_id device, const char *extensionName ) return 0; } - int result = strstr( extString, extensionName ) != NULL; + BufferOwningPtr extStringBuf(extString); - free(extString); - - return result; + return strstr( extString, extensionName ) != NULL; } /* Helper to determine if a device supports an image format */ diff --git a/test_common/harness/kernelHelpers.h b/test_common/harness/kernelHelpers.h index 9feaca87..a304fb79 100644 --- a/test_common/harness/kernelHelpers.h +++ b/test_common/harness/kernelHelpers.h @@ -58,11 +58,49 @@ extern "C" { #define STRINGIFY(_x) #_x #endif -/* Helper that creates a single program and kernel from a single-kernel program source */ -extern int create_single_kernel_helper( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, const char **kernelProgram, const char *kernelName ); +const int MAX_LEN_FOR_KERNEL_LIST = 20; -extern int create_single_kernel_helper_with_build_options( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, - const char **kernelProgram, const char *kernelName, const char *buildOptions ); +/* Helper that creates a single program and kernel from a single-kernel program source */ +extern int create_single_kernel_helper(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions = NULL, + const bool openclCXX = false); + +extern int create_single_kernel_helper_with_build_options(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions, + const bool openclCXX = false); + +extern int create_single_kernel_helper_create_program(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char **kernelProgram, + const char *buildOptions = NULL, + const bool openclCXX = false); + +/* Creates OpenCL C++ program. This one must be used for creating OpenCL C++ program. */ +extern int create_openclcpp_program(cl_context context, + cl_program *outProgram, + unsigned int numKernelLines, + const char **kernelProgram, + const char *buildOptions = NULL); + +/* Builds program (outProgram) and creates one kernel */ +int build_program_create_kernel_helper(cl_context context, + cl_program *outProgram, + cl_kernel *outKernel, + unsigned int numKernelLines, + const char **kernelProgram, + const char *kernelName, + const char *buildOptions = NULL); /* Helper to obtain the biggest fit work group size for all the devices in a given group and for the given global thread size */ extern int get_max_common_work_group_size( cl_context context, cl_kernel kernel, size_t globalThreadSize, size_t *outSize ); @@ -125,6 +163,13 @@ cl_device_fp_config get_default_rounding_mode( cl_device_id device ); return 0; \ } +#define PASSIVE_REQUIRE_FP16_SUPPORT(device) \ + if (!is_extension_available(device, "cl_khr_fp16")) \ + { \ + log_info("\n\tNote: device does not support fp16. Skipping test...\n"); \ + return 0; \ + } + /* Prints out the standard device header for all tests given the device to print for */ extern int printDeviceHeader( cl_device_id device ); diff --git a/test_common/harness/parseParameters.cpp b/test_common/harness/parseParameters.cpp index 2b6908af..2051d0b3 100644 --- a/test_common/harness/parseParameters.cpp +++ b/test_common/harness/parseParameters.cpp @@ -14,9 +14,167 @@ // limitations under the License. // #include "parseParameters.h" + #include "errorHelpers.h" +#include "testHarness.h" +#include "ThreadPool.h" + +#include +#include +#include +#include #include +using namespace std; + +CompilationMode gCompilationMode = kOnline; +CompilationCacheMode gCompilationCacheMode = kCacheModeCompileIfAbsent; +std::string gCompilationCachePath = "."; + +void helpInfo () +{ + log_info("Common options:\n" + " -h, --help This help\n" + " --compilation-mode Specify a compilation mode. Mode can be:\n" + " online Use online compilation (default)\n" + " binary Use binary offline compilation\n" + " spir-v Use SPIR-V offline compilation\n" + "\n" + " For offline compilation (binary and spir-v modes) only:\n" + " --compilation-cache-mode Specify a compilation caching mode:\n" + " compile-if-absent Read from cache if already populated, or\n" + " else perform offline compilation (default)\n" + " force-read Force reading from the cache\n" + " overwrite Disable reading from the cache\n" + " --compilation-cache-path Path for offline compiler output and CL source\n" + "\n"); +} + +int parseCustomParam (int argc, const char *argv[], const char *ignore) +{ + int delArg = 0; + + for (int i=1; i\n"); + return -1; + } + } + else if (!strcmp(argv[i], "--compilation-cache-mode")) + { + delArg++; + if ((i + 1) < argc) + { + delArg++; + const char *mode = argv[i + 1]; + + if (!strcmp(mode, "compile-if-absent")) + { + gCompilationCacheMode = kCacheModeCompileIfAbsent; + } + else if (!strcmp(mode, "force-read")) + { + gCompilationCacheMode = kCacheModeForceRead; + } + else if (!strcmp(mode, "overwrite")) + { + gCompilationCacheMode = kCacheModeOverwrite; + } + else + { + log_error("Compilation cache mode not recognized: %s\n", mode); + return -1; + } + log_info("Compilation cache mode specified: %s\n", mode); + } + else + { + log_error("Compilation cache mode parameters are incorrect. Usage:\n" + " --compilation-cache-mode \n"); + return -1; + } + } + else if (!strcmp(argv[i], "--compilation-cache-path")) + { + delArg++; + if ((i + 1) < argc) + { + delArg++; + gCompilationCachePath = argv[i + 1]; + } + else + { + log_error("Path argument for --compilation-cache-path was not specified.\n"); + return -1; + } + } + + //cleaning parameters from argv tab + for (int j = i; j < argc - delArg; j++) + argv[j] = argv[j + delArg]; + argc -= delArg; + i -= delArg; + } + + if (gCompilationCacheMode != kCacheModeCompileIfAbsent && gCompilationMode == kOnline) + { + log_error("Compilation cache mode can only be specified when using an offline compilation mode.\n"); + return -1; + } + + return argc; +} + bool is_power_of_two(int number) { return number && !(number & (number - 1)); diff --git a/test_common/harness/parseParameters.h b/test_common/harness/parseParameters.h index 212a9764..241c0708 100644 --- a/test_common/harness/parseParameters.h +++ b/test_common/harness/parseParameters.h @@ -19,6 +19,26 @@ #include "compat.h" #include +enum CompilationMode +{ + kOnline = 0, + kBinary, + kSpir_v +}; + +enum CompilationCacheMode +{ + kCacheModeCompileIfAbsent = 0, + kCacheModeForceRead, + kCacheModeOverwrite +}; + +extern CompilationMode gCompilationMode; +extern CompilationCacheMode gCompilationCacheMode; +extern std::string gCompilationCachePath; + +extern int parseCustomParam (int argc, const char *argv[], const char *ignore = 0 ); + extern void parseWimpyReductionFactor(const char *&arg, int &wimpyReductionFactor); #endif // _parseParameters_h diff --git a/test_common/harness/testHarness.c b/test_common/harness/testHarness.c index 93f858cc..1782f3be 100644 --- a/test_common/harness/testHarness.c +++ b/test_common/harness/testHarness.c @@ -26,6 +26,7 @@ #include "kernelHelpers.h" #include "fpcontrol.h" #include "typeWrappers.h" +#include "parseParameters.h" #if !defined(_WIN32) #include @@ -127,6 +128,13 @@ int runTestHarnessWithCheck( int argc, const char *argv[], int testNum, test_def /* Process the command line arguments */ + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish(); + return EXIT_FAILURE; + } + /* Special case: just list the tests */ if( ( argc > 1 ) && (!strcmp( argv[ 1 ], "-list" ) || !strcmp( argv[ 1 ], "-h" ) || !strcmp( argv[ 1 ], "--help" ))) { @@ -707,6 +715,9 @@ test_status callSingleTestFunction( test_definition test, cl_device_id deviceToU return TEST_SKIP; } + error = check_functions_for_offline_compiler(test.name, deviceToUse); + test_missing_support_offline_cmpiler(error, test.name); + if( test.func == NULL ) { // Skip unimplemented test, can happen when all of the tests are selected diff --git a/test_common/harness/testHarness.h b/test_common/harness/testHarness.h index 044d3bec..4668d68d 100644 --- a/test_common/harness/testHarness.h +++ b/test_common/harness/testHarness.h @@ -21,6 +21,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/test_conformance/SVM/CMakeLists.txt b/test_conformance/SVM/CMakeLists.txt index 694bcc2a..80fb8aec 100644 --- a/test_conformance/SVM/CMakeLists.txt +++ b/test_conformance/SVM/CMakeLists.txt @@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/allocations/CMakeLists.txt b/test_conformance/allocations/CMakeLists.txt index 3355420c..07da26b0 100644 --- a/test_conformance/allocations/CMakeLists.txt +++ b/test_conformance/allocations/CMakeLists.txt @@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/typeWrappers.cpp ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/allocations/main.cpp b/test_conformance/allocations/main.cpp index 6b3fca28..1d842f19 100644 --- a/test_conformance/allocations/main.cpp +++ b/test_conformance/allocations/main.cpp @@ -19,6 +19,7 @@ #include "allocation_fill.h" #include "allocation_execute.h" #include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" #include typedef long long unsigned llu; @@ -273,6 +274,13 @@ int main(int argc, const char *argv[]) char *endPtr; int r; + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish(); + return 1; + } + const char ** argList = (const char **)calloc( argc, sizeof( char*) ); if( NULL == argList ) diff --git a/test_conformance/api/CMakeLists.txt b/test_conformance/api/CMakeLists.txt index 9993ca2d..1e4a929e 100644 --- a/test_conformance/api/CMakeLists.txt +++ b/test_conformance/api/CMakeLists.txt @@ -29,6 +29,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c ../../test_common/harness/imageHelpers.cpp + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/atomics/CMakeLists.txt b/test_conformance/atomics/CMakeLists.txt index 8c0a0309..5d9e8827 100644 --- a/test_conformance/atomics/CMakeLists.txt +++ b/test_conformance/atomics/CMakeLists.txt @@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/basic/CMakeLists.txt b/test_conformance/basic/CMakeLists.txt index 1f6849d1..e390bb9b 100644 --- a/test_conformance/basic/CMakeLists.txt +++ b/test_conformance/basic/CMakeLists.txt @@ -73,6 +73,8 @@ set(${MODULE_NAME}_SOURCES test_global_linear_id.c test_local_linear_id.c test_progvar.cpp + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) if(APPLE) diff --git a/test_conformance/buffers/CMakeLists.txt b/test_conformance/buffers/CMakeLists.txt index b6ef3a6c..8e699e67 100644 --- a/test_conformance/buffers/CMakeLists.txt +++ b/test_conformance/buffers/CMakeLists.txt @@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/c11_atomics/CMakeLists.txt b/test_conformance/c11_atomics/CMakeLists.txt index 5b0a6e44..e0b77ef5 100644 --- a/test_conformance/c11_atomics/CMakeLists.txt +++ b/test_conformance/c11_atomics/CMakeLists.txt @@ -11,8 +11,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) - - include(../CMakeCommon.txt) diff --git a/test_conformance/commonfns/CMakeLists.txt b/test_conformance/commonfns/CMakeLists.txt index 9e72cb4b..50aef6c5 100644 --- a/test_conformance/commonfns/CMakeLists.txt +++ b/test_conformance/commonfns/CMakeLists.txt @@ -27,6 +27,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/compiler/CMakeLists.txt b/test_conformance/compiler/CMakeLists.txt index 99ecbe22..422c5c5c 100644 --- a/test_conformance/compiler/CMakeLists.txt +++ b/test_conformance/compiler/CMakeLists.txt @@ -19,6 +19,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c ../../test_common/harness/os_helpers.cpp + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/compiler/test_build_helpers.c b/test_conformance/compiler/test_build_helpers.c index d15b0275..e882186b 100644 --- a/test_conformance/compiler/test_build_helpers.c +++ b/test_conformance/compiler/test_build_helpers.c @@ -14,7 +14,8 @@ // limitations under the License. // #include "testBase.h" - +#include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" const char *sample_kernel_code_single_line[] = { "__kernel void sample_test(__global float *src, __global int *dst)\n" diff --git a/test_conformance/computeinfo/CMakeLists.txt b/test_conformance/computeinfo/CMakeLists.txt index 8ee7b70e..266ab6d6 100644 --- a/test_conformance/computeinfo/CMakeLists.txt +++ b/test_conformance/computeinfo/CMakeLists.txt @@ -5,7 +5,9 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/errorHelpers.c ../../test_common/harness/msvc9.c ../../test_common/harness/kernelHelpers.c + ../../test_common/harness/parseParameters.cpp ../../test_common/harness/testHarness.c + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/contractions/CMakeLists.txt b/test_conformance/contractions/CMakeLists.txt index 8cc839af..5c7d86f7 100644 --- a/test_conformance/contractions/CMakeLists.txt +++ b/test_conformance/contractions/CMakeLists.txt @@ -9,6 +9,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/rounding_mode.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/testHarness.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/contractions/contractions.c b/test_conformance/contractions/contractions.c index 6e2c0928..e8e98d4c 100644 --- a/test_conformance/contractions/contractions.c +++ b/test_conformance/contractions/contractions.c @@ -36,6 +36,7 @@ #include "../../test_common/harness/rounding_mode.h" #include "../../test_common/harness/fpcontrol.h" #include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" #if defined( __APPLE__ ) #include #endif @@ -321,6 +322,12 @@ const int test_num = ARRAY_SIZE( test_list ); int main( int argc, const char **argv ) { + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + return -1; + } + int error = ParseArgs( argc, argv ); if( !error ) diff --git a/test_conformance/conversions/CMakeLists.txt b/test_conformance/conversions/CMakeLists.txt index 4c65c69d..53c0c6da 100644 --- a/test_conformance/conversions/CMakeLists.txt +++ b/test_conformance/conversions/CMakeLists.txt @@ -17,9 +17,10 @@ set (${MODULE_NAME}_SOURCES ../../test_common/harness/msvc9.c ../../test_common/harness/mingw_compat.c ../../test_common/harness/errorHelpers.c + ../../test_common/harness/parseParameters.cpp ../../test_common/harness/kernelHelpers.c ../../test_common/harness/testHarness.c - ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) if(ANDROID) diff --git a/test_conformance/conversions/test_conversions.c b/test_conformance/conversions/test_conversions.c index 2e5ca701..998f2402 100644 --- a/test_conformance/conversions/test_conversions.c +++ b/test_conformance/conversions/test_conversions.c @@ -288,6 +288,12 @@ int main (int argc, const char **argv ) int error; cl_uint seed = (cl_uint) time( NULL ); + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + return 1; + } + if( (error = ParseArgs( argc, argv )) ) return error; diff --git a/test_conformance/d3d10/CMakeLists.txt b/test_conformance/d3d10/CMakeLists.txt index c025078b..2b1a0761 100644 --- a/test_conformance/d3d10/CMakeLists.txt +++ b/test_conformance/d3d10/CMakeLists.txt @@ -31,7 +31,10 @@ set(D3D10_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c - ../../test_common/harness/msvc9.c) + ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c +) add_executable(conformance_test_d3d10 ${D3D10_SOURCES}) diff --git a/test_conformance/d3d10/main.cpp b/test_conformance/d3d10/main.cpp index 8e2de28f..44b57680 100644 --- a/test_conformance/d3d10/main.cpp +++ b/test_conformance/d3d10/main.cpp @@ -17,13 +17,17 @@ #define _CRT_SECURE_NO_WARNINGS #include "harness.h" +#include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" -int main(int argc, char* argv[]) +int main(int argc, const char* argv[]) { cl_int result; cl_platform_id platform = NULL; cl_uint num_devices_tested = 0; + argc = parseCustomParam(argc, argv); + // get the platform to test result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); diff --git a/test_conformance/d3d11/CMakeLists.txt b/test_conformance/d3d11/CMakeLists.txt index 6fb9cfb0..e6673dd4 100644 --- a/test_conformance/d3d11/CMakeLists.txt +++ b/test_conformance/d3d11/CMakeLists.txt @@ -31,7 +31,10 @@ set(D3D11_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c - ../../test_common/harness/msvc9.c) + ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c +) add_executable(conformance_test_d3d11 ${D3D11_SOURCES}) diff --git a/test_conformance/d3d11/main.cpp b/test_conformance/d3d11/main.cpp index 884416e5..f477d7bb 100644 --- a/test_conformance/d3d11/main.cpp +++ b/test_conformance/d3d11/main.cpp @@ -19,13 +19,17 @@ #include #include #include "harness.h" +#include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" -int main(int argc, char* argv[]) +int main(int argc, const char* argv[]) { cl_int result; cl_platform_id platform = NULL; cl_uint num_devices_tested = 0; + argc = parseCustomParam(argc, argv); + // get the platforms to test result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); diff --git a/test_conformance/device_execution/CMakeLists.txt b/test_conformance/device_execution/CMakeLists.txt index 43e48b4d..9ba35ca6 100644 --- a/test_conformance/device_execution/CMakeLists.txt +++ b/test_conformance/device_execution/CMakeLists.txt @@ -19,6 +19,8 @@ set(DEVICE_EXECUTION_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/device_execution/main.c b/test_conformance/device_execution/main.c index 8645a8d1..168ec035 100644 --- a/test_conformance/device_execution/main.c +++ b/test_conformance/device_execution/main.c @@ -21,6 +21,7 @@ #endif #include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" #include "utils.h" #include "procs.h" @@ -75,6 +76,8 @@ test_status deviceCheck(cl_device_id device) int main(int argc, const char *argv[]) { + argc = parseCustomParam(argc, argv); + for (int i = 0; i < argc; ++i) { int argsRemoveNum = 0; if ( strcmp(argv[i], "-kernelName") == 0 ) { diff --git a/test_conformance/device_partition/CMakeLists.txt b/test_conformance/device_partition/CMakeLists.txt index bfe11bb8..cb8f0c9f 100644 --- a/test_conformance/device_partition/CMakeLists.txt +++ b/test_conformance/device_partition/CMakeLists.txt @@ -12,5 +12,7 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/conversions.c ../../test_common/harness/typeWrappers.cpp ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/events/CMakeLists.txt b/test_conformance/events/CMakeLists.txt index 525e13cd..7cfb995a 100644 --- a/test_conformance/events/CMakeLists.txt +++ b/test_conformance/events/CMakeLists.txt @@ -19,6 +19,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c ../../test_common/harness/ThreadPool.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/generic_address_space/CMakeLists.txt b/test_conformance/generic_address_space/CMakeLists.txt index 6695889f..0e507359 100644 --- a/test_conformance/generic_address_space/CMakeLists.txt +++ b/test_conformance/generic_address_space/CMakeLists.txt @@ -10,6 +10,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/errorHelpers.c ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/geometrics/CMakeLists.txt b/test_conformance/geometrics/CMakeLists.txt index 283d96dd..b7fef328 100644 --- a/test_conformance/geometrics/CMakeLists.txt +++ b/test_conformance/geometrics/CMakeLists.txt @@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) # VS2005 optimization WAR for geom_length) diff --git a/test_conformance/gl/CMakeLists.txt b/test_conformance/gl/CMakeLists.txt index fa806ca4..c2da9167 100644 --- a/test_conformance/gl/CMakeLists.txt +++ b/test_conformance/gl/CMakeLists.txt @@ -31,6 +31,8 @@ set (GL_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ../../test_common/harness/imageHelpers.cpp ) diff --git a/test_conformance/gl/main.cpp b/test_conformance/gl/main.cpp index 4c12e3b7..6338cd7a 100644 --- a/test_conformance/gl/main.cpp +++ b/test_conformance/gl/main.cpp @@ -25,6 +25,7 @@ #include "procs.h" #include "../../test_common/gl/setup.h" #include "../../test_common/harness/testHarness.h" +#include "../../test_common/harness/parseParameters.h" #if !defined(_WIN32) #include @@ -160,7 +161,13 @@ int main(int argc, const char *argv[]) int error = 0; int numErrors = 0; - test_start(); + test_start(); + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish (); + return -1; + } cl_device_type requestedDeviceType = CL_DEVICE_TYPE_DEFAULT; checkDeviceTypeOverride(&requestedDeviceType); diff --git a/test_conformance/gles/CMakeLists.txt b/test_conformance/gles/CMakeLists.txt index a0aed0ee..c5294e82 100644 --- a/test_conformance/gles/CMakeLists.txt +++ b/test_conformance/gles/CMakeLists.txt @@ -9,7 +9,7 @@ set (${MODULE_NAME}_SOURCES test_images_2D_info.cpp test_images_3D_info.cpp test_renderbuffer_info.cpp - test_fence_sync.cpp + test_fence_sync.cpp helpers.cpp setup_egl.cpp ../../test_common/gles/helpers.cpp @@ -21,6 +21,8 @@ set (${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) if(ANDROID) diff --git a/test_conformance/half/CMakeLists.txt b/test_conformance/half/CMakeLists.txt index 6e92a888..4b151270 100644 --- a/test_conformance/half/CMakeLists.txt +++ b/test_conformance/half/CMakeLists.txt @@ -10,8 +10,9 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/errorHelpers.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/ThreadPool.c - ../../test_common/harness/testHarness.c ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/testHarness.c + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/half/main.c b/test_conformance/half/main.c index 7c3aa7ff..a68b5f9e 100644 --- a/test_conformance/half/main.c +++ b/test_conformance/half/main.c @@ -93,6 +93,13 @@ int main (int argc, const char **argv ) g_arrVecAligns[i] = alignbound; } + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish(); + return -1; + } + if( (error = ParseArgs( argc, argv )) ) goto exit; diff --git a/test_conformance/headers/CMakeLists.txt b/test_conformance/headers/CMakeLists.txt index 82e2d397..46705e6b 100644 --- a/test_conformance/headers/CMakeLists.txt +++ b/test_conformance/headers/CMakeLists.txt @@ -4,6 +4,8 @@ set(HEADERS_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/testHarness.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) set_source_files_properties(${HEADERS_SOURCES} PROPERTIES LANGUAGE CXX) diff --git a/test_conformance/headers/test_headers.c b/test_conformance/headers/test_headers.c index c9895bc3..9d40a9fc 100644 --- a/test_conformance/headers/test_headers.c +++ b/test_conformance/headers/test_headers.c @@ -18,7 +18,7 @@ #else #include #endif - +#include #include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/testHarness.h" diff --git a/test_conformance/images/clCopyImage/CMakeLists.txt b/test_conformance/images/clCopyImage/CMakeLists.txt index ab73be41..b876fdc7 100644 --- a/test_conformance/images/clCopyImage/CMakeLists.txt +++ b/test_conformance/images/clCopyImage/CMakeLists.txt @@ -21,6 +21,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/conversions.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/clFillImage/CMakeLists.txt b/test_conformance/images/clFillImage/CMakeLists.txt index ac47af0b..274de2d7 100644 --- a/test_conformance/images/clFillImage/CMakeLists.txt +++ b/test_conformance/images/clFillImage/CMakeLists.txt @@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/conversions.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) diff --git a/test_conformance/images/clFillImage/test_fill_2D_array.cpp b/test_conformance/images/clFillImage/test_fill_2D_array.cpp index 36dacd40..be2a8159 100644 --- a/test_conformance/images/clFillImage/test_fill_2D_array.cpp +++ b/test_conformance/images/clFillImage/test_fill_2D_array.cpp @@ -1,6 +1,6 @@ // // 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 diff --git a/test_conformance/images/clGetInfo/CMakeLists.txt b/test_conformance/images/clGetInfo/CMakeLists.txt index ecface31..7722f788 100644 --- a/test_conformance/images/clGetInfo/CMakeLists.txt +++ b/test_conformance/images/clGetInfo/CMakeLists.txt @@ -16,6 +16,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/testHarness.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/clReadWriteImage/CMakeLists.txt b/test_conformance/images/clReadWriteImage/CMakeLists.txt index f8da6d30..557d94df 100644 --- a/test_conformance/images/clReadWriteImage/CMakeLists.txt +++ b/test_conformance/images/clReadWriteImage/CMakeLists.txt @@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/testHarness.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/kernel_image_methods/CMakeLists.txt b/test_conformance/images/kernel_image_methods/CMakeLists.txt index e5ed84b5..e0477424 100644 --- a/test_conformance/images/kernel_image_methods/CMakeLists.txt +++ b/test_conformance/images/kernel_image_methods/CMakeLists.txt @@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/testHarness.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/kernel_image_methods/main.cpp b/test_conformance/images/kernel_image_methods/main.cpp index a39955e4..d9f6c029 100644 --- a/test_conformance/images/kernel_image_methods/main.cpp +++ b/test_conformance/images/kernel_image_methods/main.cpp @@ -14,6 +14,7 @@ // limitations under the License. // #include "../../../test_common/harness/compat.h" +#include "../../../test_common/harness/parseParameters.h" #include #include @@ -74,6 +75,13 @@ int main(int argc, const char *argv[]) { cl_channel_type chanType; + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish(); + return -1; + } + checkDeviceTypeOverride( &gDeviceType ); const char ** argList = (const char **)calloc( argc, sizeof( char*) ); diff --git a/test_conformance/images/kernel_read_write/CMakeLists.txt b/test_conformance/images/kernel_read_write/CMakeLists.txt index cc8d4dec..808f285f 100644 --- a/test_conformance/images/kernel_read_write/CMakeLists.txt +++ b/test_conformance/images/kernel_read_write/CMakeLists.txt @@ -22,6 +22,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/testHarness.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/kernel_read_write/main.cpp b/test_conformance/images/kernel_read_write/main.cpp index aa7d7b0e..30570b73 100644 --- a/test_conformance/images/kernel_read_write/main.cpp +++ b/test_conformance/images/kernel_read_write/main.cpp @@ -25,6 +25,7 @@ #include "../testBase.h" #include "../../../test_common/harness/fpcontrol.h" +#include "../../../test_common/harness/parseParameters.h" #include @@ -266,6 +267,13 @@ int main(int argc, const char *argv[]) cl_channel_type chanType; cl_channel_order chanOrder; + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + test_finish(); + return -1; + } + //Check CL_DEVICE_TYPE environment variable checkDeviceTypeOverride( &gDeviceType ); diff --git a/test_conformance/images/samplerlessReads/CMakeLists.txt b/test_conformance/images/samplerlessReads/CMakeLists.txt index 5d871bc1..4926ef4d 100644 --- a/test_conformance/images/samplerlessReads/CMakeLists.txt +++ b/test_conformance/images/samplerlessReads/CMakeLists.txt @@ -18,6 +18,8 @@ set(${MODULE_NAME}_SOURCES ../../../test_common/harness/testHarness.c ../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/msvc9.c + ../../../test_common/harness/parseParameters.cpp + ../../../test_common/harness/crc32.c ) include(../../CMakeCommon.txt) diff --git a/test_conformance/images/samplerlessReads/main.cpp b/test_conformance/images/samplerlessReads/main.cpp index df43111b..29295619 100644 --- a/test_conformance/images/samplerlessReads/main.cpp +++ b/test_conformance/images/samplerlessReads/main.cpp @@ -25,6 +25,7 @@ #include "../testBase.h" #include "../../../test_common/harness/fpcontrol.h" +#include "../../../test_common/harness/parseParameters.h" #if defined(__PPC__) // Global varaiable used to hold the FPU control register state. The FPSCR register can not @@ -87,6 +88,12 @@ int main(int argc, const char *argv[]) cl_channel_type chanType; cl_channel_order chanOrder; + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + return -1; + } + //Check CL_DEVICE_TYPE environment variable checkDeviceTypeOverride( &gDeviceType ); diff --git a/test_conformance/integer_ops/CMakeLists.txt b/test_conformance/integer_ops/CMakeLists.txt index 4d3692a5..4f49c71f 100644 --- a/test_conformance/integer_ops/CMakeLists.txt +++ b/test_conformance/integer_ops/CMakeLists.txt @@ -19,8 +19,9 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/testHarness.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) - include(../CMakeCommon.txt) diff --git a/test_conformance/math_brute_force/CMakeLists.txt b/test_conformance/math_brute_force/CMakeLists.txt index 9eb2f8ae..632c8c90 100644 --- a/test_conformance/math_brute_force/CMakeLists.txt +++ b/test_conformance/math_brute_force/CMakeLists.txt @@ -23,10 +23,11 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/ThreadPool.c ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp ../../test_common/harness/kernelHelpers.c ../../test_common/harness/errorHelpers.c ../../test_common/harness/testHarness.c - ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) @@ -51,6 +52,7 @@ endif(NOT ANDROID) set_source_files_properties( ${MODULE_NAME}_SOURCES + ../../test_common/harness/crc32.c PROPERTIES LANGUAGE CXX) if(CMAKE_COMPILER_IS_GNUCC) diff --git a/test_conformance/math_brute_force/main.c b/test_conformance/math_brute_force/main.c index 194a4249..4a606bb1 100644 --- a/test_conformance/math_brute_force/main.c +++ b/test_conformance/math_brute_force/main.c @@ -13,7 +13,6 @@ // See the License for the specific language governing permissions and // limitations under the License. // -#include "../../test_common/harness/parseParameters.h" #include "Utility.h" #include @@ -26,6 +25,7 @@ #include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/kernelHelpers.h" +#include "../../test_common/harness/parseParameters.h" #if defined( __APPLE__ ) #include @@ -814,6 +814,11 @@ int main (int argc, const char * argv[]) { int error; + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + return -1; + } atexit(TestFinishAtExit); #if defined( __APPLE__ ) diff --git a/test_conformance/mem_host_flags/CMakeLists.txt b/test_conformance/mem_host_flags/CMakeLists.txt index e5cbaab4..d1d2b794 100644 --- a/test_conformance/mem_host_flags/CMakeLists.txt +++ b/test_conformance/mem_host_flags/CMakeLists.txt @@ -14,6 +14,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/conversions.c ../../test_common/harness/ThreadPool.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/multiple_device_context/CMakeLists.txt b/test_conformance/multiple_device_context/CMakeLists.txt index 2c05687a..fe1fd227 100644 --- a/test_conformance/multiple_device_context/CMakeLists.txt +++ b/test_conformance/multiple_device_context/CMakeLists.txt @@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/conversions.c ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) @@ -28,6 +30,8 @@ set_source_files_properties( ../../test_common/harness/kernelHelpers.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c PROPERTIES LANGUAGE CXX) include(../CMakeCommon.txt) diff --git a/test_conformance/non_uniform_work_group/CMakeLists.txt b/test_conformance/non_uniform_work_group/CMakeLists.txt index c36b5861..ea2cc1af 100644 --- a/test_conformance/non_uniform_work_group/CMakeLists.txt +++ b/test_conformance/non_uniform_work_group/CMakeLists.txt @@ -12,6 +12,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/errorHelpers.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/pipes/CMakeLists.txt b/test_conformance/pipes/CMakeLists.txt index 62733688..63bd916e 100644 --- a/test_conformance/pipes/CMakeLists.txt +++ b/test_conformance/pipes/CMakeLists.txt @@ -16,6 +16,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/printf/CMakeLists.txt b/test_conformance/printf/CMakeLists.txt index ff01448b..71d73c16 100644 --- a/test_conformance/printf/CMakeLists.txt +++ b/test_conformance/printf/CMakeLists.txt @@ -14,6 +14,9 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/msvc9.c ../../test_common/harness/testHarness.c #../../test_common/harness/imageHelpers.cpp + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/kernelHelpers.c + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/printf/test_printf.c b/test_conformance/printf/test_printf.c index 2817a960..ce26f955 100644 --- a/test_conformance/printf/test_printf.c +++ b/test_conformance/printf/test_printf.c @@ -41,6 +41,7 @@ #include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/kernelHelpers.h" #include "../../test_common/harness/mt19937.h" +#include "../../test_common/harness/parseParameters.h" typedef unsigned int uint32_t; @@ -994,8 +995,14 @@ const int test_num = ARRAY_SIZE( test_list ); //----------------------------------------- // main //----------------------------------------- -int main(int argc, char* argv[]) +int main(int argc, const char* argv[]) { + argc = parseCustomParam(argc, argv); + if (argc == -1) + { + return -1; + } + const char ** argList = (const char **)calloc( argc, sizeof( char*) ); if( NULL == argList ) diff --git a/test_conformance/profiling/CMakeLists.txt b/test_conformance/profiling/CMakeLists.txt index e8304b39..914d3295 100644 --- a/test_conformance/profiling/CMakeLists.txt +++ b/test_conformance/profiling/CMakeLists.txt @@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/relationals/CMakeLists.txt b/test_conformance/relationals/CMakeLists.txt index d7def1a3..81da7d2d 100644 --- a/test_conformance/relationals/CMakeLists.txt +++ b/test_conformance/relationals/CMakeLists.txt @@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/select/CMakeLists.txt b/test_conformance/select/CMakeLists.txt index 6f25c466..97bd24b2 100644 --- a/test_conformance/select/CMakeLists.txt +++ b/test_conformance/select/CMakeLists.txt @@ -9,6 +9,7 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/errorHelpers.c ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_conformance/spir/CMakeLists.txt b/test_conformance/spir/CMakeLists.txt index edd0b1f0..c794cd2d 100644 --- a/test_conformance/spir/CMakeLists.txt +++ b/test_conformance/spir/CMakeLists.txt @@ -17,7 +17,8 @@ set (SPIR_SOURCES ../../test_common/harness/msvc9.c ../../test_common/harness/os_helpers.cpp ../../test_common/harness/testHarness.c - ../../test_common/miniz/miniz.c) + ../../test_common/miniz/miniz.c + ../../test_common/harness/crc32.c) add_executable(${SPIR_OUT} ${SPIR_SOURCES}) diff --git a/test_conformance/spir/main.cpp b/test_conformance/spir/main.cpp index 52628e37..b44c8cbc 100644 --- a/test_conformance/spir/main.cpp +++ b/test_conformance/spir/main.cpp @@ -349,7 +349,6 @@ bool test_suite(cl_device_id device, cl_uint size_t_width, const char *folder, std::cout << std::endl; return false; } - std::cout << std::endl; return true; } diff --git a/test_conformance/subgroups/CMakeLists.txt b/test_conformance/subgroups/CMakeLists.txt index 85decf63..7e7c11ce 100644 --- a/test_conformance/subgroups/CMakeLists.txt +++ b/test_conformance/subgroups/CMakeLists.txt @@ -14,7 +14,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/msvc9.c ../../test_common/harness/ThreadPool.c ../../test_common/harness/conversions.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) - include(../CMakeCommon.txt) diff --git a/test_conformance/thread_dimensions/CMakeLists.txt b/test_conformance/thread_dimensions/CMakeLists.txt index 3df2b9cb..68569771 100644 --- a/test_conformance/thread_dimensions/CMakeLists.txt +++ b/test_conformance/thread_dimensions/CMakeLists.txt @@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/conversions.c ../../test_common/harness/msvc9.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) set_source_files_properties( diff --git a/test_conformance/vec_align/CMakeLists.txt b/test_conformance/vec_align/CMakeLists.txt index 7fd56c0f..c66f559a 100644 --- a/test_conformance/vec_align/CMakeLists.txt +++ b/test_conformance/vec_align/CMakeLists.txt @@ -12,6 +12,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/kernelHelpers.c ../../test_common/harness/errorHelpers.c ../../test_common/harness/conversions.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) set_source_files_properties( diff --git a/test_conformance/vec_step/CMakeLists.txt b/test_conformance/vec_step/CMakeLists.txt index 6b7090d4..f9cf1a69 100644 --- a/test_conformance/vec_step/CMakeLists.txt +++ b/test_conformance/vec_step/CMakeLists.txt @@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/msvc9.c ../../test_common/harness/kernelHelpers.c ../../test_common/harness/errorHelpers.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) set_source_files_properties( diff --git a/test_conformance/workgroups/CMakeLists.txt b/test_conformance/workgroups/CMakeLists.txt index d0f83464..0fc0c860 100644 --- a/test_conformance/workgroups/CMakeLists.txt +++ b/test_conformance/workgroups/CMakeLists.txt @@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES ../../test_common/harness/mt19937.c ../../test_common/harness/msvc9.c ../../test_common/harness/conversions.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ) include(../CMakeCommon.txt) diff --git a/test_extensions/media_sharing/CMakeLists.txt b/test_extensions/media_sharing/CMakeLists.txt index 44ef6a45..2cf3e677 100644 --- a/test_extensions/media_sharing/CMakeLists.txt +++ b/test_extensions/media_sharing/CMakeLists.txt @@ -18,6 +18,8 @@ set (MEDIA_SOURCES ../../test_common/harness/rounding_mode.c ../../test_common/harness/typeWrappers.cpp ../../test_common/harness/mt19937.c + ../../test_common/harness/parseParameters.cpp + ../../test_common/harness/crc32.c ../../test_common/harness/msvc9.c )