Merge vk-gl-cts/vulkan-cts-1.0.2 into vk-gl-cts/vulkan-cts-1.0.2-confidential
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / spirv_assembly / vktSpvAsmUtils.cpp
1 /*-------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2017 Google 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 Utilities for Vulkan SPIR-V assembly tests
22  *//*--------------------------------------------------------------------*/
23
24 #include "vktSpvAsmUtils.hpp"
25
26 #include "deMemory.h"
27 #include "deSTLUtil.hpp"
28 #include "vkQueryUtil.hpp"
29 #include "vkRefUtil.hpp"
30
31 namespace vkt
32 {
33 namespace SpirVAssembly
34 {
35
36 using namespace vk;
37
38 namespace
39 {
40
41 VkPhysicalDeviceFeatures filterDefaultDeviceFeatures (const VkPhysicalDeviceFeatures& deviceFeatures)
42 {
43         VkPhysicalDeviceFeatures enabledDeviceFeatures = deviceFeatures;
44
45         // Disable robustness by default, as it has an impact on performance on some HW.
46         enabledDeviceFeatures.robustBufferAccess = false;
47
48         return enabledDeviceFeatures;
49 }
50
51 VkPhysicalDevice16BitStorageFeaturesKHR querySupported16BitStorageFeatures (const InstanceInterface& vki, VkPhysicalDevice device, const std::vector<std::string>& instanceExtensions)
52 {
53         VkPhysicalDevice16BitStorageFeaturesKHR extensionFeatures       =
54         {
55                 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,   // sType
56                 DE_NULL,                                                                                                                // pNext
57                 false,                                                                                                                  // storageUniformBufferBlock16
58                 false,                                                                                                                  // storageUniform16
59                 false,                                                                                                                  // storagePushConstant16
60                 false,                                                                                                                  // storageInputOutput16
61         };
62         VkPhysicalDeviceFeatures2KHR                    features;
63
64         deMemset(&features, 0, sizeof(features));
65         features.sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
66         features.pNext  = &extensionFeatures;
67
68         // Call the getter only if supported. Otherwise above "zero" defaults are used
69         if (de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2"))
70         {
71                 vki.getPhysicalDeviceFeatures2KHR(device, &features);
72         }
73
74         return extensionFeatures;
75 }
76
77 } // anonymous
78
79 bool is16BitStorageFeaturesSupported (const InstanceInterface& vki, VkPhysicalDevice device, const std::vector<std::string>& instanceExtensions, Extension16BitStorageFeatures toCheck)
80 {
81         VkPhysicalDevice16BitStorageFeaturesKHR extensionFeatures       = querySupported16BitStorageFeatures(vki, device, instanceExtensions);
82
83         if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK) != 0 && extensionFeatures.storageUniformBufferBlock16 == VK_FALSE)
84                 return false;
85
86         if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM) != 0 && extensionFeatures.storageUniform16 == VK_FALSE)
87                 return false;
88
89         if ((toCheck & EXT16BITSTORAGEFEATURES_PUSH_CONSTANT) != 0 && extensionFeatures.storagePushConstant16 == VK_FALSE)
90                 return false;
91
92         if ((toCheck & EXT16BITSTORAGEFEATURES_INPUT_OUTPUT) != 0 && extensionFeatures.storageInputOutput16 == VK_FALSE)
93                 return false;
94
95         return true;
96 }
97
98 Move<VkDevice> createDeviceWithExtensions (Context&                                                     context,
99                                                                                    const deUint32                                       queueFamilyIndex,
100                                                                                    const std::vector<std::string>&      supportedExtensions,
101                                                                                    const std::vector<std::string>&      requiredExtensions)
102 {
103         const InstanceInterface&                vki                                                             = context.getInstanceInterface();
104         const VkPhysicalDevice                  physicalDevice                                  = context.getPhysicalDevice();
105         std::vector<const char*>                extensions                                              (requiredExtensions.size());
106         bool                                                    requires16BitStorageExtension   = false;
107
108         for (deUint32 extNdx = 0; extNdx < requiredExtensions.size(); ++extNdx)
109         {
110                 const std::string&      ext = requiredExtensions[extNdx];
111
112                 // Check that all required extensions are supported first.
113                 if (!de::contains(supportedExtensions.begin(), supportedExtensions.end(), ext))
114                 {
115                         TCU_THROW(NotSupportedError, (std::string("Device extension not supported: ") + ext).c_str());
116                 }
117
118                 if (ext == "VK_KHR_16bit_storage")
119                 {
120                         requires16BitStorageExtension = true;
121                 }
122
123                 extensions[extNdx] = ext.c_str();
124         }
125
126         // For the 16bit storage extension, we have four features to test. Requesting all features supported.
127         // Note that we don't throw NotImplemented errors here if a specific feature is not supported;
128         // that should be done when actually trying to use that specific feature.
129         VkPhysicalDevice16BitStorageFeaturesKHR ext16BitStorageFeatures = querySupported16BitStorageFeatures(vki, physicalDevice, context.getInstanceExtensions());
130
131         const float                                             queuePriorities[]       = { 1.0f };
132         const VkDeviceQueueCreateInfo   queueInfos[]            =
133         {
134                 {
135                         VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
136                         DE_NULL,
137                         (VkDeviceQueueCreateFlags)0,
138                         queueFamilyIndex,
139                         DE_LENGTH_OF_ARRAY(queuePriorities),
140                         &queuePriorities[0]
141                 }
142         };
143         const VkPhysicalDeviceFeatures  features                        = filterDefaultDeviceFeatures(getPhysicalDeviceFeatures(vki, physicalDevice));
144         const VkDeviceCreateInfo                deviceParams            =
145         {
146                 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
147                 (requires16BitStorageExtension ? &ext16BitStorageFeatures : DE_NULL),
148                 (VkDeviceCreateFlags)0,
149                 DE_LENGTH_OF_ARRAY(queueInfos),
150                 &queueInfos[0],
151                 0u,
152                 DE_NULL,
153                 (deUint32)extensions.size(),
154                 extensions.empty() ? DE_NULL : &extensions[0],
155                 &features
156         };
157
158         return vk::createDevice(vki, physicalDevice, &deviceParams);
159 }
160
161 Allocator* createAllocator (const InstanceInterface& instanceInterface, const VkPhysicalDevice physicalDevice, const DeviceInterface& deviceInterface, const VkDevice device)
162 {
163         const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice);
164
165         // \todo [2015-07-24 jarkko] support allocator selection/configuration from command line (or compile time)
166         return new SimpleAllocator(deviceInterface, device, memoryProperties);
167 }
168
169 } // SpirVAssembly
170 } // vkt