From 51db6e87cfec4ec767c680628b7f218f06b06080 Mon Sep 17 00:00:00 2001 From: Grzegorz Wawiorko <35483345+gwawiork@users.noreply.github.com> Date: Thu, 23 May 2019 19:20:59 +0200 Subject: [PATCH] cl20: Fix Issue #35 - ask for capability size. Too small size could cause errors (#95) * Fix Issue #35 - ask for capability size. Too small size could cause errors * Fix Issue #35 - fix windows compilation failure * Fix Issue #35 - Review fixes * Fix Issue #35 - Review fixes - build issues fixed --- test_conformance/computeinfo/main.c | 18 ++++++++++++--- .../conversions/test_conversions.c | 18 +++++++++------ test_conformance/d3d10/harness.cpp | 20 ++++++++-------- test_conformance/d3d10/harness.h | 1 + test_conformance/d3d10/main.cpp | 4 +--- test_conformance/spir/run_services.cpp | 23 +++++++++++-------- 6 files changed, 53 insertions(+), 31 deletions(-) diff --git a/test_conformance/computeinfo/main.c b/test_conformance/computeinfo/main.c index 715ea583..cd41cae8 100644 --- a/test_conformance/computeinfo/main.c +++ b/test_conformance/computeinfo/main.c @@ -74,7 +74,7 @@ typedef union size_t sizet; size_t sizet_arr[3]; cl_ulong ull; - char string[1024]; + char * string; cl_device_svm_capabilities svmCapabilities; } config_data; @@ -319,6 +319,7 @@ int getConfigInfo(cl_device_id device, config_info* info) { int err = CL_SUCCESS; int size_err = 0; + size_t config_size_set; size_t config_size_ret; switch(info->config_type) { @@ -371,7 +372,13 @@ int getConfigInfo(cl_device_id device, config_info* info) size_err = config_size_ret != sizeof(info->config.ull); break; case type_string: - err = clGetDeviceInfo(device, info->opcode, sizeof(info->config.string), &info->config.string, &config_size_ret); + err = clGetDeviceInfo(device, info->opcode, 0, NULL, &config_size_set); + info->config.string = NULL; + if (err == CL_SUCCESS && config_size_set > 0) { + info->config.string = (char*)malloc(config_size_set); + err = clGetDeviceInfo(device, info->opcode, config_size_set, info->config.string, &config_size_ret); + size_err = config_size_set != config_size_ret; + } break; case type_cl_device_svm_capabilities: err = clGetDeviceInfo(device, info->opcode, sizeof(info->config.svmCapabilities), &info->config.svmCapabilities, &config_size_ret); @@ -519,7 +526,7 @@ void dumpConfigInfo(cl_device_id device, config_info* info) log_info("\t%s == %lld\n", info->opcode_name, info->config.ull); break; case type_string: - log_info("\t%s == \"%s\"\n", info->opcode_name, info->config.string); + log_info("\t%s == \"%s\"\n", info->opcode_name, info->config.string ? info->config.string : ""); break; case type_cl_device_svm_capabilities: log_info("\t%s == %s|%s|%s|%s\n", info->opcode_name, @@ -670,15 +677,20 @@ int getConfigInfos( cl_device_id device ) err = parseVersion( info.config.string, & version ); if ( err ) { total_errors++; + free(info.config.string); break; } } else if ( info.opcode == CL_DEVICE_EXTENSIONS ) { err = parseExtensions( info.config.string, & extensions ); if ( err ) { total_errors++; + free(info.config.string); break; } } + if (info.config_type == type_string) { + free(info.config.string); + } } else { total_errors++; } diff --git a/test_conformance/conversions/test_conversions.c b/test_conformance/conversions/test_conversions.c index 3d384353..2e5ca701 100644 --- a/test_conformance/conversions/test_conversions.c +++ b/test_conformance/conversions/test_conversions.c @@ -697,18 +697,22 @@ test_status InitCL( cl_device_id device ) gIsRTZ = 1; } - char extensions[2048] = ""; - if( (error = clGetDeviceInfo( device, CL_DEVICE_EXTENSIONS, sizeof( extensions ), extensions, NULL ) ) ) - { - vlog_error( "FAILURE: unable to get device info for CL_DEVICE_EXTENSIONS!" ); - return TEST_FAIL; - } - else if( strstr( extensions, "cl_khr_fp64" ) ) + else if(is_extension_available(device, "cl_khr_fp64")) { gHasDouble = 1; } gTestDouble &= gHasDouble; + //detect whether profile of the device is embedded + char profile[1024] = ""; + if( (error = clGetDeviceInfo( device, CL_DEVICE_PROFILE, sizeof(profile), profile, NULL ) ) ){} + else if( strstr(profile, "EMBEDDED_PROFILE" ) ) + { + gIsEmbedded = 1; + if( !is_extension_available(device, "cles_khr_int64" ) ) + gHasLong = 0; + } + gContext = clCreateContext( NULL, 1, &device, notify_callback, NULL, &error ); if( NULL == gContext || error ) diff --git a/test_conformance/d3d10/harness.cpp b/test_conformance/d3d10/harness.cpp index 13829760..44571451 100644 --- a/test_conformance/d3d10/harness.cpp +++ b/test_conformance/d3d10/harness.cpp @@ -39,15 +39,18 @@ HarnessD3D10_ExtensionCheck() bool extensionPresent = false; cl_int result = CL_SUCCESS; cl_platform_id platform = NULL; - char extensions[1024]; + size_t set_size; HarnessD3D10_TestBegin("Extension query"); result = clGetPlatformIDs(1, &platform, NULL); - NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); - result = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, sizeof(extensions), extensions, NULL); - NonTestRequire(result == CL_SUCCESS, "Failed to list extensions."); - extensionPresent = strstr(extensions, "cl_khr_d3d10_sharing") ? true : false; + NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); + result = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, 0, NULL, &set_size); + NonTestRequire(result == CL_SUCCESS, "Failed to get size of extensions string."); + std::vector extensions(set_size); + result = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, extensions.size(), extensions.data(), NULL); + NonTestRequire(result == CL_SUCCESS, "Failed to list extensions."); + extensionPresent = strstr(extensions.data(), "cl_khr_d3d10_sharing") ? true : false; if (!extensionPresent) { // platform is required to report the extension only if all devices support it @@ -59,11 +62,10 @@ HarnessD3D10_ExtensionCheck() NonTestRequire(result == CL_SUCCESS, "Failed to get devices count."); for (cl_uint i = 0; i < devicesCount; i++) { - clGetDeviceInfo(devices[i], CL_DEVICE_EXTENSIONS, sizeof(extensions), extensions, NULL); - NonTestRequire(result == CL_SUCCESS, "Failed to list extensions."); - extensionPresent = strstr(extensions, "cl_khr_d3d10_sharing") ? true : false; - if (extensionPresent) + if (is_extension_available(devices[i], "cl_khr_d3d10_sharing")) { + extensionPresent = true; break; + } } } diff --git a/test_conformance/d3d10/harness.h b/test_conformance/d3d10/harness.h index 317c555f..a17839b2 100644 --- a/test_conformance/d3d10/harness.h +++ b/test_conformance/d3d10/harness.h @@ -40,6 +40,7 @@ typedef unsigned char UINT8; #include #include #include "errorHelpers.h" +#include "../test_common/harness/kernelHelpers.h" // #define log_info(...) printf(__VA_ARGS__) // #define log_error(...) printf(__VA_ARGS__) diff --git a/test_conformance/d3d10/main.cpp b/test_conformance/d3d10/main.cpp index 99122f4f..8e2de28f 100644 --- a/test_conformance/d3d10/main.cpp +++ b/test_conformance/d3d10/main.cpp @@ -205,7 +205,6 @@ void TestAdapterDevices(cl_platform_id platform, IDXGIAdapter* pAdapter, ID3D10D cl_int result; cl_uint num_devices = 0; cl_device_id* devices = NULL; - char extensions[8192]; devices = new cl_device_id[num_devices_expected]; NonTestRequire( @@ -230,8 +229,7 @@ void TestAdapterDevices(cl_platform_id platform, IDXGIAdapter* pAdapter, ID3D10D for (cl_uint i = 0; i < num_devices; ++i) { // make sure the device supports the extension - result = clGetDeviceInfo(devices[i], CL_DEVICE_EXTENSIONS, sizeof(extensions), extensions, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get extensions."); - if (strstr(extensions, "cl_khr_d3d10_sharing") == NULL) { + if (!is_extension_available(devices[i], "cl_khr_d3d10_sharing")) { TestPrint("Device does not support cl_khr_d3d10_sharing extension\n"); continue; } diff --git a/test_conformance/spir/run_services.cpp b/test_conformance/spir/run_services.cpp index cefae082..e6b0b4f6 100644 --- a/test_conformance/spir/run_services.cpp +++ b/test_conformance/spir/run_services.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "exceptions.h" #include "datagen.h" @@ -345,15 +346,19 @@ DataRow& DataTable::operator[](int index) */ OclExtensions OclExtensions::getDeviceCapabilities(cl_device_id devId) { - char extensions[1024] = {0}; size_t size; - + size_t set_size; + cl_int errcode = clGetDeviceInfo(devId, CL_DEVICE_EXTENSIONS, 0, NULL, &set_size); + if (errcode) + throw Exceptions::TestError("Device query failed"); // Querying the device for its supported extensions - cl_int errcode = clGetDeviceInfo(devId, - CL_DEVICE_EXTENSIONS, - sizeof(extensions), - extensions, - &size); + std::vector extensions(set_size); + errcode = clGetDeviceInfo(devId, + CL_DEVICE_EXTENSIONS, + extensions.size(), + extensions.data(), + &size); + if (errcode) throw Exceptions::TestError("Device query failed"); @@ -367,13 +372,13 @@ OclExtensions OclExtensions::getDeviceCapabilities(cl_device_id devId) throw Exceptions::TestError("Device query failed"); OclExtensions ret = OclExtensions::empty(); - assert(size < sizeof(extensions)); + assert(size == set_size); if (!size) return ret; // Iterate over the extensions, and convert them into the bit field. std::list extVector; - std::stringstream khrStream(extensions); + std::stringstream khrStream(extensions.data()); std::copy(std::istream_iterator(khrStream), std::istream_iterator(), std::back_inserter(extVector));