External memory updates (#1676)

* Vulkan: Fix descriptor sets

Use descriptor set arrays when programming
arrays for compute shader.

Change-Id: Idabab775a256a223660eb7a850e26f290453659e

* Vulkan: Fix queue propertyies

Transfer bit for queue family is not required
to be reported by the implementation, it is
implicit for compute.

Change-Id: I7424b00e25e35145433dd74b0b4dfe7eeeaf98c8

* Vulkan: Allow implementation to choose dedicated memory

Dedicated vs non-dedicated memory must be queried by
the app.  Implementations are not required to support
exportable non-dedicated memory.

Change-Id: Idbc46ace1be20f61d1b58b34756f6d79a7745911

* Fix formatting

Auto-generated formatting fix

* Fix bug in dedicated memory.

* Add check for if OpenCL assumes linear tiling

Change-Id: Idd2e24d9d69e1fbc3ccb4a279067533104185332

* Changed macro name to reflect spec

CL_DEVICE_EXTERNAL_MEMORY_IMPORT_ASSUME_LINEAR_HANDLE_TYPES_KHR to
CL_DEVICE_EXTERNAL_MEMORY_IMPORT_ASSUME_LINEAR_IMAGES_HANDLE_TYPES_KHR

Also changed some functions to not use the KHR variants.

---------

Co-authored-by: Joshua Kelly <joshkell@qti.qualcomm.com>
This commit is contained in:
Sreelakshmi Haridas Maruthur
2023-09-05 10:04:38 -06:00
committed by GitHub
parent c511ac62b0
commit 15b54aa0bd
14 changed files with 518 additions and 267 deletions

View File

@@ -185,7 +185,6 @@ bool useSingleImageKernel = false;
bool useDeviceLocal = false;
bool disableNTHandleType = false;
bool enableOffset = false;
bool non_dedicated = false;
static void printUsage(const char *execName)
{
@@ -232,10 +231,6 @@ size_t parseParams(int argc, const char *argv[], const char **argList)
{
enableOffset = true;
}
if (!strcmp(argv[i], "--non_dedicated"))
{
non_dedicated = true;
}
if (strcmp(argv[i], "-h") == 0)
{
printUsage(argv[0]);

View File

@@ -81,10 +81,11 @@ int test_consistency_external_buffer(cl_device_id deviceID, cl_context _context,
const VulkanMemoryTypeList& memoryTypeList =
vkDummyBuffer.getMemoryTypeList();
VulkanDeviceMemory* vkDeviceMem = new VulkanDeviceMemory(
vkDevice, bufferSize, memoryTypeList[0], vkExternalMemoryHandleType);
VulkanBufferList vkBufferList(1, vkDevice, bufferSize,
vkExternalMemoryHandleType);
VulkanDeviceMemory* vkDeviceMem =
new VulkanDeviceMemory(vkDevice, vkBufferList[0], memoryTypeList[0],
vkExternalMemoryHandleType);
vkDeviceMem->bindBuffer(vkBufferList[0], 0);
@@ -231,22 +232,27 @@ int test_consistency_external_image(cl_device_id deviceID, cl_context _context,
VulkanExternalMemoryHandleType vkExternalMemoryHandleType =
getSupportedVulkanExternalMemoryHandleTypeList()[0];
VulkanImage2D* vkImage2D =
new VulkanImage2D(vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height,
1, vkExternalMemoryHandleType);
const VulkanMemoryTypeList& memoryTypeList = vkImage2D->getMemoryTypeList();
uint64_t totalImageMemSize = vkImage2D->getSize();
VulkanImageTiling vulkanImageTiling =
vkClExternalMemoryHandleTilingAssumption(
deviceID, vkExternalMemoryHandleType, &errNum);
ASSERT_SUCCESS(errNum, "Failed to query OpenCL tiling mode");
VulkanImage2D vkImage2D =
VulkanImage2D(vkDevice, VULKAN_FORMAT_R8G8B8A8_UNORM, width, height,
vulkanImageTiling, 1, vkExternalMemoryHandleType);
const VulkanMemoryTypeList& memoryTypeList = vkImage2D.getMemoryTypeList();
uint64_t totalImageMemSize = vkImage2D.getSize();
log_info("Memory type index: %lu\n", (uint32_t)memoryTypeList[0]);
log_info("Memory type property: %d\n",
memoryTypeList[0].getMemoryTypeProperty());
log_info("Image size : %d\n", totalImageMemSize);
VulkanDeviceMemory* vkDeviceMem =
new VulkanDeviceMemory(vkDevice, totalImageMemSize, memoryTypeList[0],
vkExternalMemoryHandleType);
vkDeviceMem->bindImage(*vkImage2D, 0);
VulkanDeviceMemory* vkDeviceMem = new VulkanDeviceMemory(
vkDevice, vkImage2D, memoryTypeList[0], vkExternalMemoryHandleType);
vkDeviceMem->bindImage(vkImage2D, 0);
void* handle = NULL;
int fd;
@@ -299,7 +305,7 @@ int test_consistency_external_image(cl_device_id deviceID, cl_context _context,
extMemProperties.push_back(0);
const VkImageCreateInfo VulkanImageCreateInfo =
vkImage2D->getVkImageCreateInfo();
vkImage2D.getVkImageCreateInfo();
errNum = getCLImageInfoFromVkImageInfo(
&VulkanImageCreateInfo, totalImageMemSize, &img_format, &image_desc);

View File

@@ -126,8 +126,11 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
std::vector<char> vkBufferShader = readFile("buffer.spv");
VulkanShaderModule vkBufferShaderModule(vkDevice, vkBufferShader);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList(
MAX_BUFFERS + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList;
vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS);
VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
@@ -189,9 +192,9 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
for (size_t bIdx = 0; bIdx < numBuffers; bIdx++)
{
vkBufferListDeviceMemory.push_back(
new VulkanDeviceMemory(vkDevice, bufferSize, memoryType,
vkExternalMemoryHandleType));
vkBufferListDeviceMemory.push_back(new VulkanDeviceMemory(
vkDevice, vkBufferList[bIdx], memoryType,
vkExternalMemoryHandleType));
externalMemory.push_back(new clExternalMemory(
vkBufferListDeviceMemory[bIdx], vkExternalMemoryHandleType,
0, bufferSize, context, deviceId));
@@ -210,8 +213,8 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
vkBufferListDeviceMemory[bIdx]->bindBuffer(vkBufferList[bIdx],
0);
buffers[bIdx] = externalMemory[bIdx]->getExternalMemoryBuffer();
vkDescriptorSet.update((uint32_t)bIdx + 1, vkBufferList[bIdx]);
}
vkDescriptorSet.updateArray(1, numBuffers, vkBufferList);
vkCommandBuffer.begin();
vkCommandBuffer.bindPipeline(vkComputePipeline);
vkCommandBuffer.bindDescriptorSets(
@@ -453,8 +456,11 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
std::vector<char> vkBufferShader = readFile("buffer.spv");
VulkanShaderModule vkBufferShaderModule(vkDevice, vkBufferShader);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList(
MAX_BUFFERS + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList;
vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS);
VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
@@ -517,9 +523,9 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
for (size_t bIdx = 0; bIdx < numBuffers; bIdx++)
{
vkBufferListDeviceMemory.push_back(
new VulkanDeviceMemory(vkDevice, bufferSize, memoryType,
vkExternalMemoryHandleType));
vkBufferListDeviceMemory.push_back(new VulkanDeviceMemory(
vkDevice, vkBufferList[bIdx], memoryType,
vkExternalMemoryHandleType));
externalMemory.push_back(new clExternalMemory(
vkBufferListDeviceMemory[bIdx], vkExternalMemoryHandleType,
0, bufferSize, context, deviceId));
@@ -538,8 +544,9 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
vkBufferListDeviceMemory[bIdx]->bindBuffer(vkBufferList[bIdx],
0);
buffers[bIdx] = externalMemory[bIdx]->getExternalMemoryBuffer();
vkDescriptorSet.update((uint32_t)bIdx + 1, vkBufferList[bIdx]);
}
vkDescriptorSet.updateArray(1, vkBufferList.size(), vkBufferList);
vkCommandBuffer.begin();
vkCommandBuffer.bindPipeline(vkComputePipeline);
vkCommandBuffer.bindDescriptorSets(
@@ -754,8 +761,11 @@ int run_test_with_multi_import_same_ctx(
std::vector<char> vkBufferShader = readFile("buffer.spv");
VulkanShaderModule vkBufferShaderModule(vkDevice, vkBufferShader);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList(
MAX_BUFFERS + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList;
vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS);
VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
@@ -836,7 +846,7 @@ int run_test_with_multi_import_same_ctx(
if (withOffset == 0)
{
vkBufferListDeviceMemory.push_back(
new VulkanDeviceMemory(vkDevice, pBufferSize,
new VulkanDeviceMemory(vkDevice, vkBufferList[bIdx],
memoryType,
vkExternalMemoryHandleType));
}
@@ -880,9 +890,8 @@ int run_test_with_multi_import_same_ctx(
externalMemory[bIdx][cl_bIdx]
->getExternalMemoryBuffer();
}
vkDescriptorSet.update((uint32_t)bIdx + 1,
vkBufferList[bIdx]);
}
vkDescriptorSet.updateArray(1, numBuffers, vkBufferList);
vkCommandBuffer.begin();
vkCommandBuffer.bindPipeline(vkComputePipeline);
vkCommandBuffer.bindDescriptorSets(

View File

@@ -226,9 +226,11 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
srcBufferPtr = (char *)malloc(maxImage2DSize);
dstBufferPtr = (char *)malloc(maxImage2DSize);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList(
VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1,
VULKAN_DESCRIPTOR_TYPE_STORAGE_IMAGE, MAX_2D_IMAGE_DESCRIPTORS);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList;
vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_IMAGE, MAX_2D_IMAGE_DESCRIPTORS);
VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
@@ -255,10 +257,10 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
clCl2VkExternalSemaphore = new clExternalSemaphore(
vkCl2VkSemaphore, context, vkExternalSemaphoreHandleType, deviceId);
std::vector<VulkanDeviceMemory *> vkNonDedicatedImage2DListDeviceMemory1;
std::vector<VulkanDeviceMemory *> vkNonDedicatedImage2DListDeviceMemory2;
std::vector<clExternalMemoryImage *> nonDedicatedExternalMemory1;
std::vector<clExternalMemoryImage *> nonDedicatedExternalMemory2;
std::vector<VulkanDeviceMemory *> vkImage2DListDeviceMemory1;
std::vector<VulkanDeviceMemory *> vkImage2DListDeviceMemory2;
std::vector<clExternalMemoryImage *> externalMemory1;
std::vector<clExternalMemoryImage *> externalMemory2;
std::vector<char> vkImage2DShader;
for (size_t fIdx = 0; fIdx < vkFormatList.size(); fIdx++)
@@ -352,8 +354,6 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
VulkanExternalMemoryHandleType
vkExternalMemoryHandleType =
vkExternalMemoryHandleTypeList[emhtIdx];
log_info("External memory handle type: %d \n",
vkExternalMemoryHandleType);
if ((true == disableNTHandleType)
&& (VULKAN_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_NT
== vkExternalMemoryHandleType))
@@ -361,9 +361,19 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
// Skip running for WIN32 NT handle.
continue;
}
log_info("External memory handle type: %d \n",
vkExternalMemoryHandleType);
VulkanImageTiling vulkanImageTiling =
vkClExternalMemoryHandleTilingAssumption(
deviceId,
vkExternalMemoryHandleTypeList[emhtIdx], &err);
ASSERT_SUCCESS(err,
"Failed to query OpenCL tiling mode");
VulkanImage2D vkDummyImage2D(
vkDevice, vkFormatList[0], widthList[0],
heightList[0], 1, vkExternalMemoryHandleType);
heightList[0], vulkanImageTiling, 1,
vkExternalMemoryHandleType);
const VulkanMemoryTypeList &memoryTypeList =
vkDummyImage2D.getMemoryTypeList();
@@ -390,118 +400,73 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
{
VulkanImage2D vkImage2D(
vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
totalImageMemSize =
ROUND_UP(vkImage2D.getSize(),
vkImage2D.getAlignment());
}
VulkanImage2DList vkNonDedicatedImage2DList(
VulkanImage2DList vkImage2DList(
num2DImages, vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
{
if (non_dedicated)
{
vkNonDedicatedImage2DListDeviceMemory1
.push_back(new VulkanDeviceMemory(
vkDevice, totalImageMemSize,
memoryType,
vkExternalMemoryHandleType));
}
else
{
vkNonDedicatedImage2DListDeviceMemory1
.push_back(new VulkanDeviceMemory(
vkDevice,
vkNonDedicatedImage2DList[bIdx],
memoryType,
vkExternalMemoryHandleType));
}
vkNonDedicatedImage2DListDeviceMemory1[bIdx]
->bindImage(vkNonDedicatedImage2DList[bIdx],
0);
nonDedicatedExternalMemory1.push_back(
vkImage2DListDeviceMemory1.push_back(
new VulkanDeviceMemory(
vkDevice, vkImage2DList[bIdx],
memoryType,
vkExternalMemoryHandleType));
vkImage2DListDeviceMemory1[bIdx]->bindImage(
vkImage2DList[bIdx], 0);
externalMemory1.push_back(
new clExternalMemoryImage(
*vkNonDedicatedImage2DListDeviceMemory1
[bIdx],
*vkImage2DListDeviceMemory1[bIdx],
vkExternalMemoryHandleType, context,
totalImageMemSize, width, height, 0,
vkNonDedicatedImage2DList[bIdx],
deviceId));
vkImage2DList[bIdx], deviceId));
}
VulkanImageViewList vkNonDedicatedImage2DViewList(
vkDevice, vkNonDedicatedImage2DList);
VulkanImage2DList vkNonDedicatedImage2DList2(
VulkanImageViewList vkImage2DViewList(
vkDevice, vkImage2DList);
VulkanImage2DList vkImage2DList2(
num2DImages, vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
for (size_t bIdx = 0; bIdx < num2DImages; bIdx++)
{
if (non_dedicated)
{
vkNonDedicatedImage2DListDeviceMemory2
.push_back(new VulkanDeviceMemory(
vkDevice, totalImageMemSize,
memoryType,
vkExternalMemoryHandleType));
}
else
{
vkNonDedicatedImage2DListDeviceMemory2
.push_back(new VulkanDeviceMemory(
vkDevice,
vkNonDedicatedImage2DList2[bIdx],
memoryType,
vkExternalMemoryHandleType));
}
vkNonDedicatedImage2DListDeviceMemory2[bIdx]
->bindImage(
vkNonDedicatedImage2DList2[bIdx], 0);
nonDedicatedExternalMemory2.push_back(
vkImage2DListDeviceMemory2.push_back(
new VulkanDeviceMemory(
vkDevice, vkImage2DList2[bIdx],
memoryType,
vkExternalMemoryHandleType));
vkImage2DListDeviceMemory2[bIdx]->bindImage(
vkImage2DList2[bIdx], 0);
externalMemory2.push_back(
new clExternalMemoryImage(
*vkNonDedicatedImage2DListDeviceMemory2
[bIdx],
*vkImage2DListDeviceMemory2[bIdx],
vkExternalMemoryHandleType, context,
totalImageMemSize, width, height, 0,
vkNonDedicatedImage2DList2[bIdx],
deviceId));
vkImage2DList2[bIdx], deviceId));
}
VulkanImageViewList vkDedicatedImage2DViewList(
vkDevice, vkNonDedicatedImage2DList2);
cl_mem external_mem_image1[5];
cl_mem external_mem_image2[5];
for (int i = 0; i < num2DImages; i++)
{
external_mem_image1[i] =
nonDedicatedExternalMemory1[i]
externalMemory1[i]
->getExternalMemoryImage();
external_mem_image2[i] =
nonDedicatedExternalMemory2[i]
externalMemory2[i]
->getExternalMemoryImage();
}
VulkanImage2DList &vkImage2DList =
vkNonDedicatedImage2DList;
VulkanImageViewList &vkImage2DViewList =
vkNonDedicatedImage2DViewList;
clCl2VkExternalSemaphore->signal(cmd_queue1);
if (!useSingleImageKernel)
{
for (size_t i2DIdx = 0;
i2DIdx < vkImage2DList.size(); i2DIdx++)
{
for (uint32_t mipLevel = 0;
mipLevel < numMipLevels; mipLevel++)
{
uint32_t i2DvIdx =
(uint32_t)(i2DIdx * numMipLevels)
+ mipLevel;
vkDescriptorSet.update(
1 + i2DvIdx,
vkImage2DViewList[i2DvIdx]);
}
}
vkDescriptorSet.updateArray(1,
vkImage2DViewList);
vkCopyCommandBuffer.begin();
vkCopyCommandBuffer.pipelineBarrier(
vkImage2DList,
@@ -743,29 +708,25 @@ int run_test_with_two_queue(cl_context &context, cl_command_queue &cmd_queue1,
}
for (int i = 0; i < num2DImages; i++)
{
delete vkNonDedicatedImage2DListDeviceMemory1
[i];
delete vkNonDedicatedImage2DListDeviceMemory2
[i];
delete nonDedicatedExternalMemory1[i];
delete nonDedicatedExternalMemory2[i];
delete vkImage2DListDeviceMemory1[i];
delete vkImage2DListDeviceMemory2[i];
delete externalMemory1[i];
delete externalMemory2[i];
}
vkNonDedicatedImage2DListDeviceMemory1.erase(
vkNonDedicatedImage2DListDeviceMemory1.begin(),
vkNonDedicatedImage2DListDeviceMemory1.begin()
vkImage2DListDeviceMemory1.erase(
vkImage2DListDeviceMemory1.begin(),
vkImage2DListDeviceMemory1.begin()
+ num2DImages);
vkNonDedicatedImage2DListDeviceMemory2.erase(
vkNonDedicatedImage2DListDeviceMemory2.begin(),
vkNonDedicatedImage2DListDeviceMemory2.begin()
+ num2DImages);
nonDedicatedExternalMemory1.erase(
nonDedicatedExternalMemory1.begin(),
nonDedicatedExternalMemory1.begin()
+ num2DImages);
nonDedicatedExternalMemory2.erase(
nonDedicatedExternalMemory2.begin(),
nonDedicatedExternalMemory2.begin()
vkImage2DListDeviceMemory2.erase(
vkImage2DListDeviceMemory2.begin(),
vkImage2DListDeviceMemory2.begin()
+ num2DImages);
externalMemory1.erase(externalMemory1.begin(),
externalMemory1.begin()
+ num2DImages);
externalMemory2.erase(externalMemory2.begin(),
externalMemory2.begin()
+ num2DImages);
if (CL_SUCCESS != err)
{
goto CLEANUP;
@@ -822,9 +783,11 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
srcBufferPtr = (char *)malloc(maxImage2DSize);
dstBufferPtr = (char *)malloc(maxImage2DSize);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList(
VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1,
VULKAN_DESCRIPTOR_TYPE_STORAGE_IMAGE, MAX_2D_IMAGE_DESCRIPTORS);
VulkanDescriptorSetLayoutBindingList vkDescriptorSetLayoutBindingList;
vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_IMAGE, MAX_2D_IMAGE_DESCRIPTORS);
VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
@@ -851,10 +814,10 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
clCl2VkExternalSemaphore = new clExternalSemaphore(
vkCl2VkSemaphore, context, vkExternalSemaphoreHandleType, deviceId);
std::vector<VulkanDeviceMemory *> vkNonDedicatedImage2DListDeviceMemory1;
std::vector<VulkanDeviceMemory *> vkNonDedicatedImage2DListDeviceMemory2;
std::vector<clExternalMemoryImage *> nonDedicatedExternalMemory1;
std::vector<clExternalMemoryImage *> nonDedicatedExternalMemory2;
std::vector<VulkanDeviceMemory *> vkImage2DListDeviceMemory1;
std::vector<VulkanDeviceMemory *> vkImage2DListDeviceMemory2;
std::vector<clExternalMemoryImage *> externalMemory1;
std::vector<clExternalMemoryImage *> externalMemory2;
std::vector<char> vkImage2DShader;
for (size_t fIdx = 0; fIdx < vkFormatList.size(); fIdx++)
@@ -957,9 +920,18 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
// Skip running for WIN32 NT handle.
continue;
}
VulkanImageTiling vulkanImageTiling =
vkClExternalMemoryHandleTilingAssumption(
deviceId,
vkExternalMemoryHandleTypeList[emhtIdx], &err);
ASSERT_SUCCESS(err,
"Failed to query OpenCL tiling mode");
VulkanImage2D vkDummyImage2D(
vkDevice, vkFormatList[0], widthList[0],
heightList[0], 1, vkExternalMemoryHandleType);
heightList[0], vulkanImageTiling, 1,
vkExternalMemoryHandleType);
const VulkanMemoryTypeList &memoryTypeList =
vkDummyImage2D.getMemoryTypeList();
@@ -985,98 +957,78 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
{
VulkanImage2D vkImage2D(
vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
ASSERT_LEQ(vkImage2D.getSize(), maxImage2DSize);
totalImageMemSize =
ROUND_UP(vkImage2D.getSize(),
vkImage2D.getAlignment());
}
VulkanImage2DList vkNonDedicatedImage2DList(
VulkanImage2DList vkImage2DList(
num2DImages, vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
for (size_t bIdx = 0;
bIdx < vkNonDedicatedImage2DList.size();
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
for (size_t bIdx = 0; bIdx < vkImage2DList.size();
bIdx++)
{
// Create list of Vulkan device memories and
// bind the list of Vulkan images.
vkNonDedicatedImage2DListDeviceMemory1
.push_back(new VulkanDeviceMemory(
vkDevice, totalImageMemSize, memoryType,
vkImage2DListDeviceMemory1.push_back(
new VulkanDeviceMemory(
vkDevice, vkImage2DList[bIdx],
memoryType,
vkExternalMemoryHandleType));
vkNonDedicatedImage2DListDeviceMemory1[bIdx]
->bindImage(vkNonDedicatedImage2DList[bIdx],
0);
nonDedicatedExternalMemory1.push_back(
vkImage2DListDeviceMemory1[bIdx]->bindImage(
vkImage2DList[bIdx], 0);
externalMemory1.push_back(
new clExternalMemoryImage(
*vkNonDedicatedImage2DListDeviceMemory1
[bIdx],
*vkImage2DListDeviceMemory1[bIdx],
vkExternalMemoryHandleType, context,
totalImageMemSize, width, height, 0,
vkNonDedicatedImage2DList[bIdx],
deviceId));
vkImage2DList[bIdx], deviceId));
}
VulkanImageViewList vkNonDedicatedImage2DViewList(
vkDevice, vkNonDedicatedImage2DList);
VulkanImageViewList vkImage2DViewList(
vkDevice, vkImage2DList);
VulkanImage2DList vkNonDedicatedImage2DList2(
VulkanImage2DList vkImage2DList2(
num2DImages, vkDevice, vkFormat, width, height,
numMipLevels, vkExternalMemoryHandleType);
for (size_t bIdx = 0;
bIdx < vkNonDedicatedImage2DList2.size();
vulkanImageTiling, numMipLevels,
vkExternalMemoryHandleType);
for (size_t bIdx = 0; bIdx < vkImage2DList2.size();
bIdx++)
{
vkNonDedicatedImage2DListDeviceMemory2
.push_back(new VulkanDeviceMemory(
vkDevice, totalImageMemSize, memoryType,
vkImage2DListDeviceMemory2.push_back(
new VulkanDeviceMemory(
vkDevice, vkImage2DList2[bIdx],
memoryType,
vkExternalMemoryHandleType));
vkNonDedicatedImage2DListDeviceMemory2[bIdx]
->bindImage(
vkNonDedicatedImage2DList2[bIdx], 0);
nonDedicatedExternalMemory2.push_back(
vkImage2DListDeviceMemory2[bIdx]->bindImage(
vkImage2DList2[bIdx], 0);
externalMemory2.push_back(
new clExternalMemoryImage(
*vkNonDedicatedImage2DListDeviceMemory2
[bIdx],
*vkImage2DListDeviceMemory2[bIdx],
vkExternalMemoryHandleType, context,
totalImageMemSize, width, height, 0,
vkNonDedicatedImage2DList2[bIdx],
deviceId));
vkImage2DList2[bIdx], deviceId));
}
VulkanImageViewList vkDedicatedImage2DViewList(
vkDevice, vkNonDedicatedImage2DList2);
cl_mem external_mem_image1[4];
cl_mem external_mem_image2[4];
for (int i = 0; i < num2DImages; i++)
{
external_mem_image1[i] =
nonDedicatedExternalMemory1[i]
externalMemory1[i]
->getExternalMemoryImage();
external_mem_image2[i] =
nonDedicatedExternalMemory2[i]
externalMemory2[i]
->getExternalMemoryImage();
}
VulkanImage2DList &vkImage2DList =
vkNonDedicatedImage2DList;
VulkanImageViewList &vkImage2DViewList =
vkNonDedicatedImage2DViewList;
clCl2VkExternalSemaphore->signal(cmd_queue1);
if (!useSingleImageKernel)
{
for (size_t i2DIdx = 0;
i2DIdx < vkImage2DList.size(); i2DIdx++)
{
for (uint32_t mipLevel = 0;
mipLevel < numMipLevels; mipLevel++)
{
uint32_t i2DvIdx =
(uint32_t)(i2DIdx * numMipLevels)
+ mipLevel;
vkDescriptorSet.update(
1 + i2DvIdx,
vkImage2DViewList[i2DvIdx]);
}
}
vkDescriptorSet.updateArray(1,
vkImage2DViewList);
vkCopyCommandBuffer.begin();
vkCopyCommandBuffer.pipelineBarrier(
vkImage2DList,
@@ -1275,29 +1227,25 @@ int run_test_with_one_queue(cl_context &context, cl_command_queue &cmd_queue1,
}
for (int i = 0; i < num2DImages; i++)
{
delete vkNonDedicatedImage2DListDeviceMemory1
[i];
delete vkNonDedicatedImage2DListDeviceMemory2
[i];
delete nonDedicatedExternalMemory1[i];
delete nonDedicatedExternalMemory2[i];
delete vkImage2DListDeviceMemory1[i];
delete vkImage2DListDeviceMemory2[i];
delete externalMemory1[i];
delete externalMemory2[i];
}
vkNonDedicatedImage2DListDeviceMemory1.erase(
vkNonDedicatedImage2DListDeviceMemory1.begin(),
vkNonDedicatedImage2DListDeviceMemory1.begin()
vkImage2DListDeviceMemory1.erase(
vkImage2DListDeviceMemory1.begin(),
vkImage2DListDeviceMemory1.begin()
+ num2DImages);
vkNonDedicatedImage2DListDeviceMemory2.erase(
vkNonDedicatedImage2DListDeviceMemory2.begin(),
vkNonDedicatedImage2DListDeviceMemory2.begin()
+ num2DImages);
nonDedicatedExternalMemory1.erase(
nonDedicatedExternalMemory1.begin(),
nonDedicatedExternalMemory1.begin()
+ num2DImages);
nonDedicatedExternalMemory2.erase(
nonDedicatedExternalMemory2.begin(),
nonDedicatedExternalMemory2.begin()
vkImage2DListDeviceMemory2.erase(
vkImage2DListDeviceMemory2.begin(),
vkImage2DListDeviceMemory2.begin()
+ num2DImages);
externalMemory1.erase(externalMemory1.begin(),
externalMemory1.begin()
+ num2DImages);
externalMemory2.erase(externalMemory2.begin(),
externalMemory2.begin()
+ num2DImages);
if (CL_SUCCESS != err)
{
goto CLEANUP;

View File

@@ -45,6 +45,5 @@ extern bool useDeviceLocal;
extern bool disableNTHandleType;
// Enable offset for multiImport of vulkan device memory
extern bool enableOffset;
extern bool non_dedicated;
#endif // _vulkan_interop_common_hpp_