bool validateImage (ProtectedContext& ctx,
const std::vector<YCbCrValidationData>& refData,
const vk::VkSampler sampler,
- const vk::VkImageView imageView)
+ const vk::VkImageView imageView,
+ const deUint32 combinedSamplerDescriptorCount)
{
{
tcu::TestLog& log (ctx.getTestContext().getLog());
.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT)
.build(vk, device));
const vk::Unique<vk::VkDescriptorPool> descriptorPool(vk::DescriptorPoolBuilder()
- .addType(vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u)
+ .addType(vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, combinedSamplerDescriptorCount)
.addType(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u)
.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u)
.build(vk, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
const vk::VkImage colorImage,
const vk::VkImageView colorImageView,
const std::vector<YCbCrValidationData>& referenceData,
- const std::vector<tcu::Vec2>& posCoords)
+ const std::vector<tcu::Vec2>& posCoords,
+ const deUint32 combinedSamplerDescriptorCount)
{
const vk::DeviceInterface& vk = ctx.getDeviceInterface();
const vk::VkDevice device = ctx.getDevice();
.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, vk::VK_SHADER_STAGE_ALL)
.build(vk, device));
const vk::Unique<vk::VkDescriptorPool> descriptorPool (vk::DescriptorPoolBuilder()
- .addType(vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u)
+ .addType(vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, combinedSamplerDescriptorCount)
.addType(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u)
.build(vk, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
const vk::Unique<vk::VkDescriptorSet> descriptorSet (makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
*conversion));
const vk::Unique<vk::VkImageView> ycbcrImageView (createImageView(vk, device, **ycbcrImage, config.format, *conversion));
+ deUint32 combinedSamplerDescriptorCount = 1;
+ {
+ const vk::VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // sType
+ DE_NULL, // pNext
+ config.format, // format
+ vk::VK_IMAGE_TYPE_2D, // type
+ vk::VK_IMAGE_TILING_OPTIMAL, // tiling
+ vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ vk::VK_IMAGE_USAGE_SAMPLED_BIT, // usage
+ ycbcrImageFlags // flags
+ };
+
+ vk::VkSamplerYcbcrConversionImageFormatProperties samplerYcbcrConversionImage = {};
+ samplerYcbcrConversionImage.sType = vk::VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES;
+ samplerYcbcrConversionImage.pNext = DE_NULL;
+
+ vk::VkImageFormatProperties2 imageFormatProperties = {};
+ imageFormatProperties.sType = vk::VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ imageFormatProperties.pNext = &samplerYcbcrConversionImage;
+
+ VK_CHECK(context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &imageFormatProperties));
+ combinedSamplerDescriptorCount = samplerYcbcrConversionImage.combinedImageSamplerDescriptorCount;
+ }
// Input attributes
std::vector<tcu::Vec2> texCoords;
const vk::Unique<vk::VkImageView> colorImageView (createImageView(ctx, **colorImage, s_colorFormat));
const vk::Unique<vk::VkSampler> colorSampler (makeSampler(vk, device));
- renderYCbCrToColor(ctx, size, *ycbcrSampler, *ycbcrImageView, **colorImage, *colorImageView, referenceData, posCoords);
+ renderYCbCrToColor(ctx, size, *ycbcrSampler, *ycbcrImageView, **colorImage, *colorImageView, referenceData, posCoords, combinedSamplerDescriptorCount);
- if (!validateImage(ctx, colorReferenceData, *colorSampler, *colorImageView))
+ if (!validateImage(ctx, colorReferenceData, *colorSampler, *colorImageView, combinedSamplerDescriptorCount))
return tcu::TestStatus::fail("YCbCr image conversion via fragment shader failed");
}
else if (config.shaderType == glu::SHADERTYPE_COMPUTE)
{
- if (!validateImage(ctx, referenceData, *ycbcrSampler, *ycbcrImageView))
+ if (!validateImage(ctx, referenceData, *ycbcrSampler, *ycbcrImageView, combinedSamplerDescriptorCount))
return tcu::TestStatus::fail("YCbCr image conversion via compute shader failed");
}
else
return createDescriptorSetLayout(vkd, device, &layoutInfo);
}
-Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device)
+Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device, const deUint32 combinedSamplerDescriptorCount)
{
const VkDescriptorPoolSize poolSizes[] =
{
- { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u },
+ { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, combinedSamplerDescriptorCount },
};
const VkDescriptorPoolCreateInfo poolInfo =
{
VK_FALSE, // unnormalizedCoords
};
- const Unique<VkSampler> sampler (createSampler(vkd, device, &samplerInfo));
-
- const Unique<VkDescriptorSetLayout> descLayout (createDescriptorSetLayout(vkd, device, *sampler));
- const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device));
- const Unique<VkDescriptorSet> descSet (createDescriptorSet(vkd, device, *descPool, *descLayout, *imageView));
-
- MultiPlaneImageData imageData (format, size);
-
const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
params.format,
VK_IMAGE_TYPE_2D,
params.tiling,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
params.flags,
};
- VkSamplerYcbcrConversionImageFormatProperties ycbcrProperties =
+ VkSamplerYcbcrConversionImageFormatProperties ycbcrProperties =
{
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,
DE_NULL,
0,
};
- VkImageFormatProperties2 extProperties =
+ VkImageFormatProperties2 extProperties =
{
VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
&ycbcrProperties,
0u, // maxResourceSize
},
};
- VkResult propsResult;
+ VkResult propsResult;
const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
const InstanceDriver& vki (instance.getDriver());
TCU_CHECK(propsResult == VK_SUCCESS);
TCU_CHECK(ycbcrProperties.combinedImageSamplerDescriptorCount >= 1);
+ const Unique<VkSampler> sampler (createSampler(vkd, device, &samplerInfo));
+
+ const Unique<VkDescriptorSetLayout> descLayout (createDescriptorSetLayout(vkd, device, *sampler));
+ const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device, ycbcrProperties.combinedImageSamplerDescriptorCount));
+ const Unique<VkDescriptorSet> descSet (createDescriptorSet(vkd, device, *descPool, *descLayout, *imageView));
+
+ MultiPlaneImageData imageData (format, size);
+
// Zero fill unused layer
if (params.useArrayLayers)
{
return createDescriptorSetLayout(vkd, device, &layoutInfo);
}
-Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device)
+Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device, const deUint32 combinedSamplerDescriptorCount)
{
const VkDescriptorPoolSize poolSizes[] =
{
- { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u },
+ { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, combinedSamplerDescriptorCount },
};
const VkDescriptorPoolCreateInfo poolInfo =
{
tcu::TestStatus testImageQuery (Context& context, TestParameters params)
{
const bool isYCbCrImage = isYCbCrFormat(params.format);
+ const InstanceInterface& vk = context.getInstanceInterface();
const DeviceInterface& vkd = context.getDeviceInterface();
const VkDevice device = context.getDevice();
VK_FALSE, // unnormalizedCoords
};
+ deUint32 combinedSamplerDescriptorCount = 1;
+ {
+ const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // sType
+ DE_NULL, // pNext
+ params.format, // format
+ VK_IMAGE_TYPE_2D, // type
+ VK_IMAGE_TILING_OPTIMAL, // tiling
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_SAMPLED_BIT, // usage
+ params.flags // flags
+ };
+
+ VkSamplerYcbcrConversionImageFormatProperties samplerYcbcrConversionImage = {};
+ samplerYcbcrConversionImage.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES;
+ samplerYcbcrConversionImage.pNext = DE_NULL;
+
+ VkImageFormatProperties2 imageFormatProperties = {};
+ imageFormatProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ imageFormatProperties.pNext = &samplerYcbcrConversionImage;
+
+ VK_CHECK(vk.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &imageFormatProperties));
+ combinedSamplerDescriptorCount = samplerYcbcrConversionImage.combinedImageSamplerDescriptorCount;
+ }
+
const Unique<VkSampler> sampler (createSampler(vkd, device, &samplerInfo));
const Unique<VkDescriptorSetLayout> descLayout (createDescriptorSetLayout(vkd, device, *sampler));
- const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device));
+ const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device, combinedSamplerDescriptorCount));
const Unique<VkDescriptorSet> descSet (createDescriptorSet(vkd, device, *descPool, *descLayout));
vector<TestImageSp> testImages;
tcu::TestStatus testImageQueryLod (Context& context, TestParameters params)
{
const bool isYCbCrImage = isYCbCrFormat(params.format);
+ const InstanceInterface& vk = context.getInstanceInterface();
const DeviceInterface& vkd = context.getDeviceInterface();
const VkDevice device = context.getDevice();
VK_FALSE, // unnormalizedCoords
};
+ deUint32 combinedSamplerDescriptorCount = 1;
+ {
+ const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // sType;
+ DE_NULL, // pNext;
+ params.format, // format;
+ VK_IMAGE_TYPE_2D, // type;
+ VK_IMAGE_TILING_OPTIMAL, // tiling;
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_SAMPLED_BIT, // usage;
+ params.flags // flags;
+ };
+
+ VkSamplerYcbcrConversionImageFormatProperties samplerYcbcrConversionImage = {};
+ samplerYcbcrConversionImage.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES;
+ samplerYcbcrConversionImage.pNext = DE_NULL;
+
+ VkImageFormatProperties2 imageFormatProperties = {};
+ imageFormatProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ imageFormatProperties.pNext = &samplerYcbcrConversionImage;
+
+ VK_CHECK(vk.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &imageFormatProperties));
+ combinedSamplerDescriptorCount = samplerYcbcrConversionImage.combinedImageSamplerDescriptorCount;
+ }
+
const Unique<VkSampler> sampler (createSampler(vkd, device, &samplerInfo));
const Unique<VkDescriptorSetLayout> descLayout (createDescriptorSetLayout(vkd, device, *sampler));
- const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device));
+ const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device, combinedSamplerDescriptorCount));
const Unique<VkDescriptorSet> descSet (createDescriptorSet(vkd, device, *descPool, *descLayout));
vector<TestImageSp> testImages;
return createDescriptorSetLayout(vkd, device, &layoutInfo);
}
-Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device)
+Move<VkDescriptorPool> createDescriptorPool (const DeviceInterface& vkd, VkDevice device, const deUint32 combinedSamplerDescriptorCount)
{
const VkDescriptorPoolSize poolSizes[] =
{
- { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u },
+ { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u * combinedSamplerDescriptorCount },
};
const VkDescriptorPoolCreateInfo poolInfo =
{
deInt32Hash((deUint32)params.planeNdx) ^
deInt32Hash((deUint32)params.shaderType));
+ const InstanceInterface& vk = context.getInstanceInterface();
const DeviceInterface& vkd = context.getDeviceInterface();
const VkDevice device = context.getDevice();
VK_FALSE, // unnormalizedCoords
};
+ deUint32 combinedSamplerDescriptorCount = 1;
+ {
+ const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // sType;
+ DE_NULL, // pNext;
+ format, // format;
+ VK_IMAGE_TYPE_2D, // type;
+ VK_IMAGE_TILING_OPTIMAL, // tiling;
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_SAMPLED_BIT, // usage;
+ createFlags // flags;
+ };
+
+ VkSamplerYcbcrConversionImageFormatProperties samplerYcbcrConversionImage = {};
+ samplerYcbcrConversionImage.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES;
+ samplerYcbcrConversionImage.pNext = DE_NULL;
+
+ VkImageFormatProperties2 imageFormatProperties = {};
+ imageFormatProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ imageFormatProperties.pNext = &samplerYcbcrConversionImage;
+
+ VK_CHECK(vk.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &imageFormatProperties));
+ combinedSamplerDescriptorCount = samplerYcbcrConversionImage.combinedImageSamplerDescriptorCount;
+ }
+
const Unique<VkSampler> wholeSampler(createSampler(vkd, device, &wholeSamplerInfo));
const Unique<VkSampler> planeSampler(createSampler(vkd, device, &planeSamplerInfo));
const Unique<VkDescriptorSetLayout> descLayout (createDescriptorSetLayout(vkd, device, *wholeSampler));
- const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device));
+ const Unique<VkDescriptorPool> descPool (createDescriptorPool(vkd, device, combinedSamplerDescriptorCount));
const Unique<VkDescriptorSet> descSet (createDescriptorSet(vkd, device, *descPool, *descLayout, *planeView, *planeSampler, *wholeView, *wholeSampler));
MultiPlaneImageData imageData (format, size);