From 549732add51d3906362b924a946a015eef134df5 Mon Sep 17 00:00:00 2001 From: Pyry Haulos Date: Thu, 21 Jan 2016 11:04:23 -0800 Subject: [PATCH] Check for linear filtering support in pipeline.sampler tests Fixes #243 Change-Id: I294dc93afc6c7a46e9d29bcb63a549e4565103c9 --- .../pipeline/vktPipelineImageSamplingInstance.cpp | 6 ++++ .../vulkan/pipeline/vktPipelineImageUtil.cpp | 33 ++++++++++++++++++++++ .../vulkan/pipeline/vktPipelineImageUtil.hpp | 10 +++++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp index dbf142e..35f9167 100644 --- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp +++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp @@ -371,6 +371,12 @@ ImageSamplingInstance::ImageSamplingInstance (Context& context, if (!isSupportedSamplableFormat(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat)) throw tcu::NotSupportedError(std::string("Unsupported format for sampling: ") + getFormatName(imageFormat)); + if ((samplerParams.minFilter == VK_FILTER_LINEAR || + samplerParams.magFilter == VK_FILTER_LINEAR || + samplerParams.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR) && + !isLinearFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat, VK_IMAGE_TILING_OPTIMAL)) + throw tcu::NotSupportedError(std::string("Unsupported format for linear filtering: ") + getFormatName(imageFormat)); + // Create texture image, view and sampler { VkImageCreateFlags imageFlags = 0u; diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp index b873a29..b18b317 100644 --- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp +++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp @@ -113,6 +113,39 @@ bool isSupportedSamplableFormat (const InstanceInterface& instanceInterface, VkP return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0u; } +// \todo [2016-01-21 pyry] Update this to just rely on vkDefs.hpp once +// CTS has been updated to 1.0.2. +enum +{ + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000, +}; + +bool isLinearFilteringSupported (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, VkFormat format, VkImageTiling tiling) +{ + const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(vki, physicalDevice, format); + const VkFormatFeatureFlags formatFeatures = tiling == VK_IMAGE_TILING_LINEAR + ? formatProperties.linearTilingFeatures + : formatProperties.optimalTilingFeatures; + + switch (format) + { + case VK_FORMAT_R32_SFLOAT: + case VK_FORMAT_R32G32_SFLOAT: + case VK_FORMAT_R32G32B32_SFLOAT: + case VK_FORMAT_R32G32B32A32_SFLOAT: + case VK_FORMAT_R64_SFLOAT: + case VK_FORMAT_R64G64_SFLOAT: + case VK_FORMAT_R64G64B64_SFLOAT: + case VK_FORMAT_R64G64B64A64_SFLOAT: + return (formatFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) != 0; + + default: + // \todo [2016-01-21 pyry] Check for all formats once drivers have been updated to 1.0.2 + // and we have tests to verify format properties. + return true; + } +} + VkBorderColor getFormatBorderColor (BorderColor color, VkFormat format) { if (!isCompressedFormat(format) && (isIntFormat(format) || isUintFormat(format))) diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp index 3c2c24d..17af27a 100644 --- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp +++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp @@ -60,9 +60,13 @@ enum BorderColor BORDER_COLOR_COUNT }; -bool isSupportedSamplableFormat (const vk::InstanceInterface& instanceInterface, - vk::VkPhysicalDevice device, - vk::VkFormat format); +bool isSupportedSamplableFormat (const vk::InstanceInterface& instanceInterface, + vk::VkPhysicalDevice device, + vk::VkFormat format); +bool isLinearFilteringSupported (const vk::InstanceInterface& instanceInterface, + vk::VkPhysicalDevice device, + vk::VkFormat format, + vk::VkImageTiling tiling); vk::VkBorderColor getFormatBorderColor (BorderColor color, vk::VkFormat format); -- 2.7.4