1/*------------------------------------------------------------------------ 2 * Vulkan Conformance Tests 3 * ------------------------ 4 * 5 * Copyright (c) 2016 The Khronos Group Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Pipeline specialization constants test utilities 22 *//*--------------------------------------------------------------------*/ 23 24#include "vktPipelineSpecConstantUtil.hpp" 25#include "vkTypeUtil.hpp" 26#include <vector> 27 28namespace vkt 29{ 30namespace pipeline 31{ 32using namespace vk; 33 34VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const VkFormat format, const VkImageUsageFlags usage) 35{ 36 const VkImageCreateInfo imageInfo = 37 { 38 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 39 DE_NULL, // const void* pNext; 40 (VkImageCreateFlags)0, // VkImageCreateFlags flags; 41 VK_IMAGE_TYPE_2D, // VkImageType imageType; 42 format, // VkFormat format; 43 makeExtent3D(size.x(), size.y(), 1), // VkExtent3D extent; 44 1u, // uint32_t mipLevels; 45 1u, // uint32_t arrayLayers; 46 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 47 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 48 usage, // VkImageUsageFlags usage; 49 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 50 0u, // uint32_t queueFamilyIndexCount; 51 DE_NULL, // const uint32_t* pQueueFamilyIndices; 52 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 53 }; 54 return imageInfo; 55} 56 57void requireFeatures (Context& context, const FeatureFlags flags) 58{ 59 if (flags & FEATURE_TESSELLATION_SHADER) 60 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER); 61 62 if (flags & FEATURE_GEOMETRY_SHADER) 63 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER); 64 65 if (flags & FEATURE_SHADER_FLOAT_64) 66 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_FLOAT64); 67 68 if (flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS) 69 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS); 70 71 if (flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS) 72 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS); 73 74 if (flags & FEATURE_SHADER_INT_64) 75 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_INT64); 76 77 if (flags & FEATURE_SHADER_INT_16) 78 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_INT16); 79 80 if (flags & (FEATURE_SHADER_FLOAT_16 | FEATURE_SHADER_INT_8)) 81 { 82 const auto extraFeatures = context.getShaderFloat16Int8Features(); 83 84 if ((flags & FEATURE_SHADER_INT_8) != 0u && !extraFeatures.shaderInt8) 85 TCU_THROW(NotSupportedError, "8-bit integers not supported in shaders"); 86 87 if ((flags & FEATURE_SHADER_FLOAT_16) != 0u && !extraFeatures.shaderFloat16) 88 TCU_THROW(NotSupportedError, "16-bit floats not supported in shaders"); 89 } 90 91 // Check needed storage features. 92 if (flags & (FEATURE_SHADER_INT_16 | FEATURE_SHADER_FLOAT_16)) 93 { 94 const auto features = context.get16BitStorageFeatures(); 95 if (!features.storageBuffer16BitAccess) 96 TCU_THROW(NotSupportedError, "16-bit access in storage buffers not supported"); 97 } 98 99 if (flags & FEATURE_SHADER_INT_8) 100 { 101 const auto features = context.get8BitStorageFeatures(); 102 if (!features.storageBuffer8BitAccess) 103 TCU_THROW(NotSupportedError, "8-bit access in storage buffers not supported"); 104 } 105} 106 107} // pipeline 108} // vkt 109