• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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