mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
Stop using optimally-tiled images in external memory tests (#2349)
Support for optimally-tiled images and tiling inference in general is implementation-defined. It should not be relied upon in the CTS. Also build the code base as C++17 for std::optional. Many Khronos projects are now using C++17 and the transition in the CTS is IMO overdue. Signed-off-by: Kevin Petit <kevin.petit@arm.com>
This commit is contained in:
@@ -705,13 +705,17 @@ clExternalMemoryImage::clExternalMemoryImage(
|
|||||||
std::vector<cl_mem_properties> extMemProperties1;
|
std::vector<cl_mem_properties> extMemProperties1;
|
||||||
cl_device_id devList[] = { deviceId, NULL };
|
cl_device_id devList[] = { deviceId, NULL };
|
||||||
|
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling = vkClExternalMemoryHandleTilingAssumption(
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
deviceId, externalMemoryHandleType, &errcode_ret);
|
||||||
deviceId, externalMemoryHandleType, &errcode_ret);
|
|
||||||
if (CL_SUCCESS != errcode_ret)
|
if (CL_SUCCESS != errcode_ret)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to query OpenCL tiling mode");
|
throw std::runtime_error("Failed to query OpenCL tiling mode");
|
||||||
}
|
}
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Could not find image tiling supported by both Vulkan and OpenCL");
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!is_extension_available(devList[0], "cl_khr_external_memory_win32"))
|
if (!is_extension_available(devList[0], "cl_khr_external_memory_win32"))
|
||||||
@@ -1206,12 +1210,11 @@ cl_external_memory_handle_type_khr vkToOpenCLExternalMemoryHandleType(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
|
std::optional<VulkanImageTiling> vkClExternalMemoryHandleTilingAssumption(
|
||||||
cl_device_id deviceId,
|
cl_device_id deviceId,
|
||||||
VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret)
|
VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret)
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
VulkanImageTiling mode = VULKAN_IMAGE_TILING_OPTIMAL;
|
|
||||||
|
|
||||||
assert(error_ret
|
assert(error_ret
|
||||||
!= nullptr); // errcode_ret is not optional, it must be checked
|
!= nullptr); // errcode_ret is not optional, it must be checked
|
||||||
@@ -1222,12 +1225,12 @@ VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
|
|||||||
0, nullptr, &size);
|
0, nullptr, &size);
|
||||||
if (*error_ret != CL_SUCCESS)
|
if (*error_ret != CL_SUCCESS)
|
||||||
{
|
{
|
||||||
return mode;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
{
|
{
|
||||||
return mode;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<cl_external_memory_handle_type_khr> assume_linear_types(
|
std::vector<cl_external_memory_handle_type_khr> assume_linear_types(
|
||||||
@@ -1239,7 +1242,7 @@ VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
|
|||||||
size, assume_linear_types.data(), nullptr);
|
size, assume_linear_types.data(), nullptr);
|
||||||
if (*error_ret != CL_SUCCESS)
|
if (*error_ret != CL_SUCCESS)
|
||||||
{
|
{
|
||||||
return mode;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (std::find(
|
if (std::find(
|
||||||
@@ -1247,8 +1250,8 @@ VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
|
|||||||
vkToOpenCLExternalMemoryHandleType(vkExternalMemoryHandleType))
|
vkToOpenCLExternalMemoryHandleType(vkExternalMemoryHandleType))
|
||||||
!= assume_linear_types.end())
|
!= assume_linear_types.end())
|
||||||
{
|
{
|
||||||
mode = VULKAN_IMAGE_TILING_LINEAR;
|
return VULKAN_IMAGE_TILING_LINEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mode;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
#include <OpenCL/cl_ext.h>
|
#include <OpenCL/cl_ext.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#define CREATE_OPENCL_SEMAPHORE(clSemaphore, vkSemaphore, ctx, handleType, \
|
#define CREATE_OPENCL_SEMAPHORE(clSemaphore, vkSemaphore, ctx, handleType, \
|
||||||
devIdx, createExportable) \
|
devIdx, createExportable) \
|
||||||
if (!(createExportable \
|
if (!(createExportable \
|
||||||
@@ -187,8 +189,8 @@ public:
|
|||||||
extern void init_cl_vk_ext(cl_platform_id, cl_uint num_devices,
|
extern void init_cl_vk_ext(cl_platform_id, cl_uint num_devices,
|
||||||
cl_device_id *deviceIds);
|
cl_device_id *deviceIds);
|
||||||
|
|
||||||
VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
|
std::optional<VulkanImageTiling> vkClExternalMemoryHandleTilingAssumption(
|
||||||
cl_device_id deviceId,
|
cl_device_id deviceId,
|
||||||
VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret);
|
VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret);
|
||||||
|
|
||||||
#endif // _opencl_vulkan_wrapper_hpp_
|
#endif // _opencl_vulkan_wrapper_hpp_
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ public:
|
|||||||
VulkanExternalMemoryHandleType externalMemoryHandleType =
|
VulkanExternalMemoryHandleType externalMemoryHandleType =
|
||||||
VULKAN_EXTERNAL_MEMORY_HANDLE_TYPE_NONE,
|
VULKAN_EXTERNAL_MEMORY_HANDLE_TYPE_NONE,
|
||||||
VulkanImageCreateFlag imageCreateFlags = VULKAN_IMAGE_CREATE_FLAG_NONE,
|
VulkanImageCreateFlag imageCreateFlags = VULKAN_IMAGE_CREATE_FLAG_NONE,
|
||||||
VulkanImageTiling imageTiling = VULKAN_IMAGE_TILING_OPTIMAL,
|
VulkanImageTiling imageTiling = VULKAN_IMAGE_TILING_LINEAR,
|
||||||
VulkanImageUsage imageUsage =
|
VulkanImageUsage imageUsage =
|
||||||
VULKAN_IMAGE_USAGE_SAMPLED_STORAGE_TRANSFER_SRC_DST,
|
VULKAN_IMAGE_USAGE_SAMPLED_STORAGE_TRANSFER_SRC_DST,
|
||||||
VulkanSharingMode sharingMode = VULKAN_SHARING_MODE_EXCLUSIVE);
|
VulkanSharingMode sharingMode = VULKAN_SHARING_MODE_EXCLUSIVE);
|
||||||
|
|||||||
@@ -216,14 +216,19 @@ struct ConsistencyExternalImageTest : public VulkanTestBase
|
|||||||
getSupportedVulkanExternalMemoryHandleTypeList(
|
getSupportedVulkanExternalMemoryHandleTypeList(
|
||||||
vkDevice->getPhysicalDevice())[0];
|
vkDevice->getPhysicalDevice())[0];
|
||||||
|
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling = vkClExternalMemoryHandleTilingAssumption(
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
device, vkExternalMemoryHandleType, &errNum);
|
||||||
device, vkExternalMemoryHandleType, &errNum);
|
|
||||||
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
log_info("No image tiling supported by both Vulkan and OpenCL "
|
||||||
|
"could be found\n");
|
||||||
|
return TEST_SKIPPED_ITSELF;
|
||||||
|
}
|
||||||
|
|
||||||
VulkanImage2D vkImage2D = VulkanImage2D(
|
VulkanImage2D vkImage2D = VulkanImage2D(
|
||||||
*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height,
|
*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height,
|
||||||
vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
*vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
||||||
|
|
||||||
const VulkanMemoryTypeList& memoryTypeList =
|
const VulkanMemoryTypeList& memoryTypeList =
|
||||||
vkImage2D.getMemoryTypeList();
|
vkImage2D.getMemoryTypeList();
|
||||||
|
|||||||
@@ -73,14 +73,20 @@ struct ConsistencyExternalImage1DTest : public VulkanTestBase
|
|||||||
getSupportedVulkanExternalMemoryHandleTypeList(
|
getSupportedVulkanExternalMemoryHandleTypeList(
|
||||||
vkDevice->getPhysicalDevice())[0];
|
vkDevice->getPhysicalDevice())[0];
|
||||||
|
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling = vkClExternalMemoryHandleTilingAssumption(
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
device, vkExternalMemoryHandleType, &errNum);
|
||||||
device, vkExternalMemoryHandleType, &errNum);
|
|
||||||
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
log_info("No image tiling supported by both Vulkan and OpenCL "
|
||||||
|
"could be found\n");
|
||||||
|
return TEST_SKIPPED_ITSELF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
VulkanImage1D vkImage1D =
|
VulkanImage1D vkImage1D =
|
||||||
VulkanImage1D(*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width,
|
VulkanImage1D(*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width,
|
||||||
vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
*vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
||||||
|
|
||||||
const VulkanMemoryTypeList& memoryTypeList =
|
const VulkanMemoryTypeList& memoryTypeList =
|
||||||
vkImage1D.getMemoryTypeList();
|
vkImage1D.getMemoryTypeList();
|
||||||
|
|||||||
@@ -76,14 +76,19 @@ struct ConsistencyExternalImage3DTest : public VulkanTestBase
|
|||||||
getSupportedVulkanExternalMemoryHandleTypeList(
|
getSupportedVulkanExternalMemoryHandleTypeList(
|
||||||
vkDevice->getPhysicalDevice())[0];
|
vkDevice->getPhysicalDevice())[0];
|
||||||
|
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling = vkClExternalMemoryHandleTilingAssumption(
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
device, vkExternalMemoryHandleType, &errNum);
|
||||||
device, vkExternalMemoryHandleType, &errNum);
|
|
||||||
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
log_info("No image tiling supported by both Vulkan and OpenCL "
|
||||||
|
"could be found\n");
|
||||||
|
return TEST_SKIPPED_ITSELF;
|
||||||
|
}
|
||||||
|
|
||||||
VulkanImage3D vkImage3D = VulkanImage3D(
|
VulkanImage3D vkImage3D = VulkanImage3D(
|
||||||
*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height, depth,
|
*vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height, depth,
|
||||||
vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
*vulkanImageTiling, 1, vkExternalMemoryHandleType);
|
||||||
|
|
||||||
const VulkanMemoryTypeList& memoryTypeList =
|
const VulkanMemoryTypeList& memoryTypeList =
|
||||||
vkImage3D.getMemoryTypeList();
|
vkImage3D.getMemoryTypeList();
|
||||||
|
|||||||
@@ -368,16 +368,22 @@ int run_test_with_two_queue(
|
|||||||
}
|
}
|
||||||
log_info("External memory handle type: %d \n",
|
log_info("External memory handle type: %d \n",
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling =
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
vkClExternalMemoryHandleTilingAssumption(
|
||||||
deviceId,
|
deviceId,
|
||||||
vkExternalMemoryHandleTypeList[emhtIdx], &err);
|
vkExternalMemoryHandleTypeList[emhtIdx], &err);
|
||||||
ASSERT_SUCCESS(err,
|
ASSERT_SUCCESS(err,
|
||||||
"Failed to query OpenCL tiling mode");
|
"Failed to query OpenCL tiling mode");
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
log_info("No image tiling supported by both Vulkan "
|
||||||
|
"and OpenCL could be found\n");
|
||||||
|
return TEST_SKIPPED_ITSELF;
|
||||||
|
}
|
||||||
|
|
||||||
VulkanImage2D vkDummyImage2D(
|
VulkanImage2D vkDummyImage2D(
|
||||||
vkDevice, vkFormatList[0], widthList[0],
|
vkDevice, vkFormatList[0], widthList[0],
|
||||||
heightList[0], vulkanImageTiling, 1,
|
heightList[0], *vulkanImageTiling, 1,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
const VulkanMemoryTypeList &memoryTypeList =
|
const VulkanMemoryTypeList &memoryTypeList =
|
||||||
vkDummyImage2D.getMemoryTypeList();
|
vkDummyImage2D.getMemoryTypeList();
|
||||||
@@ -405,7 +411,7 @@ int run_test_with_two_queue(
|
|||||||
{
|
{
|
||||||
VulkanImage2D vkImage2D(
|
VulkanImage2D vkImage2D(
|
||||||
vkDevice, vkFormat, width, height,
|
vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
|
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
|
||||||
totalImageMemSize =
|
totalImageMemSize =
|
||||||
@@ -414,7 +420,7 @@ int run_test_with_two_queue(
|
|||||||
}
|
}
|
||||||
VulkanImage2DList vkImage2DList(
|
VulkanImage2DList vkImage2DList(
|
||||||
num2DImages, vkDevice, vkFormat, width, height,
|
num2DImages, vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
|
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
|
||||||
{
|
{
|
||||||
@@ -436,7 +442,7 @@ int run_test_with_two_queue(
|
|||||||
vkDevice, vkImage2DList);
|
vkDevice, vkImage2DList);
|
||||||
VulkanImage2DList vkImage2DList2(
|
VulkanImage2DList vkImage2DList2(
|
||||||
num2DImages, vkDevice, vkFormat, width, height,
|
num2DImages, vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
|
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
|
||||||
{
|
{
|
||||||
@@ -982,16 +988,21 @@ int run_test_with_one_queue(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
VulkanImageTiling vulkanImageTiling =
|
auto vulkanImageTiling =
|
||||||
vkClExternalMemoryHandleTilingAssumption(
|
vkClExternalMemoryHandleTilingAssumption(
|
||||||
deviceId,
|
deviceId,
|
||||||
vkExternalMemoryHandleTypeList[emhtIdx], &err);
|
vkExternalMemoryHandleTypeList[emhtIdx], &err);
|
||||||
test_error_and_cleanup(
|
test_error_and_cleanup(
|
||||||
err, CLEANUP, "Failed to query OpenCL tiling mode");
|
err, CLEANUP, "Failed to query OpenCL tiling mode");
|
||||||
|
if (vulkanImageTiling == std::nullopt)
|
||||||
|
{
|
||||||
|
log_info("No image tiling supported by both Vulkan "
|
||||||
|
"and OpenCL could be found\n");
|
||||||
|
return TEST_SKIPPED_ITSELF;
|
||||||
|
}
|
||||||
VulkanImage2D vkDummyImage2D(
|
VulkanImage2D vkDummyImage2D(
|
||||||
vkDevice, vkFormatList[0], widthList[0],
|
vkDevice, vkFormatList[0], widthList[0],
|
||||||
heightList[0], vulkanImageTiling, 1,
|
heightList[0], *vulkanImageTiling, 1,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
const VulkanMemoryTypeList &memoryTypeList =
|
const VulkanMemoryTypeList &memoryTypeList =
|
||||||
vkDummyImage2D.getMemoryTypeList();
|
vkDummyImage2D.getMemoryTypeList();
|
||||||
@@ -1018,7 +1029,7 @@ int run_test_with_one_queue(
|
|||||||
{
|
{
|
||||||
VulkanImage2D vkImage2D(
|
VulkanImage2D vkImage2D(
|
||||||
vkDevice, vkFormat, width, height,
|
vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
|
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
|
||||||
totalImageMemSize =
|
totalImageMemSize =
|
||||||
@@ -1027,7 +1038,7 @@ int run_test_with_one_queue(
|
|||||||
}
|
}
|
||||||
VulkanImage2DList vkImage2DList(
|
VulkanImage2DList vkImage2DList(
|
||||||
num2DImages, vkDevice, vkFormat, width, height,
|
num2DImages, vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
for (size_t bIdx = 0; bIdx < vkImage2DList.size();
|
for (size_t bIdx = 0; bIdx < vkImage2DList.size();
|
||||||
bIdx++)
|
bIdx++)
|
||||||
@@ -1053,7 +1064,7 @@ int run_test_with_one_queue(
|
|||||||
|
|
||||||
VulkanImage2DList vkImage2DList2(
|
VulkanImage2DList vkImage2DList2(
|
||||||
num2DImages, vkDevice, vkFormat, width, height,
|
num2DImages, vkDevice, vkFormat, width, height,
|
||||||
vulkanImageTiling, numMipLevels,
|
*vulkanImageTiling, numMipLevels,
|
||||||
vkExternalMemoryHandleType);
|
vkExternalMemoryHandleType);
|
||||||
for (size_t bIdx = 0; bIdx < vkImage2DList2.size();
|
for (size_t bIdx = 0; bIdx < vkImage2DList2.size();
|
||||||
bIdx++)
|
bIdx++)
|
||||||
|
|||||||
Reference in New Issue
Block a user