if (deviceHasDedicated)
{
+ // Memory requirements cannot be queried without binding the image.
+ if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+ continue;
+
const vk::Unique<vk::VkImage> image (createExternalImage(*vkd, *device, queueFamilyIndex, externalType, format, 16u, 16u, tiling, createFlag, usageFlag));
const vk::VkMemoryDedicatedRequirements reqs (getMemoryDedicatedRequirements(*vkd, *device, *image));
const bool propertiesRequiresDedicated = (externalProperties.externalMemoryProperties.externalMemoryFeatures & vk::VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT) != 0;
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
const vk::DeviceDriver vkd (vkp, instance, *device);
- const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ const vk::VkImageUsageFlags usage = vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT | (config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? vk::VK_IMAGE_USAGE_SAMPLED_BIT : 0);
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
const deUint32 height = 64u;
checkImageSupport(vki, physicalDevice, config.externalType, 0u, usage, format, tiling, config.dedicated);
const vk::Unique<vk::VkImage> imageA (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA, config.externalType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memoryA (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, config.externalType, config.dedicated ? *imageA : (vk::VkImage)0));
NativeHandle handle;
{
const vk::Unique<vk::VkImage> imageB (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+ const deUint32 idx = config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? ~0u : exportedMemoryTypeIndex;
const vk::Unique<vk::VkDeviceMemory> memoryB (config.dedicated
- ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
- : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
+ ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, idx, handle)
+ : importMemory(vkd, *device, requirements, config.externalType, idx, handle));
VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
}
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
const vk::DeviceDriver vkd (vkp, instance, *device);
- const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ const vk::VkImageUsageFlags usage = vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT | (config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? vk::VK_IMAGE_USAGE_SAMPLED_BIT : 0);
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
const deUint32 height = 64u;
checkImageSupport(vki, physicalDevice, config.externalType, 0u, usage, format, tiling, config.dedicated);
const vk::Unique<vk::VkImage> imageA (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA, config.externalType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memoryA (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, config.externalType, config.dedicated ? *imageA : (vk::VkImage)0));
NativeHandle handle;
- getMemoryNative(vkd, *device, *memoryA, config.externalType, handle);
- VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
+ if (config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID && config.dedicated)
+ {
+ // AHB required the image memory to be bound first.
+ VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
+ getMemoryNative(vkd, *device, *memoryA, config.externalType, handle);
+ }
+ else
+ {
+ getMemoryNative(vkd, *device, *memoryA, config.externalType, handle);
+ VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
+ }
{
const vk::Unique<vk::VkImage> imageB (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+ const deUint32 idx = config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? ~0u : exportedMemoryTypeIndex;
const vk::Unique<vk::VkDeviceMemory> memoryB (config.dedicated
- ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
- : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
+ ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, idx, handle)
+ : importMemory(vkd, *device, requirements, config.externalType, idx, handle));
VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
}
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
const vk::DeviceDriver vkd (vkp, instance, *device);
- const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ const vk::VkImageUsageFlags usage = vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT | (config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? vk::VK_IMAGE_USAGE_SAMPLED_BIT : 0);
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
const deUint32 height = 64u;
checkImageSupport(vki, physicalDevice, config.externalType, 0u, usage, format, tiling, config.dedicated);
+ if (config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID && config.dedicated)
+ {
+ // AHB required the image memory to be bound first, which is not possible in this test.
+ TCU_THROW(NotSupportedError, "Unsupported for Android Hardware Buffer");
+ }
+
// \note Image is only allocated to get memory requirements
const vk::Unique<vk::VkImage> imageA (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *imageA, config.externalType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memoryA (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, config.externalType, config.dedicated ? *imageA : (vk::VkImage)0));
NativeHandle handle;
{
const vk::Unique<vk::VkImage> imageB (createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+ const deUint32 idx = config.externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID ? ~0u : exportedMemoryTypeIndex;
const vk::Unique<vk::VkDeviceMemory> memoryB (config.dedicated
- ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
- : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
+ ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, idx, handle)
+ : importMemory(vkd, *device, requirements, config.externalType, idx, handle));
VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
TestLog& log = context.getTestContext().getLog();
const vk::VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physicalDevice).limits;
- vk::VkPhysicalDeviceProtectedMemoryFeatures protectedFeatures;
- protectedFeatures.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
- protectedFeatures.pNext = DE_NULL;
- protectedFeatures.protectedMemory = VK_FALSE;
-
- vk::VkPhysicalDeviceFeatures2 deviceFeatures;
- deviceFeatures.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
- deviceFeatures.pNext = &protectedFeatures;
-
- vki.getPhysicalDeviceFeatures2(physicalDevice, &deviceFeatures);
-
const vk::VkImageUsageFlagBits framebufferUsageFlag = vk::isDepthStencilFormat(format) ? vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
: vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
{
vk::VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,
vk::VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,
- vk::VK_IMAGE_CREATE_PROTECTED_BIT,
vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,
};
const vk::VkImageTiling tilings[] =
const size_t bit = numOfUsageFlags + createFlagNdx;
if ((combo & (one << bit)) == 0)
continue;
- if (((createFlags[createFlagNdx] & vk::VK_IMAGE_CREATE_PROTECTED_BIT) == vk::VK_IMAGE_CREATE_PROTECTED_BIT ) &&
- (protectedFeatures.protectedMemory == VK_FALSE))
- continue;
createFlag |= createFlags[createFlagNdx];
requiredAhbUsage |= ahbApi->vkCreateToAhbUsage(createFlags[createFlagNdx]);
}
for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(sizes); i++)
{
const vk::Unique<vk::VkImage> image (createExternalImage(vkd, *device, queueFamilyIndex, externalMemoryType, format, sizes[i].width, sizes[i].height, tiling, createFlag, usage));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image, externalMemoryType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memory (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, externalMemoryType, *image));
NativeHandle handle;
if (properties.imageFormatProperties.maxMipLevels > 1u)
{
const vk::Unique<vk::VkImage> image (createExternalImage(vkd, *device, queueFamilyIndex, externalMemoryType, format, 64u, 64u, tiling, createFlag, usage, properties.imageFormatProperties.maxMipLevels));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image, externalMemoryType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memory (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, externalMemoryType, *image));
NativeHandle handle;
if ((properties.imageFormatProperties.maxArrayLayers > 1u) && enableMaxLayerTest)
{
const vk::Unique<vk::VkImage> image (createExternalImage(vkd, *device, queueFamilyIndex, externalMemoryType, format, 64u, 64u, tiling, createFlag, usage, 1u, properties.imageFormatProperties.maxArrayLayers));
- const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image));
+ const vk::VkMemoryRequirements requirements (getImageMemoryRequirements(vkd, *device, *image, externalMemoryType));
const deUint32 exportedMemoryTypeIndex (chooseMemoryType(requirements.memoryTypeBits));
const vk::Unique<vk::VkDeviceMemory> memory (allocateExportableMemory(vkd, *device, requirements.size, exportedMemoryTypeIndex, externalMemoryType, *image));
NativeHandle handle;