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
28 namespace vkt
29 {
30 namespace pipeline
31 {
32 using namespace vk;
33
makeImageCreateInfo(const tcu::IVec2 & size,const VkFormat format,const VkImageUsageFlags usage)34 VkImageCreateInfo makeImageCreateInfo(const tcu::IVec2 &size, const VkFormat format, const VkImageUsageFlags usage)
35 {
36 const VkImageCreateInfo imageInfo = {
37 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
38 nullptr, // const void* pNext;
39 (VkImageCreateFlags)0, // VkImageCreateFlags flags;
40 VK_IMAGE_TYPE_2D, // VkImageType imageType;
41 format, // VkFormat format;
42 makeExtent3D(size.x(), size.y(), 1), // VkExtent3D extent;
43 1u, // uint32_t mipLevels;
44 1u, // uint32_t arrayLayers;
45 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
46 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
47 usage, // VkImageUsageFlags usage;
48 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
49 0u, // uint32_t queueFamilyIndexCount;
50 nullptr, // const uint32_t* pQueueFamilyIndices;
51 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
52 };
53 return imageInfo;
54 }
55
requireFeatures(Context & context,const FeatureFlags flags)56 void requireFeatures(Context &context, const FeatureFlags flags)
57 {
58 if (flags & FEATURE_TESSELLATION_SHADER)
59 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
60
61 if (flags & FEATURE_GEOMETRY_SHADER)
62 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
63
64 if (flags & FEATURE_SHADER_FLOAT_64)
65 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_FLOAT64);
66
67 if (flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS)
68 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS);
69
70 if (flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS)
71 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
72
73 if (flags & FEATURE_SHADER_INT_64)
74 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_INT64);
75
76 if (flags & FEATURE_SHADER_INT_16)
77 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_INT16);
78
79 if (flags & (FEATURE_SHADER_FLOAT_16 | FEATURE_SHADER_INT_8))
80 {
81 const auto extraFeatures = context.getShaderFloat16Int8Features();
82
83 if ((flags & FEATURE_SHADER_INT_8) != 0u && !extraFeatures.shaderInt8)
84 TCU_THROW(NotSupportedError, "8-bit integers not supported in shaders");
85
86 if ((flags & FEATURE_SHADER_FLOAT_16) != 0u && !extraFeatures.shaderFloat16)
87 TCU_THROW(NotSupportedError, "16-bit floats not supported in shaders");
88 }
89
90 // Check needed storage features.
91 if (flags & (FEATURE_SHADER_INT_16 | FEATURE_SHADER_FLOAT_16))
92 {
93 const auto features = context.get16BitStorageFeatures();
94 if (!features.storageBuffer16BitAccess)
95 TCU_THROW(NotSupportedError, "16-bit access in storage buffers not supported");
96 }
97
98 if (flags & FEATURE_SHADER_INT_8)
99 {
100 const auto features = context.get8BitStorageFeatures();
101 if (!features.storageBuffer8BitAccess)
102 TCU_THROW(NotSupportedError, "8-bit access in storage buffers not supported");
103 }
104 }
105
106 } // namespace pipeline
107 } // namespace vkt
108